aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.eslintrc30
-rw-r--r--.vscode/settings.json4
-rw-r--r--package-lock.json1477
-rw-r--r--package.json8
-rw-r--r--src/actions/index.js4
-rw-r--r--src/api/server/ServerApi.js4
-rw-r--r--src/api/utils/auth.js5
-rw-r--r--src/components/auth/Import.js87
-rw-r--r--src/components/auth/Invite.js105
-rw-r--r--src/components/auth/Pricing.js1
-rw-r--r--src/components/auth/Welcome.js1
-rw-r--r--src/components/services/content/ServiceView.js8
-rw-r--r--src/components/services/content/Services.js1
-rw-r--r--src/components/services/content/WebviewCrashHandler.js1
-rw-r--r--src/components/settings/SettingsLayout.js37
-rw-r--r--src/components/settings/services/EditServiceForm.js15
-rw-r--r--src/components/settings/settings/EditSettingsForm.js9
-rw-r--r--src/components/settings/team/TeamDashboard.js1
-rw-r--r--src/components/ui/ImageUpload.js4
-rw-r--r--src/components/ui/InfoBar.js25
-rw-r--r--src/components/ui/Infobox.js33
-rw-r--r--src/components/ui/Input.js54
-rw-r--r--src/components/ui/Tabs/TabItem.js2
-rw-r--r--src/components/ui/Tabs/Tabs.js8
-rw-r--r--src/containers/settings/AccountScreen.js3
-rw-r--r--src/containers/settings/SettingsWindow.js1
-rw-r--r--src/containers/subscription/SubscriptionPopupScreen.js2
-rw-r--r--src/features/announcements/components/AnnouncementScreen.js1
-rw-r--r--src/features/announcements/index.js1
-rw-r--r--src/features/delayApp/index.js1
-rw-r--r--src/features/planSelection/components/PlanItem.js1
-rw-r--r--src/features/publishDebugInfo/Component.js1
-rw-r--r--src/features/serviceLimit/components/LimitReachedInfobox.js1
-rw-r--r--src/features/todos/components/TodosWebview.js51
-rw-r--r--src/features/trialStatusBar/containers/TrialStatusBarScreen.js20
-rw-r--r--src/features/workspaces/components/EditWorkspaceForm.js23
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js8
-rw-r--r--src/features/workspaces/containers/EditWorkspaceScreen.js4
-rw-r--r--src/features/workspaces/store.js47
-rw-r--r--src/i18n/apply-branding.js1
-rw-r--r--src/i18n/locales/defaultMessages.json166
-rw-r--r--src/i18n/locales/en-US.json4
-rw-r--r--src/i18n/messages/src/components/auth/Pricing.json52
-rw-r--r--src/i18n/messages/src/components/settings/SettingsLayout.json15
-rw-r--r--src/i18n/messages/src/components/ui/InfoBar.json15
-rw-r--r--src/i18n/messages/src/components/ui/Infobox.json15
-rw-r--r--src/i18n/messages/src/components/ui/Input.json15
-rw-r--r--src/i18n/messages/src/features/publishDebugInfo/Component.json28
-rw-r--r--src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json14
-rw-r--r--src/lib/Menu.js1
-rw-r--r--src/models/User.js1
-rw-r--r--src/stores/AppStore.js2
-rw-r--r--src/stores/FeaturesStore.js4
-rw-r--r--src/stores/ServicesStore.js1
-rw-r--r--src/theme/default/legacy.js1
-rw-r--r--src/webview/contextMenuBuilder.js2
-rw-r--r--src/webview/lib/RecipeWebview.js1
-rw-r--r--src/webview/screenshare.js39
58 files changed, 1404 insertions, 1062 deletions
diff --git a/.eslintrc b/.eslintrc
index 9983d6970..dc397ccd1 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -3,19 +3,29 @@
3 "extends": "eslint-config-airbnb", 3 "extends": "eslint-config-airbnb",
4 "plugins": ["jest"], 4 "plugins": ["jest"],
5 "rules": { 5 "rules": {
6 "arrow-parens": 0,
6 "consistent-return": 0, 7 "consistent-return": 0,
7 "no-param-reassign": 0, 8 "no-param-reassign": 0,
8 "import/extensions": 0, 9 "import/extensions": 0,
9 "import/no-extraneous-dependencies": 0, 10 "import/no-extraneous-dependencies": 0,
10 "import/no-unresolved": [2, { 11 "import/no-unresolved": [
11 "ignore": ["electron"] 12 2,
12 }], 13 {
14 "ignore": ["electron"]
15 }
16 ],
13 "import/prefer-default-export": 0, 17 "import/prefer-default-export": 0,
14 "linebreak-style": 0, 18 "linebreak-style": 0,
19 "react/static-property-placement": 0,
20 "react/state-in-constructor": 0,
21 "react/jsx-props-no-spreading": 0,
15 "react/prefer-stateless-function": 0, 22 "react/prefer-stateless-function": 0,
16 "react/jsx-filename-extension": [1, { 23 "react/jsx-filename-extension": [
17 "extensions": [".js", ".jsx"] 24 1,
18 }], 25 {
26 "extensions": [".js", ".jsx"]
27 }
28 ],
19 "react/forbid-prop-types": 0, 29 "react/forbid-prop-types": 0,
20 "react/destructuring-assignment": 0, 30 "react/destructuring-assignment": 0,
21 "prefer-destructuring": 1, 31 "prefer-destructuring": 1,
@@ -32,13 +42,9 @@
32 "jsx-a11y/label-has-for": [ 42 "jsx-a11y/label-has-for": [
33 2, 43 2,
34 { 44 {
35 "components": [ 45 "components": ["Label"],
36 "Label"
37 ],
38 "required": { 46 "required": {
39 "every": [ 47 "every": ["id"]
40 "id"
41 ]
42 }, 48 },
43 "allowChildren": false 49 "allowChildren": false
44 } 50 }
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 000000000..313fc9aee
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,4 @@
1{
2 "prettier.singleQuote": true,
3 "js/ts.implicitProjectConfig.experimentalDecorators": true
4} \ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index afa6933b0..6eae814cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4102,6 +4102,56 @@
4102 } 4102 }
4103 } 4103 }
4104 }, 4104 },
4105 "@eslint/eslintrc": {
4106 "version": "0.4.2",
4107 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz",
4108 "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==",
4109 "dev": true,
4110 "requires": {
4111 "ajv": "^6.12.4",
4112 "debug": "^4.1.1",
4113 "espree": "^7.3.0",
4114 "globals": "^13.9.0",
4115 "ignore": "^4.0.6",
4116 "import-fresh": "^3.2.1",
4117 "js-yaml": "^3.13.1",
4118 "minimatch": "^3.0.4",
4119 "strip-json-comments": "^3.1.1"
4120 },
4121 "dependencies": {
4122 "globals": {
4123 "version": "13.9.0",
4124 "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
4125 "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
4126 "dev": true,
4127 "requires": {
4128 "type-fest": "^0.20.2"
4129 }
4130 },
4131 "js-yaml": {
4132 "version": "3.14.1",
4133 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
4134 "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
4135 "dev": true,
4136 "requires": {
4137 "argparse": "^1.0.7",
4138 "esprima": "^4.0.0"
4139 }
4140 },
4141 "strip-json-comments": {
4142 "version": "3.1.1",
4143 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
4144 "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
4145 "dev": true
4146 },
4147 "type-fest": {
4148 "version": "0.20.2",
4149 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
4150 "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
4151 "dev": true
4152 }
4153 }
4154 },
4105 "@fimbul/bifrost": { 4155 "@fimbul/bifrost": {
4106 "version": "0.21.0", 4156 "version": "0.21.0",
4107 "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz", 4157 "resolved": "https://registry.npmjs.org/@fimbul/bifrost/-/bifrost-0.21.0.tgz",
@@ -9053,34 +9103,124 @@
9053 "dev": true 9103 "dev": true
9054 }, 9104 },
9055 "@typescript-eslint/experimental-utils": { 9105 "@typescript-eslint/experimental-utils": {
9056 "version": "1.13.0", 9106 "version": "4.28.0",
9057 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz", 9107 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz",
9058 "integrity": "sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg==", 9108 "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==",
9059 "dev": true, 9109 "dev": true,
9060 "requires": { 9110 "requires": {
9061 "@types/json-schema": "^7.0.3", 9111 "@types/json-schema": "^7.0.7",
9062 "@typescript-eslint/typescript-estree": "1.13.0", 9112 "@typescript-eslint/scope-manager": "4.28.0",
9063 "eslint-scope": "^4.0.0" 9113 "@typescript-eslint/types": "4.28.0",
9114 "@typescript-eslint/typescript-estree": "4.28.0",
9115 "eslint-scope": "^5.1.1",
9116 "eslint-utils": "^3.0.0"
9117 },
9118 "dependencies": {
9119 "eslint-scope": {
9120 "version": "5.1.1",
9121 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
9122 "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
9123 "dev": true,
9124 "requires": {
9125 "esrecurse": "^4.3.0",
9126 "estraverse": "^4.1.1"
9127 }
9128 },
9129 "eslint-utils": {
9130 "version": "3.0.0",
9131 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
9132 "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
9133 "dev": true,
9134 "requires": {
9135 "eslint-visitor-keys": "^2.0.0"
9136 }
9137 },
9138 "esrecurse": {
9139 "version": "4.3.0",
9140 "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
9141 "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
9142 "dev": true,
9143 "requires": {
9144 "estraverse": "^5.2.0"
9145 },
9146 "dependencies": {
9147 "estraverse": {
9148 "version": "5.2.0",
9149 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
9150 "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
9151 "dev": true
9152 }
9153 }
9154 }
9064 } 9155 }
9065 }, 9156 },
9157 "@typescript-eslint/scope-manager": {
9158 "version": "4.28.0",
9159 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz",
9160 "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==",
9161 "dev": true,
9162 "requires": {
9163 "@typescript-eslint/types": "4.28.0",
9164 "@typescript-eslint/visitor-keys": "4.28.0"
9165 }
9166 },
9167 "@typescript-eslint/types": {
9168 "version": "4.28.0",
9169 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz",
9170 "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==",
9171 "dev": true
9172 },
9066 "@typescript-eslint/typescript-estree": { 9173 "@typescript-eslint/typescript-estree": {
9067 "version": "1.13.0", 9174 "version": "4.28.0",
9068 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-1.13.0.tgz", 9175 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz",
9069 "integrity": "sha512-b5rCmd2e6DCC6tCTN9GSUAuxdYwCM/k/2wdjHGrIRGPSJotWMCe/dGpi66u42bhuh8q3QBzqM4TMA1GUUCJvdw==", 9176 "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==",
9070 "dev": true, 9177 "dev": true,
9071 "requires": { 9178 "requires": {
9072 "lodash.unescape": "4.0.1", 9179 "@typescript-eslint/types": "4.28.0",
9073 "semver": "5.5.0" 9180 "@typescript-eslint/visitor-keys": "4.28.0",
9181 "debug": "^4.3.1",
9182 "globby": "^11.0.3",
9183 "is-glob": "^4.0.1",
9184 "semver": "^7.3.5",
9185 "tsutils": "^3.21.0"
9074 }, 9186 },
9075 "dependencies": { 9187 "dependencies": {
9076 "semver": { 9188 "debug": {
9077 "version": "5.5.0", 9189 "version": "4.3.1",
9078 "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 9190 "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
9079 "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", 9191 "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
9192 "dev": true,
9193 "requires": {
9194 "ms": "2.1.2"
9195 }
9196 },
9197 "ms": {
9198 "version": "2.1.2",
9199 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
9200 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
9080 "dev": true 9201 "dev": true
9202 },
9203 "tsutils": {
9204 "version": "3.21.0",
9205 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
9206 "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
9207 "dev": true,
9208 "requires": {
9209 "tslib": "^1.8.1"
9210 }
9081 } 9211 }
9082 } 9212 }
9083 }, 9213 },
9214 "@typescript-eslint/visitor-keys": {
9215 "version": "4.28.0",
9216 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz",
9217 "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==",
9218 "dev": true,
9219 "requires": {
9220 "@typescript-eslint/types": "4.28.0",
9221 "eslint-visitor-keys": "^2.0.0"
9222 }
9223 },
9084 "@ungap/promise-all-settled": { 9224 "@ungap/promise-all-settled": {
9085 "version": "1.1.2", 9225 "version": "1.1.2",
9086 "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 9226 "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
@@ -9316,9 +9456,9 @@
9316 } 9456 }
9317 }, 9457 },
9318 "acorn": { 9458 "acorn": {
9319 "version": "6.4.2", 9459 "version": "7.4.1",
9320 "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", 9460 "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
9321 "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", 9461 "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
9322 "dev": true 9462 "dev": true
9323 }, 9463 },
9324 "acorn-globals": { 9464 "acorn-globals": {
@@ -9940,12 +10080,6 @@
9940 "ansi-wrap": "0.1.0" 10080 "ansi-wrap": "0.1.0"
9941 } 10081 }
9942 }, 10082 },
9943 "ansi-escapes": {
9944 "version": "3.2.0",
9945 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
9946 "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
9947 "dev": true
9948 },
9949 "ansi-gray": { 10083 "ansi-gray": {
9950 "version": "0.1.1", 10084 "version": "0.1.1",
9951 "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", 10085 "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
@@ -10913,9 +11047,9 @@
10913 "dev": true 11047 "dev": true
10914 }, 11048 },
10915 "astral-regex": { 11049 "astral-regex": {
10916 "version": "1.0.0", 11050 "version": "2.0.0",
10917 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 11051 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
10918 "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 11052 "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
10919 "dev": true 11053 "dev": true
10920 }, 11054 },
10921 "async": { 11055 "async": {
@@ -12660,15 +12794,6 @@
12660 "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", 12794 "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
12661 "dev": true 12795 "dev": true
12662 }, 12796 },
12663 "cli-cursor": {
12664 "version": "2.1.0",
12665 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
12666 "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
12667 "dev": true,
12668 "requires": {
12669 "restore-cursor": "^2.0.0"
12670 }
12671 },
12672 "cli-spinners": { 12797 "cli-spinners": {
12673 "version": "2.6.0", 12798 "version": "2.6.0",
12674 "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz", 12799 "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
@@ -12713,12 +12838,6 @@
12713 } 12838 }
12714 } 12839 }
12715 }, 12840 },
12716 "cli-width": {
12717 "version": "2.2.1",
12718 "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
12719 "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
12720 "dev": true
12721 },
12722 "cliui": { 12841 "cliui": {
12723 "version": "4.1.0", 12842 "version": "4.1.0",
12724 "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 12843 "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
@@ -17035,49 +17154,231 @@
17035 } 17154 }
17036 }, 17155 },
17037 "eslint": { 17156 "eslint": {
17038 "version": "5.16.0", 17157 "version": "7.29.0",
17039 "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 17158 "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz",
17040 "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 17159 "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==",
17041 "dev": true, 17160 "dev": true,
17042 "requires": { 17161 "requires": {
17043 "@babel/code-frame": "^7.0.0", 17162 "@babel/code-frame": "7.12.11",
17044 "ajv": "^6.9.1", 17163 "@eslint/eslintrc": "^0.4.2",
17045 "chalk": "^2.1.0", 17164 "ajv": "^6.10.0",
17046 "cross-spawn": "^6.0.5", 17165 "chalk": "^4.0.0",
17166 "cross-spawn": "^7.0.2",
17047 "debug": "^4.0.1", 17167 "debug": "^4.0.1",
17048 "doctrine": "^3.0.0", 17168 "doctrine": "^3.0.0",
17049 "eslint-scope": "^4.0.3", 17169 "enquirer": "^2.3.5",
17050 "eslint-utils": "^1.3.1", 17170 "escape-string-regexp": "^4.0.0",
17051 "eslint-visitor-keys": "^1.0.0", 17171 "eslint-scope": "^5.1.1",
17052 "espree": "^5.0.1", 17172 "eslint-utils": "^2.1.0",
17053 "esquery": "^1.0.1", 17173 "eslint-visitor-keys": "^2.0.0",
17174 "espree": "^7.3.1",
17175 "esquery": "^1.4.0",
17054 "esutils": "^2.0.2", 17176 "esutils": "^2.0.2",
17055 "file-entry-cache": "^5.0.1", 17177 "fast-deep-equal": "^3.1.3",
17178 "file-entry-cache": "^6.0.1",
17056 "functional-red-black-tree": "^1.0.1", 17179 "functional-red-black-tree": "^1.0.1",
17057 "glob": "^7.1.2", 17180 "glob-parent": "^5.1.2",
17058 "globals": "^11.7.0", 17181 "globals": "^13.6.0",
17059 "ignore": "^4.0.6", 17182 "ignore": "^4.0.6",
17060 "import-fresh": "^3.0.0", 17183 "import-fresh": "^3.0.0",
17061 "imurmurhash": "^0.1.4", 17184 "imurmurhash": "^0.1.4",
17062 "inquirer": "^6.2.2", 17185 "is-glob": "^4.0.0",
17063 "js-yaml": "^3.13.0", 17186 "js-yaml": "^3.13.1",
17064 "json-stable-stringify-without-jsonify": "^1.0.1", 17187 "json-stable-stringify-without-jsonify": "^1.0.1",
17065 "levn": "^0.3.0", 17188 "levn": "^0.4.1",
17066 "lodash": "^4.17.11", 17189 "lodash.merge": "^4.6.2",
17067 "minimatch": "^3.0.4", 17190 "minimatch": "^3.0.4",
17068 "mkdirp": "^0.5.1",
17069 "natural-compare": "^1.4.0", 17191 "natural-compare": "^1.4.0",
17070 "optionator": "^0.8.2", 17192 "optionator": "^0.9.1",
17071 "path-is-inside": "^1.0.2",
17072 "progress": "^2.0.0", 17193 "progress": "^2.0.0",
17073 "regexpp": "^2.0.1", 17194 "regexpp": "^3.1.0",
17074 "semver": "^5.5.1", 17195 "semver": "^7.2.1",
17075 "strip-ansi": "^4.0.0", 17196 "strip-ansi": "^6.0.0",
17076 "strip-json-comments": "^2.0.1", 17197 "strip-json-comments": "^3.1.0",
17077 "table": "^5.2.3", 17198 "table": "^6.0.9",
17078 "text-table": "^0.2.0" 17199 "text-table": "^0.2.0",
17200 "v8-compile-cache": "^2.0.3"
17079 }, 17201 },
17080 "dependencies": { 17202 "dependencies": {
17203 "@babel/code-frame": {
17204 "version": "7.12.11",
17205 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
17206 "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
17207 "dev": true,
17208 "requires": {
17209 "@babel/highlight": "^7.10.4"
17210 }
17211 },
17212 "@babel/helper-validator-identifier": {
17213 "version": "7.14.5",
17214 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
17215 "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
17216 "dev": true
17217 },
17218 "@babel/highlight": {
17219 "version": "7.14.5",
17220 "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
17221 "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
17222 "dev": true,
17223 "requires": {
17224 "@babel/helper-validator-identifier": "^7.14.5",
17225 "chalk": "^2.0.0",
17226 "js-tokens": "^4.0.0"
17227 },
17228 "dependencies": {
17229 "chalk": {
17230 "version": "2.4.2",
17231 "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
17232 "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
17233 "dev": true,
17234 "requires": {
17235 "ansi-styles": "^3.2.1",
17236 "escape-string-regexp": "^1.0.5",
17237 "supports-color": "^5.3.0"
17238 }
17239 },
17240 "escape-string-regexp": {
17241 "version": "1.0.5",
17242 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
17243 "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
17244 "dev": true
17245 }
17246 }
17247 },
17248 "ansi-colors": {
17249 "version": "4.1.1",
17250 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
17251 "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
17252 "dev": true
17253 },
17254 "ansi-regex": {
17255 "version": "5.0.0",
17256 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
17257 "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
17258 "dev": true
17259 },
17260 "chalk": {
17261 "version": "4.1.1",
17262 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
17263 "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
17264 "dev": true,
17265 "requires": {
17266 "ansi-styles": "^4.1.0",
17267 "supports-color": "^7.1.0"
17268 },
17269 "dependencies": {
17270 "ansi-styles": {
17271 "version": "4.3.0",
17272 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
17273 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
17274 "dev": true,
17275 "requires": {
17276 "color-convert": "^2.0.1"
17277 }
17278 },
17279 "supports-color": {
17280 "version": "7.2.0",
17281 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
17282 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
17283 "dev": true,
17284 "requires": {
17285 "has-flag": "^4.0.0"
17286 }
17287 }
17288 }
17289 },
17290 "color-convert": {
17291 "version": "2.0.1",
17292 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
17293 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
17294 "dev": true,
17295 "requires": {
17296 "color-name": "~1.1.4"
17297 }
17298 },
17299 "color-name": {
17300 "version": "1.1.4",
17301 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
17302 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
17303 "dev": true
17304 },
17305 "cross-spawn": {
17306 "version": "7.0.3",
17307 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
17308 "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
17309 "dev": true,
17310 "requires": {
17311 "path-key": "^3.1.0",
17312 "shebang-command": "^2.0.0",
17313 "which": "^2.0.1"
17314 }
17315 },
17316 "enquirer": {
17317 "version": "2.3.6",
17318 "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
17319 "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
17320 "dev": true,
17321 "requires": {
17322 "ansi-colors": "^4.1.1"
17323 }
17324 },
17325 "escape-string-regexp": {
17326 "version": "4.0.0",
17327 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
17328 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
17329 "dev": true
17330 },
17331 "eslint-scope": {
17332 "version": "5.1.1",
17333 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
17334 "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
17335 "dev": true,
17336 "requires": {
17337 "esrecurse": "^4.3.0",
17338 "estraverse": "^4.1.1"
17339 }
17340 },
17341 "esrecurse": {
17342 "version": "4.3.0",
17343 "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
17344 "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
17345 "dev": true,
17346 "requires": {
17347 "estraverse": "^5.2.0"
17348 },
17349 "dependencies": {
17350 "estraverse": {
17351 "version": "5.2.0",
17352 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
17353 "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
17354 "dev": true
17355 }
17356 }
17357 },
17358 "glob-parent": {
17359 "version": "5.1.2",
17360 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
17361 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
17362 "dev": true,
17363 "requires": {
17364 "is-glob": "^4.0.1"
17365 }
17366 },
17367 "globals": {
17368 "version": "13.9.0",
17369 "resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
17370 "integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
17371 "dev": true,
17372 "requires": {
17373 "type-fest": "^0.20.2"
17374 }
17375 },
17376 "has-flag": {
17377 "version": "4.0.0",
17378 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
17379 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
17380 "dev": true
17381 },
17081 "js-yaml": { 17382 "js-yaml": {
17082 "version": "3.14.1", 17383 "version": "3.14.1",
17083 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 17384 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -17088,34 +17389,158 @@
17088 "esprima": "^4.0.0" 17389 "esprima": "^4.0.0"
17089 } 17390 }
17090 }, 17391 },
17091 "semver": { 17392 "levn": {
17092 "version": "5.7.1", 17393 "version": "0.4.1",
17093 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 17394 "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
17094 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 17395 "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
17396 "dev": true,
17397 "requires": {
17398 "prelude-ls": "^1.2.1",
17399 "type-check": "~0.4.0"
17400 }
17401 },
17402 "optionator": {
17403 "version": "0.9.1",
17404 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
17405 "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
17406 "dev": true,
17407 "requires": {
17408 "deep-is": "^0.1.3",
17409 "fast-levenshtein": "^2.0.6",
17410 "levn": "^0.4.1",
17411 "prelude-ls": "^1.2.1",
17412 "type-check": "^0.4.0",
17413 "word-wrap": "^1.2.3"
17414 }
17415 },
17416 "path-key": {
17417 "version": "3.1.1",
17418 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
17419 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
17420 "dev": true
17421 },
17422 "prelude-ls": {
17423 "version": "1.2.1",
17424 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
17425 "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
17426 "dev": true
17427 },
17428 "shebang-command": {
17429 "version": "2.0.0",
17430 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
17431 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
17432 "dev": true,
17433 "requires": {
17434 "shebang-regex": "^3.0.0"
17435 }
17436 },
17437 "shebang-regex": {
17438 "version": "3.0.0",
17439 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
17440 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
17095 "dev": true 17441 "dev": true
17442 },
17443 "strip-ansi": {
17444 "version": "6.0.0",
17445 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
17446 "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
17447 "dev": true,
17448 "requires": {
17449 "ansi-regex": "^5.0.0"
17450 }
17451 },
17452 "strip-json-comments": {
17453 "version": "3.1.1",
17454 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
17455 "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
17456 "dev": true
17457 },
17458 "type-check": {
17459 "version": "0.4.0",
17460 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
17461 "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
17462 "dev": true,
17463 "requires": {
17464 "prelude-ls": "^1.2.1"
17465 }
17466 },
17467 "type-fest": {
17468 "version": "0.20.2",
17469 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
17470 "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
17471 "dev": true
17472 },
17473 "which": {
17474 "version": "2.0.2",
17475 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
17476 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
17477 "dev": true,
17478 "requires": {
17479 "isexe": "^2.0.0"
17480 }
17096 } 17481 }
17097 } 17482 }
17098 }, 17483 },
17099 "eslint-config-airbnb": { 17484 "eslint-config-airbnb": {
17100 "version": "17.1.1", 17485 "version": "18.2.1",
17101 "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.1.tgz", 17486 "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.2.1.tgz",
17102 "integrity": "sha512-xCu//8a/aWqagKljt+1/qAM62BYZeNq04HmdevG5yUGWpja0I/xhqd6GdLRch5oetEGFiJAnvtGuTEAese53Qg==", 17487 "integrity": "sha512-glZNDEZ36VdlZWoxn/bUR1r/sdFKPd1mHPbqUtkctgNG4yT2DLLtJ3D+yCV+jzZCc2V1nBVkmdknOJBZ5Hc0fg==",
17103 "dev": true, 17488 "dev": true,
17104 "requires": { 17489 "requires": {
17105 "eslint-config-airbnb-base": "^13.2.0", 17490 "eslint-config-airbnb-base": "^14.2.1",
17106 "object.assign": "^4.1.0", 17491 "object.assign": "^4.1.2",
17107 "object.entries": "^1.1.0" 17492 "object.entries": "^1.1.2"
17493 },
17494 "dependencies": {
17495 "has-symbols": {
17496 "version": "1.0.2",
17497 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
17498 "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
17499 "dev": true
17500 },
17501 "object.assign": {
17502 "version": "4.1.2",
17503 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
17504 "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
17505 "dev": true,
17506 "requires": {
17507 "call-bind": "^1.0.0",
17508 "define-properties": "^1.1.3",
17509 "has-symbols": "^1.0.1",
17510 "object-keys": "^1.1.1"
17511 }
17512 }
17108 } 17513 }
17109 }, 17514 },
17110 "eslint-config-airbnb-base": { 17515 "eslint-config-airbnb-base": {
17111 "version": "13.2.0", 17516 "version": "14.2.1",
17112 "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.2.0.tgz", 17517 "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz",
17113 "integrity": "sha512-1mg/7eoB4AUeB0X1c/ho4vb2gYkNH8Trr/EgCT/aGmKhhG+F6vF5s8+iRBlWAzFIAphxIdp3YfEKgEl0f9Xg+w==", 17518 "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==",
17114 "dev": true, 17519 "dev": true,
17115 "requires": { 17520 "requires": {
17116 "confusing-browser-globals": "^1.0.5", 17521 "confusing-browser-globals": "^1.0.10",
17117 "object.assign": "^4.1.0", 17522 "object.assign": "^4.1.2",
17118 "object.entries": "^1.1.0" 17523 "object.entries": "^1.1.2"
17524 },
17525 "dependencies": {
17526 "has-symbols": {
17527 "version": "1.0.2",
17528 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
17529 "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
17530 "dev": true
17531 },
17532 "object.assign": {
17533 "version": "4.1.2",
17534 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
17535 "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
17536 "dev": true,
17537 "requires": {
17538 "call-bind": "^1.0.0",
17539 "define-properties": "^1.1.3",
17540 "has-symbols": "^1.0.1",
17541 "object-keys": "^1.1.1"
17542 }
17543 }
17119 } 17544 }
17120 }, 17545 },
17121 "eslint-import-resolver-node": { 17546 "eslint-import-resolver-node": {
@@ -17340,12 +17765,12 @@
17340 } 17765 }
17341 }, 17766 },
17342 "eslint-plugin-jest": { 17767 "eslint-plugin-jest": {
17343 "version": "22.21.0", 17768 "version": "24.3.6",
17344 "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.21.0.tgz", 17769 "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz",
17345 "integrity": "sha512-OaqnSS7uBgcGiqXUiEnjoqxPNKvR4JWG5mSRkzVoR6+vDwlqqp11beeql1hYs0HTbdhiwrxWLxbX0Vx7roG3Ew==", 17770 "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==",
17346 "dev": true, 17771 "dev": true,
17347 "requires": { 17772 "requires": {
17348 "@typescript-eslint/experimental-utils": "^1.13.0" 17773 "@typescript-eslint/experimental-utils": "^4.0.1"
17349 } 17774 }
17350 }, 17775 },
17351 "eslint-plugin-jsx-a11y": { 17776 "eslint-plugin-jsx-a11y": {
@@ -17442,18 +17867,26 @@
17442 } 17867 }
17443 }, 17868 },
17444 "eslint-utils": { 17869 "eslint-utils": {
17445 "version": "1.4.3", 17870 "version": "2.1.0",
17446 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 17871 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
17447 "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 17872 "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
17448 "dev": true, 17873 "dev": true,
17449 "requires": { 17874 "requires": {
17450 "eslint-visitor-keys": "^1.1.0" 17875 "eslint-visitor-keys": "^1.1.0"
17876 },
17877 "dependencies": {
17878 "eslint-visitor-keys": {
17879 "version": "1.3.0",
17880 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
17881 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
17882 "dev": true
17883 }
17451 } 17884 }
17452 }, 17885 },
17453 "eslint-visitor-keys": { 17886 "eslint-visitor-keys": {
17454 "version": "1.1.0", 17887 "version": "2.1.0",
17455 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 17888 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
17456 "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 17889 "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
17457 "dev": true 17890 "dev": true
17458 }, 17891 },
17459 "eslint-webpack-plugin": { 17892 "eslint-webpack-plugin": {
@@ -17571,14 +18004,22 @@
17571 } 18004 }
17572 }, 18005 },
17573 "espree": { 18006 "espree": {
17574 "version": "5.0.1", 18007 "version": "7.3.1",
17575 "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 18008 "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
17576 "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 18009 "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
17577 "dev": true, 18010 "dev": true,
17578 "requires": { 18011 "requires": {
17579 "acorn": "^6.0.7", 18012 "acorn": "^7.4.0",
17580 "acorn-jsx": "^5.0.0", 18013 "acorn-jsx": "^5.3.1",
17581 "eslint-visitor-keys": "^1.0.0" 18014 "eslint-visitor-keys": "^1.3.0"
18015 },
18016 "dependencies": {
18017 "eslint-visitor-keys": {
18018 "version": "1.3.0",
18019 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
18020 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
18021 "dev": true
18022 }
17582 } 18023 }
17583 }, 18024 },
17584 "esprima": { 18025 "esprima": {
@@ -18047,6 +18488,12 @@
18047 "time-stamp": "^1.0.0" 18488 "time-stamp": "^1.0.0"
18048 } 18489 }
18049 }, 18490 },
18491 "fast-deep-equal": {
18492 "version": "3.1.3",
18493 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
18494 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
18495 "dev": true
18496 },
18050 "fast-glob": { 18497 "fast-glob": {
18051 "version": "3.2.5", 18498 "version": "3.2.5",
18052 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", 18499 "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
@@ -18185,22 +18632,13 @@
18185 "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", 18632 "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
18186 "dev": true 18633 "dev": true
18187 }, 18634 },
18188 "figures": {
18189 "version": "2.0.0",
18190 "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
18191 "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
18192 "dev": true,
18193 "requires": {
18194 "escape-string-regexp": "^1.0.5"
18195 }
18196 },
18197 "file-entry-cache": { 18635 "file-entry-cache": {
18198 "version": "5.0.1", 18636 "version": "6.0.1",
18199 "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 18637 "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
18200 "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 18638 "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
18201 "dev": true, 18639 "dev": true,
18202 "requires": { 18640 "requires": {
18203 "flat-cache": "^2.0.1" 18641 "flat-cache": "^3.0.4"
18204 } 18642 }
18205 }, 18643 },
18206 "file-selector": { 18644 "file-selector": {
@@ -18373,20 +18811,30 @@
18373 "dev": true 18811 "dev": true
18374 }, 18812 },
18375 "flat-cache": { 18813 "flat-cache": {
18376 "version": "2.0.1", 18814 "version": "3.0.4",
18377 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 18815 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
18378 "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 18816 "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
18379 "dev": true, 18817 "dev": true,
18380 "requires": { 18818 "requires": {
18381 "flatted": "^2.0.0", 18819 "flatted": "^3.1.0",
18382 "rimraf": "2.6.3", 18820 "rimraf": "^3.0.2"
18383 "write": "1.0.3" 18821 },
18822 "dependencies": {
18823 "rimraf": {
18824 "version": "3.0.2",
18825 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
18826 "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
18827 "dev": true,
18828 "requires": {
18829 "glob": "^7.1.3"
18830 }
18831 }
18384 } 18832 }
18385 }, 18833 },
18386 "flatted": { 18834 "flatted": {
18387 "version": "2.0.2", 18835 "version": "3.1.1",
18388 "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", 18836 "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
18389 "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", 18837 "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
18390 "dev": true 18838 "dev": true
18391 }, 18839 },
18392 "flush-write-stream": { 18840 "flush-write-stream": {
@@ -22516,44 +22964,6 @@
22516 } 22964 }
22517 } 22965 }
22518 }, 22966 },
22519 "inquirer": {
22520 "version": "6.5.2",
22521 "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
22522 "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
22523 "dev": true,
22524 "requires": {
22525 "ansi-escapes": "^3.2.0",
22526 "chalk": "^2.4.2",
22527 "cli-cursor": "^2.1.0",
22528 "cli-width": "^2.0.0",
22529 "external-editor": "^3.0.3",
22530 "figures": "^2.0.0",
22531 "lodash": "^4.17.12",
22532 "mute-stream": "0.0.7",
22533 "run-async": "^2.2.0",
22534 "rxjs": "^6.4.0",
22535 "string-width": "^2.1.0",
22536 "strip-ansi": "^5.1.0",
22537 "through": "^2.3.6"
22538 },
22539 "dependencies": {
22540 "ansi-regex": {
22541 "version": "4.1.0",
22542 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
22543 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
22544 "dev": true
22545 },
22546 "strip-ansi": {
22547 "version": "5.2.0",
22548 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
22549 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
22550 "dev": true,
22551 "requires": {
22552 "ansi-regex": "^4.1.0"
22553 }
22554 }
22555 }
22556 },
22557 "internal-ip": { 22967 "internal-ip": {
22558 "version": "4.3.0", 22968 "version": "4.3.0",
22559 "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", 22969 "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
@@ -26215,6 +26625,12 @@
26215 "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 26625 "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
26216 "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 26626 "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
26217 }, 26627 },
26628 "lodash.clonedeep": {
26629 "version": "4.5.0",
26630 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
26631 "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
26632 "dev": true
26633 },
26218 "lodash.debounce": { 26634 "lodash.debounce": {
26219 "version": "4.0.8", 26635 "version": "4.0.8",
26220 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 26636 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -26273,6 +26689,12 @@
26273 "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", 26689 "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
26274 "dev": true 26690 "dev": true
26275 }, 26691 },
26692 "lodash.merge": {
26693 "version": "4.6.2",
26694 "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
26695 "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
26696 "dev": true
26697 },
26276 "lodash.once": { 26698 "lodash.once": {
26277 "version": "4.1.1", 26699 "version": "4.1.1",
26278 "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 26700 "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
@@ -26297,10 +26719,10 @@
26297 "lodash._reinterpolate": "^3.0.0" 26719 "lodash._reinterpolate": "^3.0.0"
26298 } 26720 }
26299 }, 26721 },
26300 "lodash.unescape": { 26722 "lodash.truncate": {
26301 "version": "4.0.1", 26723 "version": "4.4.2",
26302 "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz", 26724 "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
26303 "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=", 26725 "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
26304 "dev": true 26726 "dev": true
26305 }, 26727 },
26306 "log-ok": { 26728 "log-ok": {
@@ -28702,443 +29124,6 @@
28702 } 29124 }
28703 } 29125 }
28704 }, 29126 },
28705 "node-sass": {
28706 "version": "5.0.0",
28707 "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz",
28708 "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==",
28709 "dev": true,
28710 "requires": {
28711 "async-foreach": "^0.1.3",
28712 "chalk": "^1.1.1",
28713 "cross-spawn": "^7.0.3",
28714 "gaze": "^1.0.0",
28715 "get-stdin": "^4.0.1",
28716 "glob": "^7.0.3",
28717 "lodash": "^4.17.15",
28718 "meow": "^3.7.0",
28719 "mkdirp": "^0.5.1",
28720 "nan": "^2.13.2",
28721 "node-gyp": "^7.1.0",
28722 "npmlog": "^4.0.0",
28723 "request": "^2.88.0",
28724 "sass-graph": "2.2.5",
28725 "stdout-stream": "^1.4.0",
28726 "true-case-path": "^1.0.2"
28727 },
28728 "dependencies": {
28729 "ansi-regex": {
28730 "version": "2.1.1",
28731 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
28732 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
28733 "dev": true
28734 },
28735 "ansi-styles": {
28736 "version": "2.2.1",
28737 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
28738 "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
28739 "dev": true
28740 },
28741 "camelcase": {
28742 "version": "2.1.1",
28743 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
28744 "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
28745 "dev": true
28746 },
28747 "camelcase-keys": {
28748 "version": "2.1.0",
28749 "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
28750 "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
28751 "dev": true,
28752 "requires": {
28753 "camelcase": "^2.0.0",
28754 "map-obj": "^1.0.0"
28755 }
28756 },
28757 "chalk": {
28758 "version": "1.1.3",
28759 "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
28760 "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
28761 "dev": true,
28762 "requires": {
28763 "ansi-styles": "^2.2.1",
28764 "escape-string-regexp": "^1.0.2",
28765 "has-ansi": "^2.0.0",
28766 "strip-ansi": "^3.0.0",
28767 "supports-color": "^2.0.0"
28768 }
28769 },
28770 "chownr": {
28771 "version": "2.0.0",
28772 "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
28773 "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
28774 "dev": true
28775 },
28776 "cross-spawn": {
28777 "version": "7.0.3",
28778 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
28779 "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
28780 "dev": true,
28781 "requires": {
28782 "path-key": "^3.1.0",
28783 "shebang-command": "^2.0.0",
28784 "which": "^2.0.1"
28785 }
28786 },
28787 "find-up": {
28788 "version": "1.1.2",
28789 "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
28790 "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
28791 "dev": true,
28792 "requires": {
28793 "path-exists": "^2.0.0",
28794 "pinkie-promise": "^2.0.0"
28795 }
28796 },
28797 "fs-minipass": {
28798 "version": "2.1.0",
28799 "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
28800 "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
28801 "dev": true,
28802 "requires": {
28803 "minipass": "^3.0.0"
28804 }
28805 },
28806 "indent-string": {
28807 "version": "2.1.0",
28808 "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
28809 "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
28810 "dev": true,
28811 "requires": {
28812 "repeating": "^2.0.0"
28813 }
28814 },
28815 "load-json-file": {
28816 "version": "1.1.0",
28817 "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
28818 "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
28819 "dev": true,
28820 "requires": {
28821 "graceful-fs": "^4.1.2",
28822 "parse-json": "^2.2.0",
28823 "pify": "^2.0.0",
28824 "pinkie-promise": "^2.0.0",
28825 "strip-bom": "^2.0.0"
28826 }
28827 },
28828 "lru-cache": {
28829 "version": "6.0.0",
28830 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
28831 "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
28832 "dev": true,
28833 "requires": {
28834 "yallist": "^4.0.0"
28835 }
28836 },
28837 "map-obj": {
28838 "version": "1.0.1",
28839 "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
28840 "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
28841 "dev": true
28842 },
28843 "meow": {
28844 "version": "3.7.0",
28845 "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
28846 "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
28847 "dev": true,
28848 "requires": {
28849 "camelcase-keys": "^2.0.0",
28850 "decamelize": "^1.1.2",
28851 "loud-rejection": "^1.0.0",
28852 "map-obj": "^1.0.1",
28853 "minimist": "^1.1.3",
28854 "normalize-package-data": "^2.3.4",
28855 "object-assign": "^4.0.1",
28856 "read-pkg-up": "^1.0.1",
28857 "redent": "^1.0.0",
28858 "trim-newlines": "^1.0.0"
28859 }
28860 },
28861 "minimist": {
28862 "version": "1.2.5",
28863 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
28864 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
28865 "dev": true
28866 },
28867 "minipass": {
28868 "version": "3.1.3",
28869 "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
28870 "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
28871 "dev": true,
28872 "requires": {
28873 "yallist": "^4.0.0"
28874 }
28875 },
28876 "minizlib": {
28877 "version": "2.1.2",
28878 "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
28879 "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
28880 "dev": true,
28881 "requires": {
28882 "minipass": "^3.0.0",
28883 "yallist": "^4.0.0"
28884 }
28885 },
28886 "node-gyp": {
28887 "version": "7.1.2",
28888 "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz",
28889 "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==",
28890 "dev": true,
28891 "requires": {
28892 "env-paths": "^2.2.0",
28893 "glob": "^7.1.4",
28894 "graceful-fs": "^4.2.3",
28895 "nopt": "^5.0.0",
28896 "npmlog": "^4.1.2",
28897 "request": "^2.88.2",
28898 "rimraf": "^3.0.2",
28899 "semver": "^7.3.2",
28900 "tar": "^6.0.2",
28901 "which": "^2.0.2"
28902 },
28903 "dependencies": {
28904 "graceful-fs": {
28905 "version": "4.2.6",
28906 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
28907 "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
28908 "dev": true
28909 },
28910 "request": {
28911 "version": "2.88.2",
28912 "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
28913 "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
28914 "dev": true,
28915 "requires": {
28916 "aws-sign2": "~0.7.0",
28917 "aws4": "^1.8.0",
28918 "caseless": "~0.12.0",
28919 "combined-stream": "~1.0.6",
28920 "extend": "~3.0.2",
28921 "forever-agent": "~0.6.1",
28922 "form-data": "~2.3.2",
28923 "har-validator": "~5.1.3",
28924 "http-signature": "~1.2.0",
28925 "is-typedarray": "~1.0.0",
28926 "isstream": "~0.1.2",
28927 "json-stringify-safe": "~5.0.1",
28928 "mime-types": "~2.1.19",
28929 "oauth-sign": "~0.9.0",
28930 "performance-now": "^2.1.0",
28931 "qs": "~6.5.2",
28932 "safe-buffer": "^5.1.2",
28933 "tough-cookie": "~2.5.0",
28934 "tunnel-agent": "^0.6.0",
28935 "uuid": "^3.3.2"
28936 }
28937 }
28938 }
28939 },
28940 "nopt": {
28941 "version": "5.0.0",
28942 "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
28943 "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
28944 "dev": true,
28945 "requires": {
28946 "abbrev": "1"
28947 }
28948 },
28949 "parse-json": {
28950 "version": "2.2.0",
28951 "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
28952 "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
28953 "dev": true,
28954 "requires": {
28955 "error-ex": "^1.2.0"
28956 }
28957 },
28958 "path-exists": {
28959 "version": "2.1.0",
28960 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
28961 "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
28962 "dev": true,
28963 "requires": {
28964 "pinkie-promise": "^2.0.0"
28965 }
28966 },
28967 "path-key": {
28968 "version": "3.1.1",
28969 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
28970 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
28971 "dev": true
28972 },
28973 "path-type": {
28974 "version": "1.1.0",
28975 "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
28976 "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
28977 "dev": true,
28978 "requires": {
28979 "graceful-fs": "^4.1.2",
28980 "pify": "^2.0.0",
28981 "pinkie-promise": "^2.0.0"
28982 }
28983 },
28984 "pify": {
28985 "version": "2.3.0",
28986 "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
28987 "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
28988 "dev": true
28989 },
28990 "read-pkg": {
28991 "version": "1.1.0",
28992 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
28993 "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
28994 "dev": true,
28995 "requires": {
28996 "load-json-file": "^1.0.0",
28997 "normalize-package-data": "^2.3.2",
28998 "path-type": "^1.0.0"
28999 }
29000 },
29001 "read-pkg-up": {
29002 "version": "1.0.1",
29003 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
29004 "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
29005 "dev": true,
29006 "requires": {
29007 "find-up": "^1.0.0",
29008 "read-pkg": "^1.0.0"
29009 }
29010 },
29011 "redent": {
29012 "version": "1.0.0",
29013 "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
29014 "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
29015 "dev": true,
29016 "requires": {
29017 "indent-string": "^2.1.0",
29018 "strip-indent": "^1.0.1"
29019 }
29020 },
29021 "rimraf": {
29022 "version": "3.0.2",
29023 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
29024 "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
29025 "dev": true,
29026 "requires": {
29027 "glob": "^7.1.3"
29028 }
29029 },
29030 "semver": {
29031 "version": "7.3.5",
29032 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
29033 "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
29034 "dev": true,
29035 "requires": {
29036 "lru-cache": "^6.0.0"
29037 }
29038 },
29039 "shebang-command": {
29040 "version": "2.0.0",
29041 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
29042 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
29043 "dev": true,
29044 "requires": {
29045 "shebang-regex": "^3.0.0"
29046 }
29047 },
29048 "shebang-regex": {
29049 "version": "3.0.0",
29050 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
29051 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
29052 "dev": true
29053 },
29054 "strip-ansi": {
29055 "version": "3.0.1",
29056 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
29057 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
29058 "dev": true,
29059 "requires": {
29060 "ansi-regex": "^2.0.0"
29061 }
29062 },
29063 "strip-bom": {
29064 "version": "2.0.0",
29065 "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
29066 "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
29067 "dev": true,
29068 "requires": {
29069 "is-utf8": "^0.2.0"
29070 }
29071 },
29072 "strip-indent": {
29073 "version": "1.0.1",
29074 "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
29075 "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
29076 "dev": true,
29077 "requires": {
29078 "get-stdin": "^4.0.1"
29079 }
29080 },
29081 "supports-color": {
29082 "version": "2.0.0",
29083 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
29084 "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
29085 "dev": true
29086 },
29087 "tar": {
29088 "version": "6.1.0",
29089 "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
29090 "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
29091 "dev": true,
29092 "requires": {
29093 "chownr": "^2.0.0",
29094 "fs-minipass": "^2.0.0",
29095 "minipass": "^3.0.0",
29096 "minizlib": "^2.1.1",
29097 "mkdirp": "^1.0.3",
29098 "yallist": "^4.0.0"
29099 },
29100 "dependencies": {
29101 "mkdirp": {
29102 "version": "1.0.4",
29103 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
29104 "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
29105 "dev": true
29106 }
29107 }
29108 },
29109 "tough-cookie": {
29110 "version": "2.5.0",
29111 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
29112 "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
29113 "dev": true,
29114 "requires": {
29115 "psl": "^1.1.28",
29116 "punycode": "^2.1.1"
29117 }
29118 },
29119 "trim-newlines": {
29120 "version": "1.0.0",
29121 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
29122 "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
29123 "dev": true
29124 },
29125 "which": {
29126 "version": "2.0.2",
29127 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
29128 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
29129 "dev": true,
29130 "requires": {
29131 "isexe": "^2.0.0"
29132 }
29133 },
29134 "yallist": {
29135 "version": "4.0.0",
29136 "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
29137 "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
29138 "dev": true
29139 }
29140 }
29141 },
29142 "nopt": { 29127 "nopt": {
29143 "version": "3.0.6", 29128 "version": "3.0.6",
29144 "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 29129 "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
@@ -29907,23 +29892,6 @@
29907 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 29892 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
29908 "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 29893 "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
29909 }, 29894 },
29910 "onetime": {
29911 "version": "2.0.1",
29912 "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
29913 "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
29914 "dev": true,
29915 "requires": {
29916 "mimic-fn": "^1.0.0"
29917 },
29918 "dependencies": {
29919 "mimic-fn": {
29920 "version": "1.2.0",
29921 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
29922 "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
29923 "dev": true
29924 }
29925 }
29926 },
29927 "opn": { 29895 "opn": {
29928 "version": "5.5.0", 29896 "version": "5.5.0",
29929 "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", 29897 "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
@@ -32667,9 +32635,9 @@
32667 } 32635 }
32668 }, 32636 },
32669 "regexpp": { 32637 "regexpp": {
32670 "version": "2.0.1", 32638 "version": "3.2.0",
32671 "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 32639 "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
32672 "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 32640 "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
32673 "dev": true 32641 "dev": true
32674 }, 32642 },
32675 "regexpu-core": { 32643 "regexpu-core": {
@@ -32915,6 +32883,12 @@
32915 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 32883 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
32916 "dev": true 32884 "dev": true
32917 }, 32885 },
32886 "require-from-string": {
32887 "version": "2.0.2",
32888 "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
32889 "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
32890 "dev": true
32891 },
32918 "require-main-filename": { 32892 "require-main-filename": {
32919 "version": "1.0.1", 32893 "version": "1.0.1",
32920 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 32894 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
@@ -33027,16 +33001,6 @@
33027 "lowercase-keys": "^1.0.0" 33001 "lowercase-keys": "^1.0.0"
33028 } 33002 }
33029 }, 33003 },
33030 "restore-cursor": {
33031 "version": "2.0.0",
33032 "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
33033 "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
33034 "dev": true,
33035 "requires": {
33036 "onetime": "^2.0.0",
33037 "signal-exit": "^3.0.2"
33038 }
33039 },
33040 "ret": { 33004 "ret": {
33041 "version": "0.1.15", 33005 "version": "0.1.15",
33042 "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 33006 "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
@@ -33112,12 +33076,6 @@
33112 "resolved": "https://registry.npmjs.org/route-parser/-/route-parser-0.0.5.tgz", 33076 "resolved": "https://registry.npmjs.org/route-parser/-/route-parser-0.0.5.tgz",
33113 "integrity": "sha1-fR0J0zXkkJQDHqFpkaSnmwG74fQ=" 33077 "integrity": "sha1-fR0J0zXkkJQDHqFpkaSnmwG74fQ="
33114 }, 33078 },
33115 "run-async": {
33116 "version": "2.4.1",
33117 "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
33118 "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
33119 "dev": true
33120 },
33121 "run-parallel": { 33079 "run-parallel": {
33122 "version": "1.2.0", 33080 "version": "1.2.0",
33123 "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 33081 "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -33184,6 +33142,122 @@
33184 "truncate-utf8-bytes": "^1.0.0" 33142 "truncate-utf8-bytes": "^1.0.0"
33185 } 33143 }
33186 }, 33144 },
33145 "sass": {
33146 "version": "1.35.1",
33147 "resolved": "https://registry.npmjs.org/sass/-/sass-1.35.1.tgz",
33148 "integrity": "sha512-oCisuQJstxMcacOPmxLNiLlj4cUyN2+8xJnG7VanRoh2GOLr9RqkvI4AxA4a6LHVg/rsu+PmxXeGhrdSF9jCiQ==",
33149 "dev": true,
33150 "requires": {
33151 "chokidar": ">=3.0.0 <4.0.0"
33152 },
33153 "dependencies": {
33154 "anymatch": {
33155 "version": "3.1.2",
33156 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
33157 "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
33158 "dev": true,
33159 "requires": {
33160 "normalize-path": "^3.0.0",
33161 "picomatch": "^2.0.4"
33162 }
33163 },
33164 "binary-extensions": {
33165 "version": "2.2.0",
33166 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
33167 "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
33168 "dev": true
33169 },
33170 "braces": {
33171 "version": "3.0.2",
33172 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
33173 "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
33174 "dev": true,
33175 "requires": {
33176 "fill-range": "^7.0.1"
33177 }
33178 },
33179 "chokidar": {
33180 "version": "3.5.2",
33181 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
33182 "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
33183 "dev": true,
33184 "requires": {
33185 "anymatch": "~3.1.2",
33186 "braces": "~3.0.2",
33187 "fsevents": "~2.3.2",
33188 "glob-parent": "~5.1.2",
33189 "is-binary-path": "~2.1.0",
33190 "is-glob": "~4.0.1",
33191 "normalize-path": "~3.0.0",
33192 "readdirp": "~3.6.0"
33193 }
33194 },
33195 "fill-range": {
33196 "version": "7.0.1",
33197 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
33198 "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
33199 "dev": true,
33200 "requires": {
33201 "to-regex-range": "^5.0.1"
33202 }
33203 },
33204 "fsevents": {
33205 "version": "2.3.2",
33206 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
33207 "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
33208 "dev": true,
33209 "optional": true
33210 },
33211 "glob-parent": {
33212 "version": "5.1.2",
33213 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
33214 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
33215 "dev": true,
33216 "requires": {
33217 "is-glob": "^4.0.1"
33218 }
33219 },
33220 "is-binary-path": {
33221 "version": "2.1.0",
33222 "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
33223 "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
33224 "dev": true,
33225 "requires": {
33226 "binary-extensions": "^2.0.0"
33227 }
33228 },
33229 "is-number": {
33230 "version": "7.0.0",
33231 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
33232 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
33233 "dev": true
33234 },
33235 "normalize-path": {
33236 "version": "3.0.0",
33237 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
33238 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
33239 "dev": true
33240 },
33241 "readdirp": {
33242 "version": "3.6.0",
33243 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
33244 "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
33245 "dev": true,
33246 "requires": {
33247 "picomatch": "^2.2.1"
33248 }
33249 },
33250 "to-regex-range": {
33251 "version": "5.0.1",
33252 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
33253 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
33254 "dev": true,
33255 "requires": {
33256 "is-number": "^7.0.0"
33257 }
33258 }
33259 }
33260 },
33187 "sass-graph": { 33261 "sass-graph": {
33188 "version": "2.2.5", 33262 "version": "2.2.5",
33189 "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", 33263 "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
@@ -33700,14 +33774,46 @@
33700 "dev": true 33774 "dev": true
33701 }, 33775 },
33702 "slice-ansi": { 33776 "slice-ansi": {
33703 "version": "2.1.0", 33777 "version": "4.0.0",
33704 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 33778 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
33705 "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 33779 "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
33706 "dev": true, 33780 "dev": true,
33707 "requires": { 33781 "requires": {
33708 "ansi-styles": "^3.2.0", 33782 "ansi-styles": "^4.0.0",
33709 "astral-regex": "^1.0.0", 33783 "astral-regex": "^2.0.0",
33710 "is-fullwidth-code-point": "^2.0.0" 33784 "is-fullwidth-code-point": "^3.0.0"
33785 },
33786 "dependencies": {
33787 "ansi-styles": {
33788 "version": "4.3.0",
33789 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
33790 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
33791 "dev": true,
33792 "requires": {
33793 "color-convert": "^2.0.1"
33794 }
33795 },
33796 "color-convert": {
33797 "version": "2.0.1",
33798 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
33799 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
33800 "dev": true,
33801 "requires": {
33802 "color-name": "~1.1.4"
33803 }
33804 },
33805 "color-name": {
33806 "version": "1.1.4",
33807 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
33808 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
33809 "dev": true
33810 },
33811 "is-fullwidth-code-point": {
33812 "version": "3.0.0",
33813 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
33814 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
33815 "dev": true
33816 }
33711 } 33817 }
33712 }, 33818 },
33713 "slide": { 33819 "slide": {
@@ -34854,41 +34960,73 @@
34854 } 34960 }
34855 }, 34961 },
34856 "table": { 34962 "table": {
34857 "version": "5.4.6", 34963 "version": "6.7.1",
34858 "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 34964 "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
34859 "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 34965 "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
34860 "dev": true, 34966 "dev": true,
34861 "requires": { 34967 "requires": {
34862 "ajv": "^6.10.2", 34968 "ajv": "^8.0.1",
34863 "lodash": "^4.17.14", 34969 "lodash.clonedeep": "^4.5.0",
34864 "slice-ansi": "^2.1.0", 34970 "lodash.truncate": "^4.4.2",
34865 "string-width": "^3.0.0" 34971 "slice-ansi": "^4.0.0",
34972 "string-width": "^4.2.0",
34973 "strip-ansi": "^6.0.0"
34866 }, 34974 },
34867 "dependencies": { 34975 "dependencies": {
34976 "ajv": {
34977 "version": "8.6.0",
34978 "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.0.tgz",
34979 "integrity": "sha512-cnUG4NSBiM4YFBxgZIj/In3/6KX+rQ2l2YPRVcvAMQGWEPKuXoPIhxzwqh31jA3IPbI4qEOp/5ILI4ynioXsGQ==",
34980 "dev": true,
34981 "requires": {
34982 "fast-deep-equal": "^3.1.1",
34983 "json-schema-traverse": "^1.0.0",
34984 "require-from-string": "^2.0.2",
34985 "uri-js": "^4.2.2"
34986 }
34987 },
34868 "ansi-regex": { 34988 "ansi-regex": {
34869 "version": "4.1.0", 34989 "version": "5.0.0",
34870 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 34990 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
34871 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 34991 "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
34992 "dev": true
34993 },
34994 "emoji-regex": {
34995 "version": "8.0.0",
34996 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
34997 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
34998 "dev": true
34999 },
35000 "is-fullwidth-code-point": {
35001 "version": "3.0.0",
35002 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
35003 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
35004 "dev": true
35005 },
35006 "json-schema-traverse": {
35007 "version": "1.0.0",
35008 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
35009 "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
34872 "dev": true 35010 "dev": true
34873 }, 35011 },
34874 "string-width": { 35012 "string-width": {
34875 "version": "3.1.0", 35013 "version": "4.2.2",
34876 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 35014 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
34877 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 35015 "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
34878 "dev": true, 35016 "dev": true,
34879 "requires": { 35017 "requires": {
34880 "emoji-regex": "^7.0.1", 35018 "emoji-regex": "^8.0.0",
34881 "is-fullwidth-code-point": "^2.0.0", 35019 "is-fullwidth-code-point": "^3.0.0",
34882 "strip-ansi": "^5.1.0" 35020 "strip-ansi": "^6.0.0"
34883 } 35021 }
34884 }, 35022 },
34885 "strip-ansi": { 35023 "strip-ansi": {
34886 "version": "5.2.0", 35024 "version": "6.0.0",
34887 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 35025 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
34888 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 35026 "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
34889 "dev": true, 35027 "dev": true,
34890 "requires": { 35028 "requires": {
34891 "ansi-regex": "^4.1.0" 35029 "ansi-regex": "^5.0.0"
34892 } 35030 }
34893 } 35031 }
34894 } 35032 }
@@ -37818,15 +37956,6 @@
37818 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 37956 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
37819 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 37957 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
37820 }, 37958 },
37821 "write": {
37822 "version": "1.0.3",
37823 "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
37824 "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
37825 "dev": true,
37826 "requires": {
37827 "mkdirp": "^0.5.1"
37828 }
37829 },
37830 "write-file-atomic": { 37959 "write-file-atomic": {
37831 "version": "2.4.3", 37960 "version": "2.4.3",
37832 "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", 37961 "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
diff --git a/package.json b/package.json
index 2c28e8d27..a15f44d9c 100644
--- a/package.json
+++ b/package.json
@@ -170,10 +170,10 @@
170 "electron-builder": "22.11.7", 170 "electron-builder": "22.11.7",
171 "electron-notarize": "1.0.0", 171 "electron-notarize": "1.0.0",
172 "electron-rebuild": "2.3.5", 172 "electron-rebuild": "2.3.5",
173 "eslint": "5.16.0", 173 "eslint": "7.29.0",
174 "eslint-config-airbnb": "17.1.1", 174 "eslint-config-airbnb": "18.2.1",
175 "eslint-plugin-import": "2.23.4", 175 "eslint-plugin-import": "2.23.4",
176 "eslint-plugin-jest": "22.21.0", 176 "eslint-plugin-jest": "24.3.6",
177 "eslint-plugin-jsx-a11y": "6.4.1", 177 "eslint-plugin-jsx-a11y": "6.4.1",
178 "eslint-plugin-react": "7.24.0", 178 "eslint-plugin-react": "7.24.0",
179 "eslint-webpack-plugin": "^2.5.4", 179 "eslint-webpack-plugin": "^2.5.4",
@@ -193,10 +193,10 @@
193 "mobx-react-devtools": "^6.1.1", 193 "mobx-react-devtools": "^6.1.1",
194 "mocha": "9.0.1", 194 "mocha": "9.0.1",
195 "node-abi": "2.30.0", 195 "node-abi": "2.30.0",
196 "node-sass": "^5.0.0",
197 "prettier": "^2.3.1", 196 "prettier": "^2.3.1",
198 "preval-build-info": "^1.0.3", 197 "preval-build-info": "^1.0.3",
199 "react-intl-translations-manager": "^5.0.3", 198 "react-intl-translations-manager": "^5.0.3",
199 "sass": "1.35.1",
200 "terser-webpack-plugin": "1.4.5", 200 "terser-webpack-plugin": "1.4.5",
201 "ts-loader": "^5.4.5", 201 "ts-loader": "^5.4.5",
202 "tslint": "^5.20.1", 202 "tslint": "^5.20.1",
diff --git a/src/actions/index.js b/src/actions/index.js
index 9d3684edc..6f32732b9 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -17,7 +17,7 @@ import todos from '../features/todos/actions';
17import planSelection from '../features/planSelection/actions'; 17import planSelection from '../features/planSelection/actions';
18import trialStatusBar from '../features/trialStatusBar/actions'; 18import trialStatusBar from '../features/trialStatusBar/actions';
19 19
20const actions = Object.assign({}, { 20const actions = {
21 service, 21 service,
22 recipe, 22 recipe,
23 recipePreview, 23 recipePreview,
@@ -28,7 +28,7 @@ const actions = Object.assign({}, {
28 news, 28 news,
29 settings, 29 settings,
30 requests, 30 requests,
31}); 31};
32 32
33export default Object.assign( 33export default Object.assign(
34 defineActions(actions, PropTypes.checkPropTypes), 34 defineActions(actions, PropTypes.checkPropTypes),
diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js
index 75d18f234..8fdaed363 100644
--- a/src/api/server/ServerApi.js
+++ b/src/api/server/ServerApi.js
@@ -183,9 +183,7 @@ export default class ServerApi {
183 async createService(recipeId, data) { 183 async createService(recipeId, data) {
184 const request = await sendAuthRequest(`${apiBase()}/service`, { 184 const request = await sendAuthRequest(`${apiBase()}/service`, {
185 method: 'POST', 185 method: 'POST',
186 body: JSON.stringify(Object.assign({ 186 body: JSON.stringify({ recipeId, ...data }),
187 recipeId,
188 }, data)),
189 }); 187 });
190 if (!request.ok) { 188 if (!request.ok) {
191 throw request; 189 throw request;
diff --git a/src/api/utils/auth.js b/src/api/utils/auth.js
index 5952cfe11..9f718f171 100644
--- a/src/api/utils/auth.js
+++ b/src/api/utils/auth.js
@@ -4,14 +4,15 @@ import localStorage from 'mobx-localstorage';
4export const prepareAuthRequest = (options = { method: 'GET' }, auth = true) => { 4export const prepareAuthRequest = (options = { method: 'GET' }, auth = true) => {
5 const request = Object.assign(options, { 5 const request = Object.assign(options, {
6 mode: 'cors', 6 mode: 'cors',
7 headers: Object.assign({ 7 headers: {
8 'Content-Type': 'application/json', 8 'Content-Type': 'application/json',
9 'X-Franz-Source': 'desktop', 9 'X-Franz-Source': 'desktop',
10 'X-Franz-Version': app.getVersion(), 10 'X-Franz-Version': app.getVersion(),
11 'X-Franz-platform': process.platform, 11 'X-Franz-platform': process.platform,
12 'X-Franz-Timezone-Offset': new Date().getTimezoneOffset(), 12 'X-Franz-Timezone-Offset': new Date().getTimezoneOffset(),
13 'X-Franz-System-Locale': app.getLocale(), 13 'X-Franz-System-Locale': app.getLocale(),
14 }, options.headers), 14 ...options.headers,
15 },
15 }); 16 });
16 17
17 if (auth) { 18 if (auth) {
diff --git a/src/components/auth/Import.js b/src/components/auth/Import.js
index 3e34c3162..3073cad73 100644
--- a/src/components/auth/Import.js
+++ b/src/components/auth/Import.js
@@ -28,7 +28,9 @@ const messages = defineMessages({
28 }, 28 },
29}); 29});
30 30
31export default @observer class Import extends Component { 31export default
32@observer
33class Import extends Component {
32 static propTypes = { 34 static propTypes = {
33 services: MobxPropTypes.arrayOrObservableArray.isRequired, 35 services: MobxPropTypes.arrayOrObservableArray.isRequired,
34 onSubmit: PropTypes.func.isRequired, 36 onSubmit: PropTypes.func.isRequired,
@@ -40,17 +42,21 @@ export default @observer class Import extends Component {
40 intl: intlShape, 42 intl: intlShape,
41 }; 43 };
42 44
43 componentWillMount() { 45 componentDidMount() {
44 const config = { 46 const config = {
45 fields: { 47 fields: {
46 import: [...this.props.services.filter(s => s.recipe).map(s => ({ 48 import: [
47 fields: { 49 ...this.props.services
48 add: { 50 .filter((s) => s.recipe)
49 default: true, 51 .map((s) => ({
50 options: s, 52 fields: {
51 }, 53 add: {
52 }, 54 default: true,
53 }))], 55 options: s,
56 },
57 },
58 })),
59 ],
54 }, 60 },
55 }; 61 };
56 62
@@ -62,9 +68,12 @@ export default @observer class Import extends Component {
62 e.preventDefault(); 68 e.preventDefault();
63 this.form.submit({ 69 this.form.submit({
64 onSuccess: (form) => { 70 onSuccess: (form) => {
65 const servicesImport = form.values().import 71 const servicesImport = form
66 .map((value, i) => !value.add || services.filter(s => s.recipe)[i]) 72 .values()
67 .filter(s => typeof s !== 'boolean'); 73 .import.map(
74 (value, i) => !value.add || services.filter((s) => s.recipe)[i],
75 )
76 .filter((s) => typeof s !== 'boolean');
68 77
69 this.props.onSubmit({ services: servicesImport }); 78 this.props.onSubmit({ services: servicesImport });
70 }, 79 },
@@ -76,37 +85,31 @@ export default @observer class Import extends Component {
76 const { intl } = this.context; 85 const { intl } = this.context;
77 const { services, isSubmitting, inviteRoute } = this.props; 86 const { services, isSubmitting, inviteRoute } = this.props;
78 87
79 const availableServices = services.filter(s => s.recipe); 88 const availableServices = services.filter((s) => s.recipe);
80 const unavailableServices = services.filter(s => !s.recipe); 89 const unavailableServices = services.filter((s) => !s.recipe);
81 90
82 return ( 91 return (
83 <div className="auth__scroll-container"> 92 <div className="auth__scroll-container">
84 <div className="auth__container auth__container--signup"> 93 <div className="auth__container auth__container--signup">
85 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 94 <form
86 <img 95 className="franz-form auth__form"
87 src="./assets/images/logo.svg" 96 onSubmit={(e) => this.submit(e)}
88 className="auth__logo" 97 >
89 alt="" 98 <img src="./assets/images/logo.svg" className="auth__logo" alt="" />
90 /> 99 <h1>{intl.formatMessage(messages.headline)}</h1>
91 <h1>
92 {intl.formatMessage(messages.headline)}
93 </h1>
94 <table className="service-table available-services"> 100 <table className="service-table available-services">
95 <tbody> 101 <tbody>
96 {this.form.$('import').map((service, i) => ( 102 {this.form.$('import').map((service, i) => (
97 <tr 103 <tr key={service.id} className="service-table__row">
98 key={service.id}
99 className="service-table__row"
100 >
101 <td className="service-table__toggle"> 104 <td className="service-table__toggle">
102 <Toggle 105 <Toggle field={service.$('add')} showLabel={false} />
103 field={service.$('add')}
104 showLabel={false}
105 />
106 </td> 106 </td>
107 <td className="service-table__column-icon"> 107 <td className="service-table__column-icon">
108 <img 108 <img
109 src={availableServices[i].custom_icon || availableServices[i].recipe.icons.svg} 109 src={
110 availableServices[i].custom_icon
111 || availableServices[i].recipe.icons.svg
112 }
110 className={classnames({ 113 className={classnames({
111 'service-table__icon': true, 114 'service-table__icon': true,
112 'has-custom-icon': availableServices[i].custom_icon, 115 'has-custom-icon': availableServices[i].custom_icon,
@@ -125,14 +128,18 @@ export default @observer class Import extends Component {
125 </table> 128 </table>
126 {unavailableServices.length > 0 && ( 129 {unavailableServices.length > 0 && (
127 <div className="unavailable-services"> 130 <div className="unavailable-services">
128 <strong>{intl.formatMessage(messages.notSupportedHeadline)}</strong> 131 <strong>
132 {intl.formatMessage(messages.notSupportedHeadline)}
133 </strong>
129 <p> 134 <p>
130 {services.filter(s => !s.recipe).map((service, i) => ( 135 {services
131 <span key={service.id}> 136 .filter((s) => !s.recipe)
132 {service.name !== '' ? service.name : service.service} 137 .map((service, i) => (
133 {unavailableServices.length > i + 1 ? ', ' : ''} 138 <span key={service.id}>
134 </span> 139 {service.name !== '' ? service.name : service.service}
135 ))} 140 {unavailableServices.length > i + 1 ? ', ' : ''}
141 </span>
142 ))}
136 </p> 143 </p>
137 </div> 144 </div>
138 )} 145 )}
diff --git a/src/components/auth/Invite.js b/src/components/auth/Invite.js
index fd957ee73..4b4d63a6b 100644
--- a/src/components/auth/Invite.js
+++ b/src/components/auth/Invite.js
@@ -43,7 +43,9 @@ const messages = defineMessages({
43 }, 43 },
44}); 44});
45 45
46export default @observer class Invite extends Component { 46export default
47@observer
48class Invite extends Component {
47 static propTypes = { 49 static propTypes = {
48 onSubmit: PropTypes.func.isRequired, 50 onSubmit: PropTypes.func.isRequired,
49 embed: PropTypes.bool, 51 embed: PropTypes.bool,
@@ -63,36 +65,41 @@ export default @observer class Invite extends Component {
63 65
64 state = { showSuccessInfo: false }; 66 state = { showSuccessInfo: false };
65 67
66 componentWillMount() { 68 componentDidMount() {
67 const handlers = { 69 this.form = new Form(
68 onChange: () => { 70 {
69 this.setState({ showSuccessInfo: false }); 71 fields: {
70 }, 72 invite: [
71 }; 73 ...Array(3).fill({
72 74 fields: {
73 this.form = new Form({ 75 name: {
74 fields: { 76 label: this.context.intl.formatMessage(messages.nameLabel),
75 invite: [...Array(3).fill({ 77 placeholder: this.context.intl.formatMessage(
76 fields: { 78 messages.nameLabel,
77 name: { 79 ),
78 label: this.context.intl.formatMessage(messages.nameLabel), 80 onChange: () => {
79 placeholder: this.context.intl.formatMessage(messages.nameLabel), 81 this.setState({ showSuccessInfo: false });
80 handlers, 82 },
81 // related: ['invite.0.email'], // path accepted but does not work 83 // related: ['invite.0.email'], // path accepted but does not work
82 }, 84 },
83 email: { 85 email: {
84 label: this.context.intl.formatMessage(messages.emailLabel), 86 label: this.context.intl.formatMessage(messages.emailLabel),
85 placeholder: this.context.intl.formatMessage(messages.emailLabel), 87 placeholder: this.context.intl.formatMessage(
86 handlers, 88 messages.emailLabel,
87 validators: [email], 89 ),
88 }, 90 onChange: () => {
89 }, 91 this.setState({ showSuccessInfo: false });
90 })], 92 },
93 validators: [email],
94 },
95 },
96 }),
97 ],
98 },
91 }, 99 },
92 }, this.context.intl); 100 this.context.intl,
93 } 101 );
94 102
95 componentDidMount() {
96 document.querySelector('input:first-child').focus(); 103 document.querySelector('input:first-child').focus();
97 } 104 }
98 105
@@ -117,9 +124,10 @@ export default @observer class Invite extends Component {
117 const { intl } = this.context; 124 const { intl } = this.context;
118 const { embed, isInviteSuccessful, isLoadingInvite } = this.props; 125 const { embed, isInviteSuccessful, isLoadingInvite } = this.props;
119 126
120 const atLeastOneEmailAddress = form.$('invite') 127 const atLeastOneEmailAddress = form
121 .map(invite => invite.$('email').value) 128 .$('invite')
122 .some(emailValue => emailValue.trim() !== ''); 129 .map((invite) => invite.$('email').value)
130 .some((emailValue) => emailValue.trim() !== '');
123 131
124 const sendButtonClassName = classnames({ 132 const sendButtonClassName = classnames({
125 auth__button: true, 133 auth__button: true,
@@ -127,7 +135,7 @@ export default @observer class Invite extends Component {
127 }); 135 });
128 136
129 const renderForm = ( 137 const renderForm = (
130 <Fragment> 138 <>
131 {this.state.showSuccessInfo && isInviteSuccessful && ( 139 {this.state.showSuccessInfo && isInviteSuccessful && (
132 <Appear> 140 <Appear>
133 <Infobox 141 <Infobox
@@ -140,18 +148,17 @@ export default @observer class Invite extends Component {
140 </Appear> 148 </Appear>
141 )} 149 )}
142 150
143 <form className="franz-form auth__form" onSubmit={e => this.submit(e)}> 151 <form
152 className="franz-form auth__form"
153 onSubmit={(e) => this.submit(e)}
154 >
144 {!embed && ( 155 {!embed && (
145 <img 156 <img src="./assets/images/logo.svg" className="auth__logo" alt="" />
146 src="./assets/images/logo.svg"
147 className="auth__logo"
148 alt=""
149 />
150 )} 157 )}
151 <h1 className={embed && 'invite__embed'}> 158 <h1 className={embed && 'invite__embed'}>
152 {intl.formatMessage(messages.headline)} 159 {intl.formatMessage(messages.headline)}
153 </h1> 160 </h1>
154 {form.$('invite').map(invite => ( 161 {form.$('invite').map((invite) => (
155 <div className="grid" key={invite.key}> 162 <div className="grid" key={invite.key}>
156 <div className="grid__row"> 163 <div className="grid__row">
157 <Input field={invite.$('name')} showLabel={false} /> 164 <Input field={invite.$('name')} showLabel={false} />
@@ -175,17 +182,27 @@ export default @observer class Invite extends Component {
175 </Link> 182 </Link>
176 )} 183 )}
177 </form> 184 </form>
178 </Fragment> 185 </>
179 ); 186 );
180 187
181 return ( 188 return (
182 <div className={!embed ? 'auth__container auth__container--signup' : 'settings__main'}> 189 <div
190 className={
191 !embed ? 'auth__container auth__container--signup' : 'settings__main'
192 }
193 >
183 {embed && ( 194 {embed && (
184 <div className="settings__header"> 195 <div className="settings__header">
185 <h1>{this.context.intl.formatMessage(messages.settingsHeadline)}</h1> 196 <h1>
197 {this.context.intl.formatMessage(messages.settingsHeadline)}
198 </h1>
186 </div> 199 </div>
187 )} 200 )}
188 {!embed ? <div>{renderForm}</div> : <div className="settings__body invite__form">{renderForm}</div>} 201 {!embed ? (
202 <div>{renderForm}</div>
203 ) : (
204 <div className="settings__body invite__form">{renderForm}</div>
205 )}
189 </div> 206 </div>
190 ); 207 );
191 } 208 }
diff --git a/src/components/auth/Pricing.js b/src/components/auth/Pricing.js
index fecc6ba56..2fcabe54d 100644
--- a/src/components/auth/Pricing.js
+++ b/src/components/auth/Pricing.js
@@ -10,7 +10,6 @@ import { Button } from '@meetfranz/forms';
10import { FeatureItem } from '../ui/FeatureItem'; 10import { FeatureItem } from '../ui/FeatureItem';
11import { FeatureList } from '../ui/FeatureList'; 11import { FeatureList } from '../ui/FeatureList';
12 12
13
14const messages = defineMessages({ 13const messages = defineMessages({
15 headline: { 14 headline: {
16 id: 'pricing.trial.headline.pro', 15 id: 'pricing.trial.headline.pro',
diff --git a/src/components/auth/Welcome.js b/src/components/auth/Welcome.js
index 6e742e0c1..5f2fac64b 100644
--- a/src/components/auth/Welcome.js
+++ b/src/components/auth/Welcome.js
@@ -72,7 +72,6 @@ export default @inject('actions') @observer class Login extends Component {
72 <br /> 72 <br />
73 <br /> 73 <br />
74 74
75
76 <Link to={changeServerRoute}> 75 <Link to={changeServerRoute}>
77 <span style={{ 76 <span style={{
78 textAlign: 'center', 77 textAlign: 'center',
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 444d5fea4..3c0fed32b 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -109,7 +109,7 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
109 return ( 109 return (
110 <div className={webviewClasses}> 110 <div className={webviewClasses}>
111 {service.isActive && service.isEnabled && ( 111 {service.isActive && service.isEnabled && (
112 <Fragment> 112 <>
113 {service.hasCrashed && ( 113 {service.hasCrashed && (
114 <WebviewCrashHandler 114 <WebviewCrashHandler
115 name={service.recipe.name} 115 name={service.recipe.name}
@@ -131,10 +131,10 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
131 edit={edit} 131 edit={edit}
132 /> 132 />
133 )} 133 )}
134 </Fragment> 134 </>
135 )} 135 )}
136 {!service.isEnabled ? ( 136 {!service.isEnabled ? (
137 <Fragment> 137 <>
138 {service.isActive && ( 138 {service.isActive && (
139 <ServiceDisabled 139 <ServiceDisabled
140 name={service.recipe.name} 140 name={service.recipe.name}
@@ -142,7 +142,7 @@ export default @inject('stores', 'actions') @observer class ServiceView extends
142 enable={enable} 142 enable={enable}
143 /> 143 />
144 )} 144 )}
145 </Fragment> 145 </>
146 ) : ( 146 ) : (
147 <> 147 <>
148 {(!service.isHibernating || service.isHibernationEnabled) ? ( 148 {(!service.isHibernating || service.isHibernationEnabled) ? (
diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js
index 7cf02c237..caa3cf9aa 100644
--- a/src/components/services/content/Services.js
+++ b/src/components/services/content/Services.js
@@ -34,7 +34,6 @@ const messages = defineMessages({
34 }, 34 },
35}); 35});
36 36
37
38const styles = { 37const styles = {
39 confettiContainer: { 38 confettiContainer: {
40 position: 'absolute', 39 position: 'absolute',
diff --git a/src/components/services/content/WebviewCrashHandler.js b/src/components/services/content/WebviewCrashHandler.js
index 7a69dba87..b62940c06 100644
--- a/src/components/services/content/WebviewCrashHandler.js
+++ b/src/components/services/content/WebviewCrashHandler.js
@@ -43,7 +43,6 @@ export default @observer class WebviewCrashHandler extends Component {
43 43
44 countdownIntervalTimeout = ms('1s'); 44 countdownIntervalTimeout = ms('1s');
45 45
46
47 componentDidMount() { 46 componentDidMount() {
48 const { reload } = this.props; 47 const { reload } = this.props;
49 48
diff --git a/src/components/settings/SettingsLayout.js b/src/components/settings/SettingsLayout.js
index 72ba7b2e3..5b3b754fa 100644
--- a/src/components/settings/SettingsLayout.js
+++ b/src/components/settings/SettingsLayout.js
@@ -1,38 +1,55 @@
1import React, { Component } from 'react'; 1import React, { Component } from 'react';
2import PropTypes from 'prop-types'; 2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
4 5
5import ErrorBoundary from '../util/ErrorBoundary'; 6import ErrorBoundary from '../util/ErrorBoundary';
6import { oneOrManyChildElements } from '../../prop-types'; 7import { oneOrManyChildElements } from '../../prop-types';
7import Appear from '../ui/effects/Appear'; 8import Appear from '../ui/effects/Appear';
8 9
9export default @observer class SettingsLayout extends Component { 10const messages = defineMessages({
11 closeSettings: {
12 id: 'settings.app.closeSettings',
13 defaultMessage: '!!!Close settings',
14 },
15});
16
17export default
18@observer
19class SettingsLayout extends Component {
10 static propTypes = { 20 static propTypes = {
11 navigation: PropTypes.element.isRequired, 21 navigation: PropTypes.element.isRequired,
12 children: oneOrManyChildElements.isRequired, 22 children: oneOrManyChildElements.isRequired,
13 closeSettings: PropTypes.func.isRequired, 23 closeSettings: PropTypes.func.isRequired,
14 }; 24 };
15 25
16 componentWillMount() { 26 static contextTypes = {
27 intl: intlShape,
28 };
29
30 componentDidMount() {
17 document.addEventListener('keydown', this.handleKeyDown.bind(this), false); 31 document.addEventListener('keydown', this.handleKeyDown.bind(this), false);
18 } 32 }
19 33
20 componentWillUnmount() { 34 componentWillUnmount() {
21 document.removeEventListener('keydown', this.handleKeyDown.bind(this), false); 35 document.removeEventListener(
36 'keydown',
37 this.handleKeyDown.bind(this),
38 false,
39 );
22 } 40 }
23 41
24 handleKeyDown(e) { 42 handleKeyDown(e) {
25 if (e.keyCode === 27) { // escape key 43 if (e.keyCode === 27) {
44 // escape key
26 this.props.closeSettings(); 45 this.props.closeSettings();
27 } 46 }
28 } 47 }
29 48
30 render() { 49 render() {
31 const { 50 const { navigation, children, closeSettings } = this.props;
32 navigation, 51
33 children, 52 const { intl } = this.context;
34 closeSettings,
35 } = this.props;
36 53
37 return ( 54 return (
38 <Appear transitionName="fadeIn-fast"> 55 <Appear transitionName="fadeIn-fast">
@@ -42,6 +59,7 @@ export default @observer class SettingsLayout extends Component {
42 type="button" 59 type="button"
43 className="settings-wrapper__action" 60 className="settings-wrapper__action"
44 onClick={closeSettings} 61 onClick={closeSettings}
62 aria-label={intl.formatMessage(messages.closeSettings)}
45 /> 63 />
46 <div className="settings franz-form"> 64 <div className="settings franz-form">
47 {navigation} 65 {navigation}
@@ -50,6 +68,7 @@ export default @observer class SettingsLayout extends Component {
50 type="button" 68 type="button"
51 className="settings__close mdi mdi-close" 69 className="settings__close mdi mdi-close"
52 onClick={closeSettings} 70 onClick={closeSettings}
71 aria-label={intl.formatMessage(messages.closeSettings)}
53 /> 72 />
54 </div> 73 </div>
55 </ErrorBoundary> 74 </ErrorBoundary>
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index 1bbc1f1d4..a8501670b 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -311,14 +311,14 @@ export default @observer class EditServiceForm extends Component {
311 {recipe.hasCustomUrl && ( 311 {recipe.hasCustomUrl && (
312 <TabItem title={intl.formatMessage(messages.tabOnPremise)}> 312 <TabItem title={intl.formatMessage(messages.tabOnPremise)}>
313 {user.isPremium || recipe.author.find(a => a.email === user.email) ? ( 313 {user.isPremium || recipe.author.find(a => a.email === user.email) ? (
314 <Fragment> 314 <>
315 <Input field={form.$('customUrl')} /> 315 <Input field={form.$('customUrl')} />
316 {form.error === 'url-validation-error' && ( 316 {form.error === 'url-validation-error' && (
317 <p className="franz-form__error"> 317 <p className="franz-form__error">
318 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })} 318 {intl.formatMessage(messages.customUrlValidationError, { name: recipe.name })}
319 </p> 319 </p>
320 )} 320 )}
321 </Fragment> 321 </>
322 ) : ( 322 ) : (
323 <div className="center premium-info"> 323 <div className="center premium-info">
324 <p>{intl.formatMessage(messages.customUrlPremiumInfo)}</p> 324 <p>{intl.formatMessage(messages.customUrlPremiumInfo)}</p>
@@ -360,12 +360,12 @@ export default @observer class EditServiceForm extends Component {
360 <h3>{intl.formatMessage(messages.headlineBadges)}</h3> 360 <h3>{intl.formatMessage(messages.headlineBadges)}</h3>
361 <Toggle field={form.$('isBadgeEnabled')} /> 361 <Toggle field={form.$('isBadgeEnabled')} />
362 {recipe.hasIndirectMessages && form.$('isBadgeEnabled').value && ( 362 {recipe.hasIndirectMessages && form.$('isBadgeEnabled').value && (
363 <Fragment> 363 <>
364 <Toggle field={form.$('isIndirectMessageBadgeEnabled')} /> 364 <Toggle field={form.$('isIndirectMessageBadgeEnabled')} />
365 <p className="settings__help"> 365 <p className="settings__help">
366 {intl.formatMessage(messages.indirectMessageInfo)} 366 {intl.formatMessage(messages.indirectMessageInfo)}
367 </p> 367 </p>
368 </Fragment> 368 </>
369 )} 369 )}
370 </div> 370 </div>
371 371
@@ -389,8 +389,7 @@ export default @observer class EditServiceForm extends Component {
389 <Slider field={form.$('darkReaderContrast')} /> 389 <Slider field={form.$('darkReaderContrast')} />
390 <Slider field={form.$('darkReaderSepia')} /> 390 <Slider field={form.$('darkReaderSepia')} />
391 </> 391 </>
392 ) 392 )}
393 }
394 </div> 393 </div>
395 </div> 394 </div>
396 <div className="service-icon"> 395 <div className="service-icon">
@@ -425,7 +424,7 @@ export default @observer class EditServiceForm extends Component {
425 </h3> 424 </h3>
426 <Toggle field={form.$('proxy.isEnabled')} /> 425 <Toggle field={form.$('proxy.isEnabled')} />
427 {form.$('proxy.isEnabled').value && ( 426 {form.$('proxy.isEnabled').value && (
428 <Fragment> 427 <>
429 <div className="grid"> 428 <div className="grid">
430 <div className="grid__row"> 429 <div className="grid__row">
431 <Input field={form.$('proxy.host')} className="proxyHost" /> 430 <Input field={form.$('proxy.host')} className="proxyHost" />
@@ -449,7 +448,7 @@ export default @observer class EditServiceForm extends Component {
449 <span className="mdi mdi-information" /> 448 <span className="mdi mdi-information" />
450 {intl.formatMessage(messages.proxyInfo)} 449 {intl.formatMessage(messages.proxyInfo)}
451 </p> 450 </p>
452 </Fragment> 451 </>
453 )} 452 )}
454 </div> 453 </div>
455 </PremiumFeatureContainer> 454 </PremiumFeatureContainer>
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 4ba7dc720..98a119bfa 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -567,7 +567,7 @@ export default @observer class EditSettingsForm extends Component {
567 condition={!isSpellcheckerIncludedInCurrentPlan} 567 condition={!isSpellcheckerIncludedInCurrentPlan}
568 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }} 568 gaEventInfo={{ category: 'User', event: 'upgrade', label: 'spellchecker' }}
569 > 569 >
570 <Fragment> 570 <>
571 <Toggle 571 <Toggle
572 field={form.$('enableSpellchecking')} 572 field={form.$('enableSpellchecking')}
573 /> 573 />
@@ -577,7 +577,7 @@ export default @observer class EditSettingsForm extends Component {
577 {isMac && form.$('enableSpellchecking').value && ( 577 {isMac && form.$('enableSpellchecking').value && (
578 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p> 578 <p>{intl.formatMessage(messages.spellCheckerLanguageInfo)}</p>
579 )} 579 )}
580 </Fragment> 580 </>
581 </PremiumFeatureContainer> 581 </PremiumFeatureContainer>
582 <a 582 <a
583 href={FRANZ_TRANSLATION} 583 href={FRANZ_TRANSLATION}
@@ -679,18 +679,15 @@ export default @observer class EditSettingsForm extends Component {
679 <br /> 679 <br />
680 {intl.formatMessage(messages.updateStatusUpToDate)} 680 {intl.formatMessage(messages.updateStatusUpToDate)}
681 </> 681 </>
682 ) 682 )}
683 }
684 <p className="settings__message"> 683 <p className="settings__message">
685 <span className="mdi mdi-github-face" /> 684 <span className="mdi mdi-github-face" />
686 <span> 685 <span>
687 686
688
689 Ferdi is based on 687 Ferdi is based on
690 {' '} 688 {' '}
691 <a href={`${GITHUB_FRANZ_URL}/franz`} target="_blank">Franz</a> 689 <a href={`${GITHUB_FRANZ_URL}/franz`} target="_blank">Franz</a>
692 690
693
694 , a project published 691 , a project published
695 under the 692 under the
696 {' '} 693 {' '}
diff --git a/src/components/settings/team/TeamDashboard.js b/src/components/settings/team/TeamDashboard.js
index f26f4cc0c..602d6e490 100644
--- a/src/components/settings/team/TeamDashboard.js
+++ b/src/components/settings/team/TeamDashboard.js
@@ -98,7 +98,6 @@ const styles = {
98 }, 98 },
99}; 99};
100 100
101
102export default @injectSheet(styles) @observer class TeamDashboard extends Component { 101export default @injectSheet(styles) @observer class TeamDashboard extends Component {
103 static propTypes = { 102 static propTypes = {
104 isLoading: PropTypes.bool.isRequired, 103 isLoading: PropTypes.bool.isRequired,
diff --git a/src/components/ui/ImageUpload.js b/src/components/ui/ImageUpload.js
index e831eb47b..6a8c7645f 100644
--- a/src/components/ui/ImageUpload.js
+++ b/src/components/ui/ImageUpload.js
@@ -55,7 +55,7 @@ export default @observer class ImageUpload extends Component {
55 </label> 55 </label>
56 <div className="image-upload"> 56 <div className="image-upload">
57 {(field.value && field.value !== 'delete') || this.state.path ? ( 57 {(field.value && field.value !== 'delete') || this.state.path ? (
58 <Fragment> 58 <>
59 <div 59 <div
60 className="image-upload__preview" 60 className="image-upload__preview"
61 style={{ 61 style={{
@@ -80,7 +80,7 @@ export default @observer class ImageUpload extends Component {
80 </button> 80 </button>
81 <div className="image-upload__action-background" /> 81 <div className="image-upload__action-background" />
82 </div> 82 </div>
83 </Fragment> 83 </>
84 ) : ( 84 ) : (
85 <Dropzone 85 <Dropzone
86 ref={(node) => { 86 ref={(node) => {
diff --git a/src/components/ui/InfoBar.js b/src/components/ui/InfoBar.js
index 612399e9f..bd2af2296 100644
--- a/src/components/ui/InfoBar.js
+++ b/src/components/ui/InfoBar.js
@@ -3,11 +3,21 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import Loader from 'react-loader'; 5import Loader from 'react-loader';
6import { defineMessages, intlShape } from 'react-intl';
6 7
7// import { oneOrManyChildElements } from '../../prop-types'; 8// import { oneOrManyChildElements } from '../../prop-types';
8import Appear from './effects/Appear'; 9import Appear from './effects/Appear';
9 10
10export default @observer class InfoBar extends Component { 11const messages = defineMessages({
12 hide: {
13 id: 'infobar.hide',
14 defaultMessage: '!!!Hide',
15 },
16});
17
18export default
19@observer
20class InfoBar extends Component {
11 static propTypes = { 21 static propTypes = {
12 // eslint-disable-next-line 22 // eslint-disable-next-line
13 children: PropTypes.any.isRequired, 23 children: PropTypes.any.isRequired,
@@ -32,6 +42,10 @@ export default @observer class InfoBar extends Component {
32 onHide: () => null, 42 onHide: () => null,
33 }; 43 };
34 44
45 static contextTypes = {
46 intl: intlShape,
47 };
48
35 render() { 49 render() {
36 const { 50 const {
37 children, 51 children,
@@ -45,6 +59,8 @@ export default @observer class InfoBar extends Component {
45 onHide, 59 onHide,
46 } = this.props; 60 } = this.props;
47 61
62 const { intl } = this.context;
63
48 let transitionName = 'slideUp'; 64 let transitionName = 'slideUp';
49 if (position === 'top') { 65 if (position === 'top') {
50 transitionName = 'slideDown'; 66 transitionName = 'slideDown';
@@ -63,11 +79,7 @@ export default @observer class InfoBar extends Component {
63 <div className="info-bar__content"> 79 <div className="info-bar__content">
64 {children} 80 {children}
65 {ctaLabel && ( 81 {ctaLabel && (
66 <button 82 <button type="button" className="info-bar__cta" onClick={onClick}>
67 type="button"
68 className="info-bar__cta"
69 onClick={onClick}
70 >
71 <Loader 83 <Loader
72 loaded={!ctaLoading} 84 loaded={!ctaLoading}
73 lines={10} 85 lines={10}
@@ -84,6 +96,7 @@ export default @observer class InfoBar extends Component {
84 type="button" 96 type="button"
85 className="info-bar__close mdi mdi-close" 97 className="info-bar__close mdi mdi-close"
86 onClick={onHide} 98 onClick={onHide}
99 aria-label={intl.formatMessage(messages.hide)}
87 /> 100 />
88 )} 101 )}
89 </Appear> 102 </Appear>
diff --git a/src/components/ui/Infobox.js b/src/components/ui/Infobox.js
index 0917ee9f0..73b48b957 100644
--- a/src/components/ui/Infobox.js
+++ b/src/components/ui/Infobox.js
@@ -3,8 +3,18 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import classnames from 'classnames'; 4import classnames from 'classnames';
5import Loader from 'react-loader'; 5import Loader from 'react-loader';
6import { defineMessages, intlShape } from 'react-intl';
6 7
7export default @observer class Infobox extends Component { 8const messages = defineMessages({
9 dismiss: {
10 id: 'infobox.dismiss',
11 defaultMessage: '!!!Dismiss',
12 },
13});
14
15export default
16@observer
17class Infobox extends Component {
8 static propTypes = { 18 static propTypes = {
9 children: PropTypes.any.isRequired, // eslint-disable-line 19 children: PropTypes.any.isRequired, // eslint-disable-line
10 icon: PropTypes.string, 20 icon: PropTypes.string,
@@ -28,6 +38,10 @@ export default @observer class Infobox extends Component {
28 onSeen: () => null, 38 onSeen: () => null,
29 }; 39 };
30 40
41 static contextTypes = {
42 intl: intlShape,
43 };
44
31 state = { 45 state = {
32 dismissed: false, 46 dismissed: false,
33 }; 47 };
@@ -49,6 +63,8 @@ export default @observer class Infobox extends Component {
49 onDismiss, 63 onDismiss,
50 } = this.props; 64 } = this.props;
51 65
66 const { intl } = this.context;
67
52 if (this.state.dismissed) { 68 if (this.state.dismissed) {
53 return null; 69 return null;
54 } 70 }
@@ -61,18 +77,10 @@ export default @observer class Infobox extends Component {
61 'infobox--default': !type, 77 'infobox--default': !type,
62 })} 78 })}
63 > 79 >
64 {icon && ( 80 {icon && <i className={`mdi mdi-${icon}`} />}
65 <i className={`mdi mdi-${icon}`} /> 81 <div className="infobox__content">{children}</div>
66 )}
67 <div className="infobox__content">
68 {children}
69 </div>
70 {ctaLabel && ( 82 {ctaLabel && (
71 <button 83 <button className="infobox__cta" onClick={ctaOnClick} type="button">
72 className="infobox__cta"
73 onClick={ctaOnClick}
74 type="button"
75 >
76 <Loader 84 <Loader
77 loaded={!ctaLoading} 85 loaded={!ctaLoading}
78 lines={10} 86 lines={10}
@@ -91,6 +99,7 @@ export default @observer class Infobox extends Component {
91 if (onDismiss) onDismiss(); 99 if (onDismiss) onDismiss();
92 }} 100 }}
93 className="infobox__delete mdi mdi-close" 101 className="infobox__delete mdi mdi-close"
102 aria-label={intl.formatMessage(messages.dismiss)}
94 /> 103 />
95 )} 104 )}
96 </div> 105 </div>
diff --git a/src/components/ui/Input.js b/src/components/ui/Input.js
index 4e3eb4ab8..7417fef1c 100644
--- a/src/components/ui/Input.js
+++ b/src/components/ui/Input.js
@@ -3,10 +3,20 @@ import PropTypes from 'prop-types';
3import { observer } from 'mobx-react'; 3import { observer } from 'mobx-react';
4import { Field } from 'mobx-react-form'; 4import { Field } from 'mobx-react-form';
5import classnames from 'classnames'; 5import classnames from 'classnames';
6import { defineMessages, intlShape } from 'react-intl';
6 7
7import { scorePassword as scorePasswordFunc } from '../../helpers/password-helpers'; 8import { scorePassword as scorePasswordFunc } from '../../helpers/password-helpers';
8 9
9export default @observer class Input extends Component { 10const messages = defineMessages({
11 passwordToggle: {
12 id: 'settings.app.form.passwordToggle',
13 defaultMessage: '!!!Password toggle',
14 },
15});
16
17export default
18@observer
19class Input extends Component {
10 static propTypes = { 20 static propTypes = {
11 field: PropTypes.instanceOf(Field).isRequired, 21 field: PropTypes.instanceOf(Field).isRequired,
12 className: PropTypes.string, 22 className: PropTypes.string,
@@ -28,10 +38,14 @@ export default @observer class Input extends Component {
28 suffix: '', 38 suffix: '',
29 }; 39 };
30 40
41 static contextTypes = {
42 intl: intlShape,
43 };
44
31 state = { 45 state = {
32 showPassword: false, 46 showPassword: false,
33 passwordScore: 0, 47 passwordScore: 0,
34 } 48 };
35 49
36 inputElement = null; 50 inputElement = null;
37 51
@@ -68,6 +82,8 @@ export default @observer class Input extends Component {
68 82
69 const { passwordScore } = this.state; 83 const { passwordScore } = this.state;
70 84
85 const { intl } = this.context;
86
71 let { type } = field; 87 let { type } = field;
72 if (type === 'password' && this.state.showPassword) { 88 if (type === 'password' && this.state.showPassword) {
73 type = 'text'; 89 type = 'text';
@@ -82,9 +98,7 @@ export default @observer class Input extends Component {
82 })} 98 })}
83 > 99 >
84 <div className="franz-form__input-wrapper"> 100 <div className="franz-form__input-wrapper">
85 {prefix && ( 101 {prefix && <span className="franz-form__input-prefix">{prefix}</span>}
86 <span className="franz-form__input-prefix">{prefix}</span>
87 )}
88 <input 102 <input
89 id={field.id} 103 id={field.id}
90 type={type} 104 type={type}
@@ -92,15 +106,15 @@ export default @observer class Input extends Component {
92 name={field.name} 106 name={field.name}
93 value={field.value} 107 value={field.value}
94 placeholder={field.placeholder} 108 placeholder={field.placeholder}
95 onChange={e => this.onChange(e)} 109 onChange={(e) => this.onChange(e)}
96 onBlur={field.onBlur} 110 onBlur={field.onBlur}
97 onFocus={field.onFocus} 111 onFocus={field.onFocus}
98 ref={(element) => { this.inputElement = element; }} 112 ref={(element) => {
113 this.inputElement = element;
114 }}
99 disabled={field.disabled} 115 disabled={field.disabled}
100 /> 116 />
101 {suffix && ( 117 {suffix && <span className="franz-form__input-suffix">{suffix}</span>}
102 <span className="franz-form__input-suffix">{suffix}</span>
103 )}
104 {showPasswordToggle && ( 118 {showPasswordToggle && (
105 <button 119 <button
106 type="button" 120 type="button"
@@ -110,8 +124,11 @@ export default @observer class Input extends Component {
110 'mdi-eye': !this.state.showPassword, 124 'mdi-eye': !this.state.showPassword,
111 'mdi-eye-off': this.state.showPassword, 125 'mdi-eye-off': this.state.showPassword,
112 })} 126 })}
113 onClick={() => this.setState(prevState => ({ showPassword: !prevState.showPassword }))} 127 onClick={() => this.setState((prevState) => ({
114 tabIndex="-1" 128 showPassword: !prevState.showPassword,
129 }))}
130 tabIndex={-1}
131 aria-label={intl.formatMessage(messages.passwordToggle)}
115 /> 132 />
116 )} 133 )}
117 {scorePassword && ( 134 {scorePassword && (
@@ -128,20 +145,11 @@ export default @observer class Input extends Component {
128 )} 145 )}
129 </div> 146 </div>
130 {field.label && showLabel && ( 147 {field.label && showLabel && (
131 <label 148 <label className="franz-form__label" htmlFor={field.name}>
132 className="franz-form__label"
133 htmlFor={field.name}
134 >
135 {field.label} 149 {field.label}
136 </label> 150 </label>
137 )} 151 )}
138 {field.error && ( 152 {field.error && <div className="franz-form__error">{field.error}</div>}
139 <div
140 className="franz-form__error"
141 >
142 {field.error}
143 </div>
144 )}
145 </div> 153 </div>
146 ); 154 );
147 } 155 }
diff --git a/src/components/ui/Tabs/TabItem.js b/src/components/ui/Tabs/TabItem.js
index 16881a7f7..546b05a4e 100644
--- a/src/components/ui/Tabs/TabItem.js
+++ b/src/components/ui/Tabs/TabItem.js
@@ -11,7 +11,7 @@ export default class TabItem extends Component {
11 const { children } = this.props; 11 const { children } = this.props;
12 12
13 return ( 13 return (
14 <Fragment>{children}</Fragment> 14 <>{children}</>
15 ); 15 );
16 } 16 }
17} 17}
diff --git a/src/components/ui/Tabs/Tabs.js b/src/components/ui/Tabs/Tabs.js
index 196cddc66..7ece29fbe 100644
--- a/src/components/ui/Tabs/Tabs.js
+++ b/src/components/ui/Tabs/Tabs.js
@@ -5,7 +5,9 @@ import classnames from 'classnames';
5 5
6import { oneOrManyChildElements } from '../../../prop-types'; 6import { oneOrManyChildElements } from '../../../prop-types';
7 7
8export default @observer class Tab extends Component { 8export default
9@observer
10class Tab extends Component {
9 static propTypes = { 11 static propTypes = {
10 children: oneOrManyChildElements.isRequired, 12 children: oneOrManyChildElements.isRequired,
11 active: PropTypes.number, 13 active: PropTypes.number,
@@ -15,7 +17,7 @@ export default @observer class Tab extends Component {
15 active: 0, 17 active: 0,
16 }; 18 };
17 19
18 componentWillMount() { 20 componentDidMount() {
19 this.setState({ active: this.props.active }); 21 this.setState({ active: this.props.active });
20 } 22 }
21 23
@@ -25,7 +27,7 @@ export default @observer class Tab extends Component {
25 27
26 render() { 28 render() {
27 const { children: childElements } = this.props; 29 const { children: childElements } = this.props;
28 const children = childElements.filter(c => !!c); 30 const children = childElements.filter((c) => !!c);
29 31
30 if (children.length === 1) { 32 if (children.length === 1) {
31 return <div>{children}</div>; 33 return <div>{children}</div>;
diff --git a/src/containers/settings/AccountScreen.js b/src/containers/settings/AccountScreen.js
index 2c9cac084..db3b2a4a7 100644
--- a/src/containers/settings/AccountScreen.js
+++ b/src/containers/settings/AccountScreen.js
@@ -85,8 +85,7 @@ class AccountScreen extends Component {
85 openEditAccount={() => this.handleWebsiteLink('/user/profile')} 85 openEditAccount={() => this.handleWebsiteLink('/user/profile')}
86 upgradeToPro={() => upgradeAccount({ 86 upgradeToPro={() => upgradeAccount({
87 planId: features.features.pricingConfig.plans.pro.yearly.id, 87 planId: features.features.pricingConfig.plans.pro.yearly.id,
88 }) 88 })}
89 }
90 openBilling={() => this.handleWebsiteLink('/user/billing')} 89 openBilling={() => this.handleWebsiteLink('/user/billing')}
91 openInvoices={() => this.handleWebsiteLink('/user/invoices')} 90 openInvoices={() => this.handleWebsiteLink('/user/invoices')}
92 /> 91 />
diff --git a/src/containers/settings/SettingsWindow.js b/src/containers/settings/SettingsWindow.js
index 89c2aaa27..9bb64b6fe 100644
--- a/src/containers/settings/SettingsWindow.js
+++ b/src/containers/settings/SettingsWindow.js
@@ -28,7 +28,6 @@ export default @inject('stores', 'actions') @observer class SettingsContainer ex
28 const { children, stores } = this.props; 28 const { children, stores } = this.props;
29 const { closeSettings } = this.props.actions.ui; 29 const { closeSettings } = this.props.actions.ui;
30 30
31
32 const navigation = ( 31 const navigation = (
33 <Navigation 32 <Navigation
34 serviceCount={stores.services.all.length} 33 serviceCount={stores.services.all.length}
diff --git a/src/containers/subscription/SubscriptionPopupScreen.js b/src/containers/subscription/SubscriptionPopupScreen.js
index 0de5a87c4..43966b6a4 100644
--- a/src/containers/subscription/SubscriptionPopupScreen.js
+++ b/src/containers/subscription/SubscriptionPopupScreen.js
@@ -5,7 +5,6 @@ import { inject, observer } from 'mobx-react';
5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup'; 5import SubscriptionPopup from '../../components/subscription/SubscriptionPopup';
6import { isDevMode } from '../../environment'; 6import { isDevMode } from '../../environment';
7 7
8
9export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component { 8export default @inject('stores', 'actions') @observer class SubscriptionPopupScreen extends Component {
10 state = { 9 state = {
11 complete: false, 10 complete: false,
@@ -33,7 +32,6 @@ export default @inject('stores', 'actions') @observer class SubscriptionPopupScr
33 } 32 }
34} 33}
35 34
36
37SubscriptionPopupScreen.wrappedComponent.propTypes = { 35SubscriptionPopupScreen.wrappedComponent.propTypes = {
38 router: PropTypes.shape({ 36 router: PropTypes.shape({
39 params: PropTypes.shape({ 37 params: PropTypes.shape({
diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js
index 659cb4961..21964b108 100644
--- a/src/features/announcements/components/AnnouncementScreen.js
+++ b/src/features/announcements/components/AnnouncementScreen.js
@@ -185,7 +185,6 @@ const styles = theme => ({
185 }, 185 },
186}); 186});
187 187
188
189@inject('stores', 'actions') @injectSheet(styles) @observer 188@inject('stores', 'actions') @injectSheet(styles) @observer
190class AnnouncementScreen extends Component { 189class AnnouncementScreen extends Component {
191 static propTypes = { 190 static propTypes = {
diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js
index 369ded1b2..28f0b10ed 100644
--- a/src/features/announcements/index.js
+++ b/src/features/announcements/index.js
@@ -7,7 +7,6 @@ export const GA_CATEGORY_ANNOUNCEMENTS = 'Announcements';
7 7
8export const announcementsStore = new AnnouncementsStore(); 8export const announcementsStore = new AnnouncementsStore();
9 9
10
11export default function initAnnouncements(stores, actions) { 10export default function initAnnouncements(stores, actions) {
12 const { features } = stores; 11 const { features } = stores;
13 12
diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js
index 5ef01a47e..f0c2bdc82 100644
--- a/src/features/delayApp/index.js
+++ b/src/features/delayApp/index.js
@@ -59,7 +59,6 @@ export default function init(stores) {
59 59
60 setVisibility(true); 60 setVisibility(true);
61 61
62
63 setTimeout(() => { 62 setTimeout(() => {
64 debug('Resetting app delay'); 63 debug('Resetting app delay');
65 64
diff --git a/src/features/planSelection/components/PlanItem.js b/src/features/planSelection/components/PlanItem.js
index 3855fedf1..e90532dec 100644
--- a/src/features/planSelection/components/PlanItem.js
+++ b/src/features/planSelection/components/PlanItem.js
@@ -111,7 +111,6 @@ const styles = theme => ({
111 }, 111 },
112}); 112});
113 113
114
115export default @observer @injectSheet(styles) class PlanItem extends Component { 114export default @observer @injectSheet(styles) class PlanItem extends Component {
116 static propTypes = { 115 static propTypes = {
117 name: PropTypes.string.isRequired, 116 name: PropTypes.string.isRequired,
diff --git a/src/features/publishDebugInfo/Component.js b/src/features/publishDebugInfo/Component.js
index 4308b8f09..e7949a0be 100644
--- a/src/features/publishDebugInfo/Component.js
+++ b/src/features/publishDebugInfo/Component.js
@@ -13,7 +13,6 @@ import { DEBUG_API } from '../../config';
13import AppStore from '../../stores/AppStore'; 13import AppStore from '../../stores/AppStore';
14import ServicesStore from '../../stores/ServicesStore'; 14import ServicesStore from '../../stores/ServicesStore';
15 15
16
17const messages = defineMessages({ 16const messages = defineMessages({
18 title: { 17 title: {
19 id: 'feature.publishDebugInfo.title', 18 id: 'feature.publishDebugInfo.title',
diff --git a/src/features/serviceLimit/components/LimitReachedInfobox.js b/src/features/serviceLimit/components/LimitReachedInfobox.js
index 83aec4c40..424c92990 100644
--- a/src/features/serviceLimit/components/LimitReachedInfobox.js
+++ b/src/features/serviceLimit/components/LimitReachedInfobox.js
@@ -34,7 +34,6 @@ const styles = theme => ({
34 }, 34 },
35}); 35});
36 36
37
38@inject('stores', 'actions') @injectSheet(styles) @observer 37@inject('stores', 'actions') @injectSheet(styles) @observer
39class LimitReachedInfobox extends Component { 38class LimitReachedInfobox extends Component {
40 static propTypes = { 39 static propTypes = {
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index dccb818a6..ca8460f94 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -7,7 +7,7 @@ import classnames from 'classnames';
7 7
8import { TODOS_PARTITION_ID } from '../../../config'; 8import { TODOS_PARTITION_ID } from '../../../config';
9 9
10const styles = theme => ({ 10const styles = (theme) => ({
11 root: { 11 root: {
12 background: theme.colorBackground, 12 background: theme.colorBackground,
13 position: 'relative', 13 position: 'relative',
@@ -34,7 +34,6 @@ const styles = theme => ({
34 width: 5, 34 width: 5,
35 zIndex: 400, 35 zIndex: 400,
36 background: theme.todos.dragIndicator.background, 36 background: theme.todos.dragIndicator.background,
37
38 }, 37 },
39 premiumContainer: { 38 premiumContainer: {
40 display: 'flex', 39 display: 'flex',
@@ -68,7 +67,8 @@ const styles = theme => ({
68 }, 67 },
69}); 68});
70 69
71@injectSheet(styles) @observer 70@injectSheet(styles)
71@observer
72class TodosWebview extends Component { 72class TodosWebview extends Component {
73 static propTypes = { 73 static propTypes = {
74 classes: PropTypes.object.isRequired, 74 classes: PropTypes.object.isRequired,
@@ -89,15 +89,11 @@ class TodosWebview extends Component {
89 width: 300, 89 width: 300,
90 }; 90 };
91 91
92 componentWillMount() { 92 componentDidMount() {
93 const { width } = this.props;
94
95 this.setState({ 93 this.setState({
96 width, 94 width: this.props.width,
97 }); 95 });
98 }
99 96
100 componentDidMount() {
101 this.node.addEventListener('mousemove', this.resizePanel.bind(this)); 97 this.node.addEventListener('mousemove', this.resizePanel.bind(this));
102 this.node.addEventListener('mouseup', this.stopResize.bind(this)); 98 this.node.addEventListener('mouseup', this.stopResize.bind(this));
103 this.node.addEventListener('mouseleave', this.stopResize.bind(this)); 99 this.node.addEventListener('mouseleave', this.stopResize.bind(this));
@@ -114,10 +110,7 @@ class TodosWebview extends Component {
114 resizePanel(e) { 110 resizePanel(e) {
115 const { minWidth } = this.props; 111 const { minWidth } = this.props;
116 112
117 const { 113 const { isDragging, initialPos } = this.state;
118 isDragging,
119 initialPos,
120 } = this.state;
121 114
122 if (isDragging && Math.abs(e.clientX - window.innerWidth) > minWidth) { 115 if (isDragging && Math.abs(e.clientX - window.innerWidth) > minWidth) {
123 const delta = e.clientX - initialPos; 116 const delta = e.clientX - initialPos;
@@ -129,16 +122,9 @@ class TodosWebview extends Component {
129 } 122 }
130 123
131 stopResize() { 124 stopResize() {
132 const { 125 const { resize, minWidth } = this.props;
133 resize,
134 minWidth,
135 } = this.props;
136 126
137 const { 127 const { isDragging, delta, width } = this.state;
138 isDragging,
139 delta,
140 width,
141 } = this.state;
142 128
143 if (isDragging) { 129 if (isDragging) {
144 let newWidth = width + (delta < 0 ? Math.abs(delta) : -Math.abs(delta)); 130 let newWidth = width + (delta < 0 ? Math.abs(delta) : -Math.abs(delta));
@@ -176,11 +162,7 @@ class TodosWebview extends Component {
176 isTodoUrlValid, 162 isTodoUrlValid,
177 } = this.props; 163 } = this.props;
178 164
179 const { 165 const { width, delta, isDragging } = this.state;
180 width,
181 delta,
182 isDragging,
183 } = this.state;
184 166
185 let displayedWidth = isVisible ? width : 0; 167 let displayedWidth = isVisible ? width : 0;
186 if (isTodosServiceActive) { 168 if (isTodosServiceActive) {
@@ -197,13 +179,18 @@ class TodosWebview extends Component {
197 })} 179 })}
198 style={{ width: displayedWidth }} 180 style={{ width: displayedWidth }}
199 onMouseUp={() => this.stopResize()} 181 onMouseUp={() => this.stopResize()}
200 ref={(node) => { this.node = node; }} 182 ref={(node) => {
183 this.node = node;
184 }}
201 id="todos-panel" 185 id="todos-panel"
202 > 186 >
203 <div 187 <div
204 className={classes.resizeHandler} 188 className={classes.resizeHandler}
205 style={Object.assign({ left: delta }, isDragging ? { width: 600, marginLeft: -200 } : {})} // This hack is required as resizing with webviews beneath behaves quite bad 189 style={{
206 onMouseDown={e => this.startResize(e)} 190 left: delta,
191 ...(isDragging ? { width: 600, marginLeft: -200 } : {}),
192 }} // This hack is required as resizing with webviews beneath behaves quite bad
193 onMouseDown={(e) => this.startResize(e)}
207 /> 194 />
208 {isDragging && ( 195 {isDragging && (
209 <div 196 <div
@@ -221,7 +208,9 @@ class TodosWebview extends Component {
221 }} 208 }}
222 partition={TODOS_PARTITION_ID} 209 partition={TODOS_PARTITION_ID}
223 preload="./features/todos/preload.js" 210 preload="./features/todos/preload.js"
224 ref={(webview) => { this.webview = webview ? webview.view : null; }} 211 ref={(webview) => {
212 this.webview = webview ? webview.view : null;
213 }}
225 useragent={userAgent} 214 useragent={userAgent}
226 src={todoUrl} 215 src={todoUrl}
227 /> 216 />
diff --git a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
index 715251854..e0f5ab5f2 100644
--- a/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
+++ b/src/features/trialStatusBar/containers/TrialStatusBarScreen.js
@@ -12,7 +12,8 @@ import { trialStatusBarStore } from '..';
12import { i18nPlanName } from '../../../helpers/plan-helpers'; 12import { i18nPlanName } from '../../../helpers/plan-helpers';
13import PaymentStore from '../../../stores/PaymentStore'; 13import PaymentStore from '../../../stores/PaymentStore';
14 14
15@inject('stores', 'actions') @observer 15@inject('stores', 'actions')
16@observer
16class TrialStatusBarScreen extends Component { 17class TrialStatusBarScreen extends Component {
17 static contextTypes = { 18 static contextTypes = {
18 intl: intlShape, 19 intl: intlShape,
@@ -41,7 +42,9 @@ class TrialStatusBarScreen extends Component {
41 42
42 calculateRestTime() { 43 calculateRestTime() {
43 const { trialEndTime } = trialStatusBarStore; 44 const { trialEndTime } = trialStatusBarStore;
44 const percent = Math.abs(100 - Math.abs(trialEndTime.asMilliseconds()) * 100 / ms('14d')).toFixed(2); 45 const percent = (
46 Math.abs(100 - Math.abs(trialEndTime.asMilliseconds()) * 100) / ms('14d')
47 ).toFixed(2);
45 const restTime = trialEndTime.humanize(); 48 const restTime = trialEndTime.humanize();
46 const hasEnded = trialEndTime.asMilliseconds() > 0; 49 const hasEnded = trialEndTime.asMilliseconds() > 0;
47 50
@@ -58,18 +61,19 @@ class TrialStatusBarScreen extends Component {
58 }); 61 });
59 } 62 }
60 63
61
62 render() { 64 render() {
63 const { intl } = this.context; 65 const { intl } = this.context;
64 66
65 const { 67 const {
66 showOverlay, 68 showOverlay, percent, restTime, hasEnded,
67 percent,
68 restTime,
69 hasEnded,
70 } = this.state; 69 } = this.state;
71 70
72 if (!trialStatusBarStore || !trialStatusBarStore.isFeatureActive || !showOverlay || !trialStatusBarStore.showTrialStatusBarOverlay) { 71 if (
72 !trialStatusBarStore
73 || !trialStatusBarStore.isFeatureActive
74 || !showOverlay
75 || !trialStatusBarStore.showTrialStatusBarOverlay
76 ) {
73 return null; 77 return null;
74 } 78 }
75 79
diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js
index f23bc6cbf..0ff836cba 100644
--- a/src/features/workspaces/components/EditWorkspaceForm.js
+++ b/src/features/workspaces/components/EditWorkspaceForm.js
@@ -40,7 +40,8 @@ const messages = defineMessages({
40 }, 40 },
41 keepLoadedInfo: { 41 keepLoadedInfo: {
42 id: 'settings.workspace.form.keepLoadedInfo', 42 id: 'settings.workspace.form.keepLoadedInfo',
43 defaultMessage: '!!!*This option will be overwritten by the global "Keep all workspaces loaded" option.', 43 defaultMessage:
44 '!!!*This option will be overwritten by the global "Keep all workspaces loaded" option.',
44 }, 45 },
45 servicesInWorkspaceHeadline: { 46 servicesInWorkspaceHeadline: {
46 id: 'settings.workspace.form.servicesInWorkspaceHeadline', 47 id: 'settings.workspace.form.servicesInWorkspaceHeadline',
@@ -68,7 +69,8 @@ const styles = () => ({
68 }, 69 },
69}); 70});
70 71
71@injectSheet(styles) @observer 72@injectSheet(styles)
73@observer
72class EditWorkspaceForm extends Component { 74class EditWorkspaceForm extends Component {
73 static contextTypes = { 75 static contextTypes = {
74 intl: intlShape, 76 intl: intlShape,
@@ -86,6 +88,7 @@ class EditWorkspaceForm extends Component {
86 88
87 form = this.prepareWorkspaceForm(this.props.workspace); 89 form = this.prepareWorkspaceForm(this.props.workspace);
88 90
91 // eslint-disable-next-line react/no-deprecated
89 componentWillReceiveProps(nextProps) { 92 componentWillReceiveProps(nextProps) {
90 const { workspace } = this.props; 93 const { workspace } = this.props;
91 if (workspace.id !== nextProps.workspace.id) { 94 if (workspace.id !== nextProps.workspace.id) {
@@ -164,16 +167,14 @@ class EditWorkspaceForm extends Component {
164 </Link> 167 </Link>
165 </span> 168 </span>
166 <span className="separator" /> 169 <span className="separator" />
167 <span className="settings__header-item"> 170 <span className="settings__header-item">{workspace.name}</span>
168 {workspace.name}
169 </span>
170 </div> 171 </div>
171 <div className="settings__body"> 172 <div className="settings__body">
172 <div className={classes.nameInput}> 173 <div className={classes.nameInput}>
173 <Input {...form.$('name').bind()} /> 174 <Input {...form.$('name').bind()} />
174 <Toggle field={form.$('keepLoaded')} /> 175 <Toggle field={form.$('keepLoaded')} />
175 <p className={`${classes.keepLoadedInfo} franz-form__label`}> 176 <p className={`${classes.keepLoadedInfo} franz-form__label`}>
176 { intl.formatMessage(messages.keepLoadedInfo) } 177 {intl.formatMessage(messages.keepLoadedInfo)}
177 </p> 178 </p>
178 </div> 179 </div>
179 <h2>{intl.formatMessage(messages.servicesInWorkspaceHeadline)}</h2> 180 <h2>{intl.formatMessage(messages.servicesInWorkspaceHeadline)}</h2>
@@ -187,11 +188,13 @@ class EditWorkspaceForm extends Component {
187 </span> 188 </span>
188 {intl.formatMessage(messages.noServicesAdded)} 189 {intl.formatMessage(messages.noServicesAdded)}
189 </p> 190 </p>
190 <Link to="/settings/recipes" className="button">{intl.formatMessage(messages.discoverServices)}</Link> 191 <Link to="/settings/recipes" className="button">
192 {intl.formatMessage(messages.discoverServices)}
193 </Link>
191 </div> 194 </div>
192 ) : ( 195 ) : (
193 <Fragment> 196 <>
194 {services.map(s => ( 197 {services.map((s) => (
195 <WorkspaceServiceListItem 198 <WorkspaceServiceListItem
196 key={s.id} 199 key={s.id}
197 service={s} 200 service={s}
@@ -199,7 +202,7 @@ class EditWorkspaceForm extends Component {
199 onToggle={() => this.toggleService(s)} 202 onToggle={() => this.toggleService(s)}
200 /> 203 />
201 ))} 204 ))}
202 </Fragment> 205 </>
203 )} 206 )}
204 </div> 207 </div>
205 </div> 208 </div>
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index a90bb37e9..cfaacd56e 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -184,7 +184,7 @@ class WorkspacesDashboard extends Component {
184 {getUserWorkspacesRequest.isExecuting ? ( 184 {getUserWorkspacesRequest.isExecuting ? (
185 <Loader /> 185 <Loader />
186 ) : ( 186 ) : (
187 <Fragment> 187 <>
188 {/* ===== Workspace could not be loaded error ===== */} 188 {/* ===== Workspace could not be loaded error ===== */}
189 {getUserWorkspacesRequest.error ? ( 189 {getUserWorkspacesRequest.error ? (
190 <Infobox 190 <Infobox
@@ -197,7 +197,7 @@ class WorkspacesDashboard extends Component {
197 {intl.formatMessage(messages.workspacesRequestFailed)} 197 {intl.formatMessage(messages.workspacesRequestFailed)}
198 </Infobox> 198 </Infobox>
199 ) : ( 199 ) : (
200 <Fragment> 200 <>
201 {workspaces.length === 0 ? ( 201 {workspaces.length === 0 ? (
202 <div className="align-middle settings__empty-state"> 202 <div className="align-middle settings__empty-state">
203 {/* ===== Workspaces empty state ===== */} 203 {/* ===== Workspaces empty state ===== */}
@@ -222,9 +222,9 @@ class WorkspacesDashboard extends Component {
222 </tbody> 222 </tbody>
223 </table> 223 </table>
224 )} 224 )}
225 </Fragment> 225 </>
226 )} 226 )}
227 </Fragment> 227 </>
228 )} 228 )}
229 </> 229 </>
230 )} 230 )}
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js
index 5eca71259..ba7606031 100644
--- a/src/features/workspaces/containers/EditWorkspaceScreen.js
+++ b/src/features/workspaces/containers/EditWorkspaceScreen.js
@@ -32,9 +32,7 @@ class EditWorkspaceScreen extends Component {
32 const { workspaceBeingEdited } = workspaceStore; 32 const { workspaceBeingEdited } = workspaceStore;
33 const { actions } = this.props; 33 const { actions } = this.props;
34 const workspace = new Workspace( 34 const workspace = new Workspace(
35 Object.assign({ 35 ({ saving: true, ...workspaceBeingEdited, ...values }),
36 saving: true,
37 }, workspaceBeingEdited, values),
38 ); 36 );
39 actions.workspaces.update({ workspace }); 37 actions.workspaces.update({ workspace });
40 }; 38 };
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index bddcb6eb4..632f3c299 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -1,8 +1,4 @@
1import { 1import { computed, observable, action } from 'mobx';
2 computed,
3 observable,
4 action,
5} from 'mobx';
6import localStorage from 'mobx-localstorage'; 2import localStorage from 'mobx-localstorage';
7import { matchRoute } from '../../helpers/routing-helpers'; 3import { matchRoute } from '../../helpers/routing-helpers';
8import { workspaceActions } from './actions'; 4import { workspaceActions } from './actions';
@@ -105,7 +101,10 @@ export default class WorkspacesStore extends FeatureStore {
105 [workspaceActions.update, this._update], 101 [workspaceActions.update, this._update],
106 [workspaceActions.activate, this._setActiveWorkspace], 102 [workspaceActions.activate, this._setActiveWorkspace],
107 [workspaceActions.deactivate, this._deactivateActiveWorkspace], 103 [workspaceActions.deactivate, this._deactivateActiveWorkspace],
108 [workspaceActions.toggleKeepAllWorkspacesLoadedSetting, this._toggleKeepAllWorkspacesLoadedSetting], 104 [
105 workspaceActions.toggleKeepAllWorkspacesLoadedSetting,
106 this._toggleKeepAllWorkspacesLoadedSetting,
107 ],
109 ]); 108 ]);
110 this._allActions = this._freeUserActions.concat(this._premiumUserActions); 109 this._allActions = this._freeUserActions.concat(this._premiumUserActions);
111 this._registerActions(this._allActions); 110 this._registerActions(this._allActions);
@@ -124,7 +123,9 @@ export default class WorkspacesStore extends FeatureStore {
124 this._activateLastUsedWorkspaceReaction, 123 this._activateLastUsedWorkspaceReaction,
125 this._setWorkspaceBeingEditedReaction, 124 this._setWorkspaceBeingEditedReaction,
126 ]); 125 ]);
127 this._allReactions = this._freeUserReactions.concat(this._premiumUserReactions); 126 this._allReactions = this._freeUserReactions.concat(
127 this._premiumUserReactions,
128 );
128 129
129 this._registerReactions(this._allReactions); 130 this._registerReactions(this._allReactions);
130 131
@@ -157,12 +158,12 @@ export default class WorkspacesStore extends FeatureStore {
157 158
158 getWorkspaceServices(workspace) { 159 getWorkspaceServices(workspace) {
159 const { services } = this.stores; 160 const { services } = this.stores;
160 return workspace.services.map(id => services.one(id)).filter(s => !!s); 161 return workspace.services.map((id) => services.one(id)).filter((s) => !!s);
161 } 162 }
162 163
163 // ========== PRIVATE METHODS ========= // 164 // ========== PRIVATE METHODS ========= //
164 165
165 _getWorkspaceById = id => this.workspaces.find(w => w.id === id); 166 _getWorkspaceById = (id) => this.workspaces.find((w) => w.id === id);
166 167
167 _updateSettings = (changes) => { 168 _updateSettings = (changes) => {
168 localStorage.setItem('workspaces', { 169 localStorage.setItem('workspaces', {
@@ -178,6 +179,7 @@ export default class WorkspacesStore extends FeatureStore {
178 }; 179 };
179 180
180 @action _create = async ({ name }) => { 181 @action _create = async ({ name }) => {
182 // eslint-disable-next-line no-useless-catch
181 try { 183 try {
182 const workspace = await createWorkspaceRequest.execute(name); 184 const workspace = await createWorkspaceRequest.execute(name);
183 await getUserWorkspacesRequest.result.push(workspace); 185 await getUserWorkspacesRequest.result.push(workspace);
@@ -188,6 +190,7 @@ export default class WorkspacesStore extends FeatureStore {
188 }; 190 };
189 191
190 @action _delete = async ({ workspace }) => { 192 @action _delete = async ({ workspace }) => {
193 // eslint-disable-next-line no-useless-catch
191 try { 194 try {
192 await deleteWorkspaceRequest.execute(workspace); 195 await deleteWorkspaceRequest.execute(workspace);
193 await getUserWorkspacesRequest.result.remove(workspace); 196 await getUserWorkspacesRequest.result.remove(workspace);
@@ -198,6 +201,7 @@ export default class WorkspacesStore extends FeatureStore {
198 }; 201 };
199 202
200 @action _update = async ({ workspace }) => { 203 @action _update = async ({ workspace }) => {
204 // eslint-disable-next-line no-useless-catch
201 try { 205 try {
202 await updateWorkspaceRequest.execute(workspace); 206 await updateWorkspaceRequest.execute(workspace);
203 // Path local result optimistically 207 // Path local result optimistically
@@ -235,7 +239,9 @@ export default class WorkspacesStore extends FeatureStore {
235 this.activeWorkspace = null; 239 this.activeWorkspace = null;
236 }, 100); 240 }, 100);
237 // Indicate that we are done switching to the default workspace 241 // Indicate that we are done switching to the default workspace
238 setTimeout(() => { this.isSwitchingWorkspace = false; }, 1000); 242 setTimeout(() => {
243 this.isSwitchingWorkspace = false;
244 }, 1000);
239 }; 245 };
240 246
241 @action _toggleWorkspaceDrawer = () => { 247 @action _toggleWorkspaceDrawer = () => {
@@ -255,7 +261,9 @@ export default class WorkspacesStore extends FeatureStore {
255 }; 261 };
256 262
257 _toggleKeepAllWorkspacesLoadedSetting = async () => { 263 _toggleKeepAllWorkspacesLoadedSetting = async () => {
258 this._updateSettings({ keepAllWorkspacesLoaded: !this.settings.keepAllWorkspacesLoaded }); 264 this._updateSettings({
265 keepAllWorkspacesLoaded: !this.settings.keepAllWorkspacesLoaded,
266 });
259 }; 267 };
260 268
261 // Reactions 269 // Reactions
@@ -309,7 +317,9 @@ export default class WorkspacesStore extends FeatureStore {
309 317
310 _openDrawerWithSettingsReaction = () => { 318 _openDrawerWithSettingsReaction = () => {
311 const { router } = this.stores; 319 const { router } = this.stores;
312 const isWorkspaceSettingsRoute = router.location.pathname.includes(WORKSPACES_ROUTES.ROOT); 320 const isWorkspaceSettingsRoute = router.location.pathname.includes(
321 WORKSPACES_ROUTES.ROOT,
322 );
313 const isSwitchingToSettingsRoute = !this.isSettingsRouteActive && isWorkspaceSettingsRoute; 323 const isSwitchingToSettingsRoute = !this.isSettingsRouteActive && isWorkspaceSettingsRoute;
314 const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this.isSettingsRouteActive; 324 const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this.isSettingsRouteActive;
315 325
@@ -321,7 +331,10 @@ export default class WorkspacesStore extends FeatureStore {
321 } 331 }
322 } else if (isLeavingSettingsRoute) { 332 } else if (isLeavingSettingsRoute) {
323 this.isSettingsRouteActive = false; 333 this.isSettingsRouteActive = false;
324 if (!this._wasDrawerOpenBeforeSettingsRoute && this.isWorkspaceDrawerOpen) { 334 if (
335 !this._wasDrawerOpenBeforeSettingsRoute
336 && this.isWorkspaceDrawerOpen
337 ) {
325 workspaceActions.toggleWorkspaceDrawer(); 338 workspaceActions.toggleWorkspaceDrawer();
326 } 339 }
327 } 340 }
@@ -334,7 +347,11 @@ export default class WorkspacesStore extends FeatureStore {
334 // Loop through all workspaces and remove invalid service ids (locally) 347 // Loop through all workspaces and remove invalid service ids (locally)
335 this.workspaces.forEach((workspace) => { 348 this.workspaces.forEach((workspace) => {
336 workspace.services.forEach((serviceId) => { 349 workspace.services.forEach((serviceId) => {
337 if (servicesHaveBeenLoaded && !services.one(serviceId) && serviceId !== KEEP_WS_LOADED_USID) { 350 if (
351 servicesHaveBeenLoaded
352 && !services.one(serviceId)
353 && serviceId !== KEEP_WS_LOADED_USID
354 ) {
338 workspace.services.remove(serviceId); 355 workspace.services.remove(serviceId);
339 } 356 }
340 }); 357 });
@@ -351,5 +368,5 @@ export default class WorkspacesStore extends FeatureStore {
351 this._startActions(this._premiumUserActions); 368 this._startActions(this._premiumUserActions);
352 this._startReactions(this._premiumUserReactions); 369 this._startReactions(this._premiumUserReactions);
353 } 370 }
354 } 371 };
355} 372}
diff --git a/src/i18n/apply-branding.js b/src/i18n/apply-branding.js
index 68ffb822a..40a07ded0 100644
--- a/src/i18n/apply-branding.js
+++ b/src/i18n/apply-branding.js
@@ -36,7 +36,6 @@ const replace = {
36 '!!!': '', 36 '!!!': '',
37}; 37};
38 38
39
40const locales = path.join(__dirname, 'locales'); 39const locales = path.join(__dirname, 'locales');
41const files = fs.readdirSync(locales); 40const files = fs.readdirSync(locales);
42 41
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 8401184de..4ee96822e 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -664,169 +664,169 @@
664 "defaultMessage": "!!!Hi {name}, welcome to Franz", 664 "defaultMessage": "!!!Hi {name}, welcome to Franz",
665 "end": { 665 "end": {
666 "column": 3, 666 "column": 3,
667 "line": 18 667 "line": 17
668 }, 668 },
669 "file": "src/components/auth/Pricing.js", 669 "file": "src/components/auth/Pricing.js",
670 "id": "pricing.trial.headline.pro", 670 "id": "pricing.trial.headline.pro",
671 "start": { 671 "start": {
672 "column": 12, 672 "column": 12,
673 "line": 15 673 "line": 14
674 } 674 }
675 }, 675 },
676 { 676 {
677 "defaultMessage": "!!!We have a special treat for you.", 677 "defaultMessage": "!!!We have a special treat for you.",
678 "end": { 678 "end": {
679 "column": 3, 679 "column": 3,
680 "line": 22 680 "line": 21
681 }, 681 },
682 "file": "src/components/auth/Pricing.js", 682 "file": "src/components/auth/Pricing.js",
683 "id": "pricing.trial.intro.specialTreat", 683 "id": "pricing.trial.intro.specialTreat",
684 "start": { 684 "start": {
685 "column": 16, 685 "column": 16,
686 "line": 19 686 "line": 18
687 } 687 }
688 }, 688 },
689 { 689 {
690 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.", 690 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.",
691 "end": { 691 "end": {
692 "column": 3, 692 "column": 3,
693 "line": 26 693 "line": 25
694 }, 694 },
695 "file": "src/components/auth/Pricing.js", 695 "file": "src/components/auth/Pricing.js",
696 "id": "pricing.trial.intro.tryPro", 696 "id": "pricing.trial.intro.tryPro",
697 "start": { 697 "start": {
698 "column": 10, 698 "column": 10,
699 "line": 23 699 "line": 22
700 } 700 }
701 }, 701 },
702 { 702 {
703 "defaultMessage": "!!!Happy messaging,", 703 "defaultMessage": "!!!Happy messaging,",
704 "end": { 704 "end": {
705 "column": 3, 705 "column": 3,
706 "line": 30 706 "line": 29
707 }, 707 },
708 "file": "src/components/auth/Pricing.js", 708 "file": "src/components/auth/Pricing.js",
709 "id": "pricing.trial.intro.happyMessaging", 709 "id": "pricing.trial.intro.happyMessaging",
710 "start": { 710 "start": {
711 "column": 18, 711 "column": 18,
712 "line": 27 712 "line": 26
713 } 713 }
714 }, 714 },
715 { 715 {
716 "defaultMessage": "!!!No strings attached", 716 "defaultMessage": "!!!No strings attached",
717 "end": { 717 "end": {
718 "column": 3, 718 "column": 3,
719 "line": 34 719 "line": 33
720 }, 720 },
721 "file": "src/components/auth/Pricing.js", 721 "file": "src/components/auth/Pricing.js",
722 "id": "pricing.trial.terms.headline", 722 "id": "pricing.trial.terms.headline",
723 "start": { 723 "start": {
724 "column": 29, 724 "column": 29,
725 "line": 31 725 "line": 30
726 } 726 }
727 }, 727 },
728 { 728 {
729 "defaultMessage": "!!!No credit card required", 729 "defaultMessage": "!!!No credit card required",
730 "end": { 730 "end": {
731 "column": 3, 731 "column": 3,
732 "line": 38 732 "line": 37
733 }, 733 },
734 "file": "src/components/auth/Pricing.js", 734 "file": "src/components/auth/Pricing.js",
735 "id": "pricing.trial.terms.noCreditCard", 735 "id": "pricing.trial.terms.noCreditCard",
736 "start": { 736 "start": {
737 "column": 16, 737 "column": 16,
738 "line": 35 738 "line": 34
739 } 739 }
740 }, 740 },
741 { 741 {
742 "defaultMessage": "!!!Your free trial ends automatically after 14 days", 742 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
743 "end": { 743 "end": {
744 "column": 3, 744 "column": 3,
745 "line": 42 745 "line": 41
746 }, 746 },
747 "file": "src/components/auth/Pricing.js", 747 "file": "src/components/auth/Pricing.js",
748 "id": "pricing.trial.terms.automaticTrialEnd", 748 "id": "pricing.trial.terms.automaticTrialEnd",
749 "start": { 749 "start": {
750 "column": 21, 750 "column": 21,
751 "line": 39 751 "line": 38
752 } 752 }
753 }, 753 },
754 { 754 {
755 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", 755 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
756 "end": { 756 "end": {
757 "column": 3, 757 "column": 3,
758 "line": 46 758 "line": 45
759 }, 759 },
760 "file": "src/components/auth/Pricing.js", 760 "file": "src/components/auth/Pricing.js",
761 "id": "pricing.trial.terms.trialWorth", 761 "id": "pricing.trial.terms.trialWorth",
762 "start": { 762 "start": {
763 "column": 14, 763 "column": 14,
764 "line": 43 764 "line": 42
765 } 765 }
766 }, 766 },
767 { 767 {
768 "defaultMessage": "!!!Sorry, we could not activate your trial!", 768 "defaultMessage": "!!!Sorry, we could not activate your trial!",
769 "end": { 769 "end": {
770 "column": 3, 770 "column": 3,
771 "line": 50 771 "line": 49
772 }, 772 },
773 "file": "src/components/auth/Pricing.js", 773 "file": "src/components/auth/Pricing.js",
774 "id": "pricing.trial.error", 774 "id": "pricing.trial.error",
775 "start": { 775 "start": {
776 "column": 19, 776 "column": 19,
777 "line": 47 777 "line": 46
778 } 778 }
779 }, 779 },
780 { 780 {
781 "defaultMessage": "!!!Start my 14-day Franz Professional Trial", 781 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
782 "end": { 782 "end": {
783 "column": 3, 783 "column": 3,
784 "line": 54 784 "line": 53
785 }, 785 },
786 "file": "src/components/auth/Pricing.js", 786 "file": "src/components/auth/Pricing.js",
787 "id": "pricing.trial.cta.accept", 787 "id": "pricing.trial.cta.accept",
788 "start": { 788 "start": {
789 "column": 13, 789 "column": 13,
790 "line": 51 790 "line": 50
791 } 791 }
792 }, 792 },
793 { 793 {
794 "defaultMessage": "!!!Start using Franz", 794 "defaultMessage": "!!!Start using Franz",
795 "end": { 795 "end": {
796 "column": 3, 796 "column": 3,
797 "line": 58 797 "line": 57
798 }, 798 },
799 "file": "src/components/auth/Pricing.js", 799 "file": "src/components/auth/Pricing.js",
800 "id": "pricing.trial.cta.start", 800 "id": "pricing.trial.cta.start",
801 "start": { 801 "start": {
802 "column": 12, 802 "column": 12,
803 "line": 55 803 "line": 54
804 } 804 }
805 }, 805 },
806 { 806 {
807 "defaultMessage": "!!!Continue to Ferdi", 807 "defaultMessage": "!!!Continue to Ferdi",
808 "end": { 808 "end": {
809 "column": 3, 809 "column": 3,
810 "line": 62 810 "line": 61
811 }, 811 },
812 "file": "src/components/auth/Pricing.js", 812 "file": "src/components/auth/Pricing.js",
813 "id": "pricing.trial.cta.skip", 813 "id": "pricing.trial.cta.skip",
814 "start": { 814 "start": {
815 "column": 11, 815 "column": 11,
816 "line": 59 816 "line": 58
817 } 817 }
818 }, 818 },
819 { 819 {
820 "defaultMessage": "!!!Franz Professional includes:", 820 "defaultMessage": "!!!Franz Professional includes:",
821 "end": { 821 "end": {
822 "column": 3, 822 "column": 3,
823 "line": 66 823 "line": 65
824 }, 824 },
825 "file": "src/components/auth/Pricing.js", 825 "file": "src/components/auth/Pricing.js",
826 "id": "pricing.trial.features.headline", 826 "id": "pricing.trial.features.headline",
827 "start": { 827 "start": {
828 "column": 20, 828 "column": 20,
829 "line": 63 829 "line": 62
830 } 830 }
831 } 831 }
832 ], 832 ],
@@ -3659,6 +3659,24 @@
3659 { 3659 {
3660 "descriptors": [ 3660 "descriptors": [
3661 { 3661 {
3662 "defaultMessage": "!!!Close settings",
3663 "end": {
3664 "column": 3,
3665 "line": 14
3666 },
3667 "file": "src/components/settings/SettingsLayout.js",
3668 "id": "settings.app.closeSettings",
3669 "start": {
3670 "column": 17,
3671 "line": 11
3672 }
3673 }
3674 ],
3675 "path": "src/components/settings/SettingsLayout.json"
3676 },
3677 {
3678 "descriptors": [
3679 {
3662 "defaultMessage": "!!!About Ferdi", 3680 "defaultMessage": "!!!About Ferdi",
3663 "end": { 3681 "end": {
3664 "column": 3, 3682 "column": 3,
@@ -4562,6 +4580,60 @@
4562 { 4580 {
4563 "descriptors": [ 4581 "descriptors": [
4564 { 4582 {
4583 "defaultMessage": "!!!Hide",
4584 "end": {
4585 "column": 3,
4586 "line": 15
4587 },
4588 "file": "src/components/ui/InfoBar.js",
4589 "id": "infobar.hide",
4590 "start": {
4591 "column": 8,
4592 "line": 12
4593 }
4594 }
4595 ],
4596 "path": "src/components/ui/InfoBar.json"
4597 },
4598 {
4599 "descriptors": [
4600 {
4601 "defaultMessage": "!!!Dismiss",
4602 "end": {
4603 "column": 3,
4604 "line": 12
4605 },
4606 "file": "src/components/ui/Infobox.js",
4607 "id": "infobox.dismiss",
4608 "start": {
4609 "column": 11,
4610 "line": 9
4611 }
4612 }
4613 ],
4614 "path": "src/components/ui/Infobox.json"
4615 },
4616 {
4617 "descriptors": [
4618 {
4619 "defaultMessage": "!!!Password toggle",
4620 "end": {
4621 "column": 3,
4622 "line": 14
4623 },
4624 "file": "src/components/ui/Input.js",
4625 "id": "settings.app.form.passwordToggle",
4626 "start": {
4627 "column": 18,
4628 "line": 11
4629 }
4630 }
4631 ],
4632 "path": "src/components/ui/Input.json"
4633 },
4634 {
4635 "descriptors": [
4636 {
4565 "defaultMessage": "!!!Upgrade account", 4637 "defaultMessage": "!!!Upgrade account",
4566 "end": { 4638 "end": {
4567 "column": 3, 4639 "column": 3,
@@ -6070,91 +6142,91 @@
6070 "defaultMessage": "!!!Publish debug information", 6142 "defaultMessage": "!!!Publish debug information",
6071 "end": { 6143 "end": {
6072 "column": 3, 6144 "column": 3,
6073 "line": 21 6145 "line": 20
6074 }, 6146 },
6075 "file": "src/features/publishDebugInfo/Component.js", 6147 "file": "src/features/publishDebugInfo/Component.js",
6076 "id": "feature.publishDebugInfo.title", 6148 "id": "feature.publishDebugInfo.title",
6077 "start": { 6149 "start": {
6078 "column": 9, 6150 "column": 9,
6079 "line": 18 6151 "line": 17
6080 } 6152 }
6081 }, 6153 },
6082 { 6154 {
6083 "defaultMessage": "!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 6155 "defaultMessage": "!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
6084 "end": { 6156 "end": {
6085 "column": 3, 6157 "column": 3,
6086 "line": 25 6158 "line": 24
6087 }, 6159 },
6088 "file": "src/features/publishDebugInfo/Component.js", 6160 "file": "src/features/publishDebugInfo/Component.js",
6089 "id": "feature.publishDebugInfo.info", 6161 "id": "feature.publishDebugInfo.info",
6090 "start": { 6162 "start": {
6091 "column": 8, 6163 "column": 8,
6092 "line": 22 6164 "line": 21
6093 } 6165 }
6094 }, 6166 },
6095 { 6167 {
6096 "defaultMessage": "!!!There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 6168 "defaultMessage": "!!!There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
6097 "end": { 6169 "end": {
6098 "column": 3, 6170 "column": 3,
6099 "line": 29 6171 "line": 28
6100 }, 6172 },
6101 "file": "src/features/publishDebugInfo/Component.js", 6173 "file": "src/features/publishDebugInfo/Component.js",
6102 "id": "feature.publishDebugInfo.error", 6174 "id": "feature.publishDebugInfo.error",
6103 "start": { 6175 "start": {
6104 "column": 9, 6176 "column": 9,
6105 "line": 26 6177 "line": 25
6106 } 6178 }
6107 }, 6179 },
6108 { 6180 {
6109 "defaultMessage": "!!!Privacy policy", 6181 "defaultMessage": "!!!Privacy policy",
6110 "end": { 6182 "end": {
6111 "column": 3, 6183 "column": 3,
6112 "line": 33 6184 "line": 32
6113 }, 6185 },
6114 "file": "src/features/publishDebugInfo/Component.js", 6186 "file": "src/features/publishDebugInfo/Component.js",
6115 "id": "feature.publishDebugInfo.privacy", 6187 "id": "feature.publishDebugInfo.privacy",
6116 "start": { 6188 "start": {
6117 "column": 11, 6189 "column": 11,
6118 "line": 30 6190 "line": 29
6119 } 6191 }
6120 }, 6192 },
6121 { 6193 {
6122 "defaultMessage": "!!!Terms of service", 6194 "defaultMessage": "!!!Terms of service",
6123 "end": { 6195 "end": {
6124 "column": 3, 6196 "column": 3,
6125 "line": 37 6197 "line": 36
6126 }, 6198 },
6127 "file": "src/features/publishDebugInfo/Component.js", 6199 "file": "src/features/publishDebugInfo/Component.js",
6128 "id": "feature.publishDebugInfo.terms", 6200 "id": "feature.publishDebugInfo.terms",
6129 "start": { 6201 "start": {
6130 "column": 9, 6202 "column": 9,
6131 "line": 34 6203 "line": 33
6132 } 6204 }
6133 }, 6205 },
6134 { 6206 {
6135 "defaultMessage": "!!!Accept and publish", 6207 "defaultMessage": "!!!Accept and publish",
6136 "end": { 6208 "end": {
6137 "column": 3, 6209 "column": 3,
6138 "line": 41 6210 "line": 40
6139 }, 6211 },
6140 "file": "src/features/publishDebugInfo/Component.js", 6212 "file": "src/features/publishDebugInfo/Component.js",
6141 "id": "feature.publishDebugInfo.publish", 6213 "id": "feature.publishDebugInfo.publish",
6142 "start": { 6214 "start": {
6143 "column": 11, 6215 "column": 11,
6144 "line": 38 6216 "line": 37
6145 } 6217 }
6146 }, 6218 },
6147 { 6219 {
6148 "defaultMessage": "!!!Your debug log was published and is now availible at", 6220 "defaultMessage": "!!!Your debug log was published and is now availible at",
6149 "end": { 6221 "end": {
6150 "column": 3, 6222 "column": 3,
6151 "line": 45 6223 "line": 44
6152 }, 6224 },
6153 "file": "src/features/publishDebugInfo/Component.js", 6225 "file": "src/features/publishDebugInfo/Component.js",
6154 "id": "feature.publishDebugInfo.published", 6226 "id": "feature.publishDebugInfo.published",
6155 "start": { 6227 "start": {
6156 "column": 13, 6228 "column": 13,
6157 "line": 42 6229 "line": 41
6158 } 6230 }
6159 } 6231 }
6160 ], 6232 ],
@@ -6736,7 +6808,7 @@
6736 "defaultMessage": "!!!*This option will be overwritten by the global \"Keep all workspaces loaded\" option.", 6808 "defaultMessage": "!!!*This option will be overwritten by the global \"Keep all workspaces loaded\" option.",
6737 "end": { 6809 "end": {
6738 "column": 3, 6810 "column": 3,
6739 "line": 44 6811 "line": 45
6740 }, 6812 },
6741 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 6813 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6742 "id": "settings.workspace.form.keepLoadedInfo", 6814 "id": "settings.workspace.form.keepLoadedInfo",
@@ -6749,39 +6821,39 @@
6749 "defaultMessage": "!!!Services in this Workspace", 6821 "defaultMessage": "!!!Services in this Workspace",
6750 "end": { 6822 "end": {
6751 "column": 3, 6823 "column": 3,
6752 "line": 48 6824 "line": 49
6753 }, 6825 },
6754 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 6826 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6755 "id": "settings.workspace.form.servicesInWorkspaceHeadline", 6827 "id": "settings.workspace.form.servicesInWorkspaceHeadline",
6756 "start": { 6828 "start": {
6757 "column": 31, 6829 "column": 31,
6758 "line": 45 6830 "line": 46
6759 } 6831 }
6760 }, 6832 },
6761 { 6833 {
6762 "defaultMessage": "!!!Start by adding a service.", 6834 "defaultMessage": "!!!Start by adding a service.",
6763 "end": { 6835 "end": {
6764 "column": 3, 6836 "column": 3,
6765 "line": 52 6837 "line": 53
6766 }, 6838 },
6767 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 6839 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6768 "id": "settings.services.noServicesAdded", 6840 "id": "settings.services.noServicesAdded",
6769 "start": { 6841 "start": {
6770 "column": 19, 6842 "column": 19,
6771 "line": 49 6843 "line": 50
6772 } 6844 }
6773 }, 6845 },
6774 { 6846 {
6775 "defaultMessage": "!!!Discover services", 6847 "defaultMessage": "!!!Discover services",
6776 "end": { 6848 "end": {
6777 "column": 3, 6849 "column": 3,
6778 "line": 56 6850 "line": 57
6779 }, 6851 },
6780 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 6852 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6781 "id": "settings.services.discoverServices", 6853 "id": "settings.services.discoverServices",
6782 "start": { 6854 "start": {
6783 "column": 20, 6855 "column": 20,
6784 "line": 53 6856 "line": 54
6785 } 6857 }
6786 } 6858 }
6787 ], 6859 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index fc25795a4..05a8e7486 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -84,10 +84,12 @@
84 "infobar.buttonChangelog": "What is new?", 84 "infobar.buttonChangelog": "What is new?",
85 "infobar.buttonInstallUpdate": "Restart & install update", 85 "infobar.buttonInstallUpdate": "Restart & install update",
86 "infobar.buttonReloadServices": "Reload services", 86 "infobar.buttonReloadServices": "Reload services",
87 "infobar.hide": "Hide",
87 "infobar.requiredRequestsFailed": "Could not load services and user information", 88 "infobar.requiredRequestsFailed": "Could not load services and user information",
88 "infobar.servicesUpdated": "Your services have been updated.", 89 "infobar.servicesUpdated": "Your services have been updated.",
89 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!", 90 "infobar.trialActivated": "Your trial was successfully activated. Happy messaging!",
90 "infobar.updateAvailable": "A new update for Ferdi is available.", 91 "infobar.updateAvailable": "A new update for Ferdi is available.",
92 "infobox.dismiss": "Dismiss",
91 "invite.email.label": "Email address", 93 "invite.email.label": "Email address",
92 "invite.headline.friends": "Invite 3 of your friends or colleagues", 94 "invite.headline.friends": "Invite 3 of your friends or colleagues",
93 "invite.name.label": "Name", 95 "invite.name.label": "Name",
@@ -286,6 +288,7 @@
286 "settings.app.buttonSearchForUpdate": "Check for updates", 288 "settings.app.buttonSearchForUpdate": "Check for updates",
287 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.", 289 "settings.app.cacheInfo": "Ferdi cache is currently using {size} of disk space.",
288 "settings.app.cacheNotCleared": "Couldn't clear all cache", 290 "settings.app.cacheNotCleared": "Couldn't clear all cache",
291 "settings.app.closeSettings": "Close settings",
289 "settings.app.currentVersion": "Current version:", 292 "settings.app.currentVersion": "Current version:",
290 "settings.app.form.accentColor": "Accent color", 293 "settings.app.form.accentColor": "Accent color",
291 "settings.app.form.adaptableDarkMode": "Synchronize dark mode with my OS's dark mode setting", 294 "settings.app.form.adaptableDarkMode": "Synchronize dark mode with my OS's dark mode setting",
@@ -315,6 +318,7 @@
315 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray", 318 "settings.app.form.minimizeToSystemTray": "Minimize Ferdi to system tray",
316 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour", 319 "settings.app.form.navigationBarBehaviour": "Navigation bar behaviour",
317 "settings.app.form.notifyTaskBarOnMessage": "Notify TaskBar/Dock on new message", 320 "settings.app.form.notifyTaskBarOnMessage": "Notify TaskBar/Dock on new message",
321 "settings.app.form.passwordToggle": "Password toggle",
318 "settings.app.form.predefinedTodoServer": "Todo Server", 322 "settings.app.form.predefinedTodoServer": "Todo Server",
319 "settings.app.form.privateNotifications": "Don't show message content in notifications", 323 "settings.app.form.privateNotifications": "Don't show message content in notifications",
320 "settings.app.form.reloadAfterResume": "Reload Ferdi after system resume", 324 "settings.app.form.reloadAfterResume": "Reload Ferdi after system resume",
diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json
index c4c94bb32..b5b7d72a8 100644
--- a/src/i18n/messages/src/components/auth/Pricing.json
+++ b/src/i18n/messages/src/components/auth/Pricing.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Hi {name}, welcome to Franz", 4 "defaultMessage": "!!!Hi {name}, welcome to Franz",
5 "file": "src/components/auth/Pricing.js", 5 "file": "src/components/auth/Pricing.js",
6 "start": { 6 "start": {
7 "line": 15, 7 "line": 14,
8 "column": 12 8 "column": 12
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 18, 11 "line": 17,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!We have a special treat for you.", 17 "defaultMessage": "!!!We have a special treat for you.",
18 "file": "src/components/auth/Pricing.js", 18 "file": "src/components/auth/Pricing.js",
19 "start": { 19 "start": {
20 "line": 19, 20 "line": 18,
21 "column": 16 21 "column": 16
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 22, 24 "line": 21,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.", 30 "defaultMessage": "!!!Enjoy the full Franz Professional experience completely free for 14 days.",
31 "file": "src/components/auth/Pricing.js", 31 "file": "src/components/auth/Pricing.js",
32 "start": { 32 "start": {
33 "line": 23, 33 "line": 22,
34 "column": 10 34 "column": 10
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 26, 37 "line": 25,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Happy messaging,", 43 "defaultMessage": "!!!Happy messaging,",
44 "file": "src/components/auth/Pricing.js", 44 "file": "src/components/auth/Pricing.js",
45 "start": { 45 "start": {
46 "line": 27, 46 "line": 26,
47 "column": 18 47 "column": 18
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 30, 50 "line": 29,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!No strings attached", 56 "defaultMessage": "!!!No strings attached",
57 "file": "src/components/auth/Pricing.js", 57 "file": "src/components/auth/Pricing.js",
58 "start": { 58 "start": {
59 "line": 31, 59 "line": 30,
60 "column": 29 60 "column": 29
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 34, 63 "line": 33,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!No credit card required", 69 "defaultMessage": "!!!No credit card required",
70 "file": "src/components/auth/Pricing.js", 70 "file": "src/components/auth/Pricing.js",
71 "start": { 71 "start": {
72 "line": 35, 72 "line": 34,
73 "column": 16 73 "column": 16
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 38, 76 "line": 37,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Your free trial ends automatically after 14 days", 82 "defaultMessage": "!!!Your free trial ends automatically after 14 days",
83 "file": "src/components/auth/Pricing.js", 83 "file": "src/components/auth/Pricing.js",
84 "start": { 84 "start": {
85 "line": 39, 85 "line": 38,
86 "column": 21 86 "column": 21
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 42, 89 "line": 41,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)", 95 "defaultMessage": "!!!Free trial (normally {currency}{price} per month)",
96 "file": "src/components/auth/Pricing.js", 96 "file": "src/components/auth/Pricing.js",
97 "start": { 97 "start": {
98 "line": 43, 98 "line": 42,
99 "column": 14 99 "column": 14
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 46, 102 "line": 45,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Sorry, we could not activate your trial!", 108 "defaultMessage": "!!!Sorry, we could not activate your trial!",
109 "file": "src/components/auth/Pricing.js", 109 "file": "src/components/auth/Pricing.js",
110 "start": { 110 "start": {
111 "line": 47, 111 "line": 46,
112 "column": 19 112 "column": 19
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 50, 115 "line": 49,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Start my 14-day Franz Professional Trial", 121 "defaultMessage": "!!!Start my 14-day Franz Professional Trial",
122 "file": "src/components/auth/Pricing.js", 122 "file": "src/components/auth/Pricing.js",
123 "start": { 123 "start": {
124 "line": 51, 124 "line": 50,
125 "column": 13 125 "column": 13
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 54, 128 "line": 53,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Start using Franz", 134 "defaultMessage": "!!!Start using Franz",
135 "file": "src/components/auth/Pricing.js", 135 "file": "src/components/auth/Pricing.js",
136 "start": { 136 "start": {
137 "line": 55, 137 "line": 54,
138 "column": 12 138 "column": 12
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 58, 141 "line": 57,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Continue to Ferdi", 147 "defaultMessage": "!!!Continue to Ferdi",
148 "file": "src/components/auth/Pricing.js", 148 "file": "src/components/auth/Pricing.js",
149 "start": { 149 "start": {
150 "line": 59, 150 "line": 58,
151 "column": 11 151 "column": 11
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 62, 154 "line": 61,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Franz Professional includes:", 160 "defaultMessage": "!!!Franz Professional includes:",
161 "file": "src/components/auth/Pricing.js", 161 "file": "src/components/auth/Pricing.js",
162 "start": { 162 "start": {
163 "line": 63, 163 "line": 62,
164 "column": 20 164 "column": 20
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 66, 167 "line": 65,
168 "column": 3 168 "column": 3
169 } 169 }
170 } 170 }
diff --git a/src/i18n/messages/src/components/settings/SettingsLayout.json b/src/i18n/messages/src/components/settings/SettingsLayout.json
new file mode 100644
index 000000000..99337a315
--- /dev/null
+++ b/src/i18n/messages/src/components/settings/SettingsLayout.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "settings.app.closeSettings",
4 "defaultMessage": "!!!Close settings",
5 "file": "src/components/settings/SettingsLayout.js",
6 "start": {
7 "line": 11,
8 "column": 17
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/InfoBar.json b/src/i18n/messages/src/components/ui/InfoBar.json
new file mode 100644
index 000000000..a6a629c71
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/InfoBar.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "infobar.hide",
4 "defaultMessage": "!!!Hide",
5 "file": "src/components/ui/InfoBar.js",
6 "start": {
7 "line": 12,
8 "column": 8
9 },
10 "end": {
11 "line": 15,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/Infobox.json b/src/i18n/messages/src/components/ui/Infobox.json
new file mode 100644
index 000000000..296c2ad3e
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/Infobox.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "infobox.dismiss",
4 "defaultMessage": "!!!Dismiss",
5 "file": "src/components/ui/Infobox.js",
6 "start": {
7 "line": 9,
8 "column": 11
9 },
10 "end": {
11 "line": 12,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/ui/Input.json b/src/i18n/messages/src/components/ui/Input.json
new file mode 100644
index 000000000..6240badfb
--- /dev/null
+++ b/src/i18n/messages/src/components/ui/Input.json
@@ -0,0 +1,15 @@
1[
2 {
3 "id": "settings.app.form.passwordToggle",
4 "defaultMessage": "!!!Password toggle",
5 "file": "src/components/ui/Input.js",
6 "start": {
7 "line": 11,
8 "column": 18
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 }
15] \ No newline at end of file
diff --git a/src/i18n/messages/src/features/publishDebugInfo/Component.json b/src/i18n/messages/src/features/publishDebugInfo/Component.json
index 85fbe7ca6..25048ace6 100644
--- a/src/i18n/messages/src/features/publishDebugInfo/Component.json
+++ b/src/i18n/messages/src/features/publishDebugInfo/Component.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Publish debug information", 4 "defaultMessage": "!!!Publish debug information",
5 "file": "src/features/publishDebugInfo/Component.js", 5 "file": "src/features/publishDebugInfo/Component.js",
6 "start": { 6 "start": {
7 "line": 18, 7 "line": 17,
8 "column": 9 8 "column": 9
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 21, 11 "line": 20,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service", 17 "defaultMessage": "!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
18 "file": "src/features/publishDebugInfo/Component.js", 18 "file": "src/features/publishDebugInfo/Component.js",
19 "start": { 19 "start": {
20 "line": 22, 20 "line": 21,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 25, 24 "line": 24,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!There was an error while trying to publish the debug information. Please try again later or view the console for more information.", 30 "defaultMessage": "!!!There was an error while trying to publish the debug information. Please try again later or view the console for more information.",
31 "file": "src/features/publishDebugInfo/Component.js", 31 "file": "src/features/publishDebugInfo/Component.js",
32 "start": { 32 "start": {
33 "line": 26, 33 "line": 25,
34 "column": 9 34 "column": 9
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 29, 37 "line": 28,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Privacy policy", 43 "defaultMessage": "!!!Privacy policy",
44 "file": "src/features/publishDebugInfo/Component.js", 44 "file": "src/features/publishDebugInfo/Component.js",
45 "start": { 45 "start": {
46 "line": 30, 46 "line": 29,
47 "column": 11 47 "column": 11
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 33, 50 "line": 32,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Terms of service", 56 "defaultMessage": "!!!Terms of service",
57 "file": "src/features/publishDebugInfo/Component.js", 57 "file": "src/features/publishDebugInfo/Component.js",
58 "start": { 58 "start": {
59 "line": 34, 59 "line": 33,
60 "column": 9 60 "column": 9
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 37, 63 "line": 36,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Accept and publish", 69 "defaultMessage": "!!!Accept and publish",
70 "file": "src/features/publishDebugInfo/Component.js", 70 "file": "src/features/publishDebugInfo/Component.js",
71 "start": { 71 "start": {
72 "line": 38, 72 "line": 37,
73 "column": 11 73 "column": 11
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 41, 76 "line": 40,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Your debug log was published and is now availible at", 82 "defaultMessage": "!!!Your debug log was published and is now availible at",
83 "file": "src/features/publishDebugInfo/Component.js", 83 "file": "src/features/publishDebugInfo/Component.js",
84 "start": { 84 "start": {
85 "line": 42, 85 "line": 41,
86 "column": 13 86 "column": 13
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 45, 89 "line": 44,
90 "column": 3 90 "column": 3
91 } 91 }
92 } 92 }
diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
index 053751c84..804e30070 100644
--- a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
+++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
@@ -73,7 +73,7 @@
73 "column": 18 73 "column": 18
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 44, 76 "line": 45,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Services in this Workspace", 82 "defaultMessage": "!!!Services in this Workspace",
83 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 83 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
84 "start": { 84 "start": {
85 "line": 45, 85 "line": 46,
86 "column": 31 86 "column": 31
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 48, 89 "line": 49,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Start by adding a service.", 95 "defaultMessage": "!!!Start by adding a service.",
96 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 96 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
97 "start": { 97 "start": {
98 "line": 49, 98 "line": 50,
99 "column": 19 99 "column": 19
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 52, 102 "line": 53,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Discover services", 108 "defaultMessage": "!!!Discover services",
109 "file": "src/features/workspaces/components/EditWorkspaceForm.js", 109 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
110 "start": { 110 "start": {
111 "line": 53, 111 "line": 54,
112 "column": 20 112 "column": 20
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 56, 115 "line": 57,
116 "column": 3 116 "column": 3
117 } 117 }
118 } 118 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 6e3f120ba..8118b4e26 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -1269,7 +1269,6 @@ export default class FranzMenu {
1269 return menu; 1269 return menu;
1270 } 1270 }
1271 1271
1272
1273 debugMenu() { 1272 debugMenu() {
1274 const { intl } = window.ferdi; 1273 const { intl } = window.ferdi;
1275 1274
diff --git a/src/models/User.js b/src/models/User.js
index 5a614efbe..74a39926b 100644
--- a/src/models/User.js
+++ b/src/models/User.js
@@ -38,7 +38,6 @@ export default class User {
38 38
39 @observable team = {}; 39 @observable team = {};
40 40
41
42 constructor(data) { 41 constructor(data) {
43 if (!data.id) { 42 if (!data.id) {
44 throw Error('User requires Id'); 43 throw Error('User requires Id');
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index dd4ab3629..3116677c2 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -127,7 +127,6 @@ export default class AppStore extends Store {
127 this.isFullScreen = false; 127 this.isFullScreen = false;
128 }); 128 });
129 129
130
131 this.isOnline = navigator.onLine; 130 this.isOnline = navigator.onLine;
132 131
133 // Check if Ferdi should launch on start 132 // Check if Ferdi should launch on start
@@ -474,7 +473,6 @@ export default class AppStore extends Store {
474 locale = this.stores.user.data.locale; 473 locale = this.stores.user.data.locale;
475 } 474 }
476 475
477
478 if (locale && Object.prototype.hasOwnProperty.call(locales, locale) && locale !== this.locale) { 476 if (locale && Object.prototype.hasOwnProperty.call(locales, locale) && locale !== this.locale) {
479 this.locale = locale; 477 this.locale = locale;
480 } else if (!locale) { 478 } else if (!locale) {
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 631d0318e..2fee9bdda 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -33,7 +33,7 @@ export default class FeaturesStore extends Store {
33 33
34 @observable featuresRequest = new CachedRequest(this.api.features, 'features'); 34 @observable featuresRequest = new CachedRequest(this.api.features, 'features');
35 35
36 @observable features = Object.assign({}, DEFAULT_FEATURES_CONFIG); 36 @observable features = ({ ...DEFAULT_FEATURES_CONFIG });
37 37
38 async setup() { 38 async setup() {
39 this.registerReactions([ 39 this.registerReactions([
@@ -57,7 +57,7 @@ export default class FeaturesStore extends Store {
57 } 57 }
58 58
59 _updateFeatures = () => { 59 _updateFeatures = () => {
60 const features = Object.assign({}, DEFAULT_FEATURES_CONFIG); 60 const features = { ...DEFAULT_FEATURES_CONFIG };
61 if (this.stores.user.isLoggedIn) { 61 if (this.stores.user.isLoggedIn) {
62 let requestResult = {}; 62 let requestResult = {};
63 try { 63 try {
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 3dba217b2..9b69cb7c6 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -306,6 +306,7 @@ export default class ServicesStore extends Store {
306 } 306 }
307 307
308 // set default values for serviceData 308 // set default values for serviceData
309 // eslint-disable-next-line prefer-object-spread
309 Object.assign({ 310 Object.assign({
310 isEnabled: true, 311 isEnabled: true,
311 isHibernationEnabled: false, 312 isHibernationEnabled: false,
diff --git a/src/theme/default/legacy.js b/src/theme/default/legacy.js
index e894a06ed..3f4bec5d5 100644
--- a/src/theme/default/legacy.js
+++ b/src/theme/default/legacy.js
@@ -22,7 +22,6 @@ export const themeTransitionTime = '.5s';
22 22
23export const themeInsetShadow = 'inset 0 2px 5px rgba(0, 0, 0, .03)'; 23export const themeInsetShadow = 'inset 0 2px 5px rgba(0, 0, 0, .03)';
24 24
25
26export const darkThemeBlack = '#1A1A1A'; 25export const darkThemeBlack = '#1A1A1A';
27 26
28export const darkThemeGrayDarkest = '#1E1E1E'; 27export const darkThemeGrayDarkest = '#1E1E1E';
diff --git a/src/webview/contextMenuBuilder.js b/src/webview/contextMenuBuilder.js
index c26f192fe..500a1a653 100644
--- a/src/webview/contextMenuBuilder.js
+++ b/src/webview/contextMenuBuilder.js
@@ -64,7 +64,7 @@ module.exports = class ContextMenuBuilder {
64 this.debugMode = debugMode; 64 this.debugMode = debugMode;
65 this.processMenu = processMenu; 65 this.processMenu = processMenu;
66 this.menu = null; 66 this.menu = null;
67 this.stringTable = Object.assign({}, contextMenuStringTable); 67 this.stringTable = { ...contextMenuStringTable };
68 this.getWebContents = () => webContents; 68 this.getWebContents = () => webContents;
69 } 69 }
70 70
diff --git a/src/webview/lib/RecipeWebview.js b/src/webview/lib/RecipeWebview.js
index 84ac45ecc..b5793a5f1 100644
--- a/src/webview/lib/RecipeWebview.js
+++ b/src/webview/lib/RecipeWebview.js
@@ -59,7 +59,6 @@ class RecipeWebview {
59 indirect: Math.max(indirectInt, 0), 59 indirect: Math.max(indirectInt, 0),
60 }; 60 };
61 61
62
63 ipcRenderer.sendToHost('message-counts', count); 62 ipcRenderer.sendToHost('message-counts', count);
64 Object.assign(this.countCache, count); 63 Object.assign(this.countCache, count);
65 64
diff --git a/src/webview/screenshare.js b/src/webview/screenshare.js
index 2715f2e3e..84d2e1e95 100644
--- a/src/webview/screenshare.js
+++ b/src/webview/screenshare.js
@@ -73,25 +73,29 @@ export const screenShareCss = `
73`; 73`;
74 74
75// Patch getDisplayMedia for screen sharing 75// Patch getDisplayMedia for screen sharing
76window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve, reject) => { 76window.navigator.mediaDevices.getDisplayMedia = () => async (resolve, reject) => {
77 try { 77 try {
78 const sources = await desktopCapturer.getSources({ types: ['screen', 'window'] }); 78 const sources = await desktopCapturer.getSources({
79 types: ['screen', 'window'],
80 });
79 81
80 const selectionElem = document.createElement('div'); 82 const selectionElem = document.createElement('div');
81 selectionElem.classList = 'desktop-capturer-selection'; 83 selectionElem.classList = 'desktop-capturer-selection';
82 selectionElem.innerHTML = ` 84 selectionElem.innerHTML = `
83 <div class="desktop-capturer-selection__scroller"> 85 <div class="desktop-capturer-selection__scroller">
84 <ul class="desktop-capturer-selection__list"> 86 <ul class="desktop-capturer-selection__list">
85 ${sources.map(({ 87 ${sources
86 id, name, thumbnail, 88 .map(
87 }) => ` 89 ({ id, name, thumbnail }) => `
88 <li class="desktop-capturer-selection__item"> 90 <li class="desktop-capturer-selection__item">
89 <button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}"> 91 <button class="desktop-capturer-selection__btn" data-id="${id}" title="${name}">
90 <img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" /> 92 <img class="desktop-capturer-selection__thumbnail" src="${thumbnail.toDataURL()}" />
91 <span class="desktop-capturer-selection__name">${name}</span> 93 <span class="desktop-capturer-selection__name">${name}</span>
92 </button> 94 </button>
93 </li> 95 </li>
94 `).join('')} 96 `,
97 )
98 .join('')}
95 <li class="desktop-capturer-selection__item"> 99 <li class="desktop-capturer-selection__item">
96 <button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel"> 100 <button class="desktop-capturer-selection__btn" data-id="${CANCEL_ID}" title="Cancel">
97 <span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span> 101 <span class="desktop-capturer-selection__name desktop-capturer-selection__name--cancel">Cancel</span>
@@ -102,7 +106,8 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve
102 `; 106 `;
103 document.body.appendChild(selectionElem); 107 document.body.appendChild(selectionElem);
104 108
105 document.querySelectorAll('.desktop-capturer-selection__btn') 109 document
110 .querySelectorAll('.desktop-capturer-selection__btn')
106 .forEach((button) => { 111 .forEach((button) => {
107 button.addEventListener('click', async () => { 112 button.addEventListener('click', async () => {
108 try { 113 try {
@@ -110,20 +115,22 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve
110 if (id === CANCEL_ID) { 115 if (id === CANCEL_ID) {
111 reject(new Error('Cancelled by user')); 116 reject(new Error('Cancelled by user'));
112 } else { 117 } else {
113 const mediaSource = sources.find(source => source.id === id); 118 const mediaSource = sources.find((source) => source.id === id);
114 if (!mediaSource) { 119 if (!mediaSource) {
115 throw new Error(`Source with id ${id} does not exist`); 120 throw new Error(`Source with id ${id} does not exist`);
116 } 121 }
117 122
118 const stream = await window.navigator.mediaDevices.getUserMedia({ 123 const stream = await window.navigator.mediaDevices.getUserMedia(
119 audio: false, 124 {
120 video: { 125 audio: false,
121 mandatory: { 126 video: {
122 chromeMediaSource: 'desktop', 127 mandatory: {
123 chromeMediaSourceId: mediaSource.id, 128 chromeMediaSource: 'desktop',
129 chromeMediaSourceId: mediaSource.id,
130 },
124 }, 131 },
125 }, 132 },
126 }); 133 );
127 resolve(stream); 134 resolve(stream);
128 } 135 }
129 } catch (err) { 136 } catch (err) {
@@ -136,4 +143,4 @@ window.navigator.mediaDevices.getDisplayMedia = () => new Promise(async (resolve
136 } catch (err) { 143 } catch (err) {
137 reject(err); 144 reject(err);
138 } 145 }
139}); 146};