aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Markus Hatvan <markus_hatvan@aon.at>2021-10-15 09:48:06 +0200
committerLibravatar GitHub <noreply@github.com>2021-10-15 09:48:06 +0200
commit14d2364fc69e0222133115c55a36286986006098 (patch)
tree9e9b3c41ef742bbe87ca1632b292c67043051957
parent5.6.3-nightly.34 [skip ci] (diff)
downloadferdium-app-14d2364fc69e0222133115c55a36286986006098.tar.gz
ferdium-app-14d2364fc69e0222133115c55a36286986006098.tar.zst
ferdium-app-14d2364fc69e0222133115c55a36286986006098.zip
chore: update eslint setup (#2074)
-rw-r--r--.eslintrc.js20
-rw-r--r--package-lock.json1056
-rw-r--r--package.json18
-rw-r--r--scripts/postinstall.ts1
-rw-r--r--src/actions/user.ts8
-rw-r--r--src/components/layout/Sidebar.js4
-rw-r--r--src/components/services/content/ErrorHandlers/styles.ts2
-rw-r--r--src/components/services/content/ServiceView.js2
-rw-r--r--src/components/services/content/ServiceWebview.js36
-rw-r--r--src/components/services/tabs/TabBarSortableList.js10
-rw-r--r--src/components/settings/settings/EditSettingsForm.js16
-rw-r--r--src/components/ui/Modal/styles.ts2
-rw-r--r--src/components/ui/ServiceIcon.js18
-rw-r--r--src/components/ui/WebviewLoader/styles.ts2
-rw-r--r--src/components/util/ErrorBoundary/styles.js2
-rw-r--r--src/containers/settings/EditSettingsScreen.js8
-rw-r--r--src/containers/settings/RecipesScreen.js22
-rw-r--r--src/electron/exception.ts2
-rw-r--r--src/electron/ipc-api/sessionStorage.ts6
-rw-r--r--src/enforce-macos-app-location.ts18
-rw-r--r--src/environment-remote.ts18
-rwxr-xr-xsrc/features/settingsWS/actions.ts11
-rw-r--r--src/features/todos/components/TodosWebview.js15
-rw-r--r--src/features/todos/containers/TodosScreen.js17
-rw-r--r--src/features/utils/ActionBinding.ts5
-rw-r--r--src/features/utils/FeatureStore.test.js21
-rw-r--r--src/features/workspaces/components/WorkspaceDrawerItem.js8
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js3
-rw-r--r--src/features/workspaces/store.js46
-rw-r--r--src/helpers/array-helpers.ts9
-rw-r--r--src/helpers/async-helpers.ts4
-rw-r--r--src/helpers/routing-helpers.ts3
-rw-r--r--src/helpers/schedule-helpers.ts53
-rw-r--r--src/helpers/url-helpers.ts5
-rw-r--r--src/internal-server/app/Controllers/Http/RecipeController.js2
-rw-r--r--src/internal-server/app/Controllers/Http/ServiceController.js2
-rw-r--r--src/internal-server/app/Controllers/Http/UserController.js5
-rw-r--r--src/internal-server/app/Controllers/Http/WorkspaceController.js2
-rw-r--r--src/internal-server/config/app.js1
-rw-r--r--src/internal-server/config/bodyParser.js12
-rw-r--r--src/internal-server/database/migrations/1503250034279_user.js2
-rw-r--r--src/internal-server/database/migrations/1566385379883_service_schema.js2
-rw-r--r--src/internal-server/database/migrations/1566554231482_recipe_schema.js2
-rw-r--r--src/internal-server/database/migrations/1566554359294_workspace_schema.js2
-rw-r--r--src/internal-server/start/app.js9
-rw-r--r--src/jsUtils.ts17
-rw-r--r--src/lib/Tray.js53
-rw-r--r--src/models/Recipe.ts67
-rw-r--r--src/models/User.ts3
-rw-r--r--src/models/UserAgent.js8
-rw-r--r--src/stores/RecipePreviewsStore.js12
-rw-r--r--src/stores/ServicesStore.js2
-rw-r--r--src/stores/SettingsStore.js6
-rw-r--r--src/stores/UserStore.js2
-rw-r--r--src/stores/lib/Request.js82
-rw-r--r--src/stores/lib/Store.js3
-rw-r--r--src/webview/badge.ts13
-rw-r--r--src/webview/contextMenuBuilder.ts4
-rw-r--r--src/webview/spellchecker.ts6
-rw-r--r--uidev/src/index.tsx4
-rw-r--r--uidev/src/stories/button.stories.tsx165
-rw-r--r--uidev/src/stories/headline.stories.tsx17
-rw-r--r--uidev/src/stories/icon.stories.tsx15
-rw-r--r--uidev/src/stories/infobox.stories.tsx53
-rw-r--r--uidev/src/stories/loader.stories.tsx11
-rw-r--r--uidev/src/withTheme/index.tsx28
-rw-r--r--uidev/webpack.config.js12
67 files changed, 1065 insertions, 1030 deletions
diff --git a/.eslintrc.js b/.eslintrc.js
index 491faff37..dd50364d0 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -9,8 +9,8 @@ module.exports = {
9 sourceType: 'module', 9 sourceType: 'module',
10 project: './tsconfig.json', 10 project: './tsconfig.json',
11 }, 11 },
12 extends: ['eslint-config-airbnb', 'plugin:unicorn/recommended'], 12 extends: ['airbnb', 'plugin:unicorn/recommended', 'prettier'],
13 plugins: ['jest'], 13 plugins: ['jest', 'prettier'],
14 settings: { 14 settings: {
15 react: { 15 react: {
16 pragma: 'React', // Pragma to use, default to "React" 16 pragma: 'React', // Pragma to use, default to "React"
@@ -18,14 +18,8 @@ module.exports = {
18 }, 18 },
19 }, 19 },
20 globals: { 20 globals: {
21 window: true, 21 // TODO: can be removed once adonisj migration is done
22 document: true,
23 FormData: true,
24 localStorage: true,
25 navigator: true,
26 Element: true,
27 use: true, 22 use: true,
28 FileReader: true,
29 }, 23 },
30 env: { 24 env: {
31 browser: true, 25 browser: true,
@@ -36,9 +30,9 @@ module.exports = {
36 overrides: [ 30 overrides: [
37 { 31 {
38 files: ['**/*.ts', '**/*.tsx'], 32 files: ['**/*.ts', '**/*.tsx'],
39 extends: ['airbnb-typescript', 'plugin:unicorn/recommended'], 33 extends: ['airbnb-typescript', 'plugin:unicorn/recommended', 'prettier'],
40 parser: '@typescript-eslint/parser', 34 parser: '@typescript-eslint/parser',
41 plugins: ['@typescript-eslint'], 35 plugins: ['@typescript-eslint', 'jest', 'prettier'],
42 rules: { 36 rules: {
43 // eslint 37 // eslint
44 'arrow-parens': 0, 38 'arrow-parens': 0,
@@ -121,6 +115,8 @@ module.exports = {
121 }, 115 },
122 ], 116 ],
123 'unicorn/consistent-destructuring': 0, 117 'unicorn/consistent-destructuring': 0,
118 // eslint-plugin-prettier
119 'prettier/prettier': 1,
124 }, 120 },
125 }, 121 },
126 ], 122 ],
@@ -188,5 +184,7 @@ module.exports = {
188 }, 184 },
189 ], 185 ],
190 'unicorn/consistent-destructuring': 0, 186 'unicorn/consistent-destructuring': 0,
187 // eslint-plugin-prettier
188 'prettier/prettier': 1,
191 }, 189 },
192}; 190};
diff --git a/package-lock.json b/package-lock.json
index 4f49e3995..5d036e341 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -335,9 +335,9 @@
335 } 335 }
336 }, 336 },
337 "@babel/eslint-parser": { 337 "@babel/eslint-parser": {
338 "version": "7.15.7", 338 "version": "7.15.8",
339 "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.7.tgz", 339 "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.8.tgz",
340 "integrity": "sha512-yJkHyomClm6A2Xzb8pdAo4HzYMSXFn1O5zrCYvbFP0yQFvHueLedV8WiEno8yJOKStjUXzBZzJFeWQ7b3YMsqQ==", 340 "integrity": "sha512-fYP7QFngCvgxjUuw8O057SVH5jCXsbFFOoE77CFDcvzwBVgTOkMD/L4mIC5Ud1xf8chK/no2fRbSSn1wvNmKuQ==",
341 "dev": true, 341 "dev": true,
342 "requires": { 342 "requires": {
343 "eslint-scope": "^5.1.1", 343 "eslint-scope": "^5.1.1",
@@ -3366,14 +3366,14 @@
3366 } 3366 }
3367 }, 3367 },
3368 "@eslint/eslintrc": { 3368 "@eslint/eslintrc": {
3369 "version": "0.4.3", 3369 "version": "1.0.3",
3370 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 3370 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz",
3371 "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 3371 "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==",
3372 "dev": true, 3372 "dev": true,
3373 "requires": { 3373 "requires": {
3374 "ajv": "^6.12.4", 3374 "ajv": "^6.12.4",
3375 "debug": "^4.1.1", 3375 "debug": "^4.3.2",
3376 "espree": "^7.3.0", 3376 "espree": "^9.0.0",
3377 "globals": "^13.9.0", 3377 "globals": "^13.9.0",
3378 "ignore": "^4.0.6", 3378 "ignore": "^4.0.6",
3379 "import-fresh": "^3.2.1", 3379 "import-fresh": "^3.2.1",
@@ -3392,9 +3392,9 @@
3392 } 3392 }
3393 }, 3393 },
3394 "globals": { 3394 "globals": {
3395 "version": "13.10.0", 3395 "version": "13.11.0",
3396 "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", 3396 "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
3397 "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", 3397 "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
3398 "dev": true, 3398 "dev": true,
3399 "requires": { 3399 "requires": {
3400 "type-fest": "^0.20.2" 3400 "type-fest": "^0.20.2"
@@ -3673,9 +3673,9 @@
3673 } 3673 }
3674 }, 3674 },
3675 "@humanwhocodes/config-array": { 3675 "@humanwhocodes/config-array": {
3676 "version": "0.5.0", 3676 "version": "0.6.0",
3677 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 3677 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
3678 "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 3678 "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
3679 "dev": true, 3679 "dev": true,
3680 "requires": { 3680 "requires": {
3681 "@humanwhocodes/object-schema": "^1.2.0", 3681 "@humanwhocodes/object-schema": "^1.2.0",
@@ -7973,188 +7973,71 @@
7973 "dev": true 7973 "dev": true
7974 }, 7974 },
7975 "@typescript-eslint/eslint-plugin": { 7975 "@typescript-eslint/eslint-plugin": {
7976 "version": "4.31.2", 7976 "version": "5.0.0",
7977 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", 7977 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.0.0.tgz",
7978 "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", 7978 "integrity": "sha512-T6V6fCD2U0YesOedvydTnrNtsC8E+c2QzpawIpDdlaObX0OX5dLo7tLU5c64FhTZvA1Xrdim+cXDI7NPsVx8Cg==",
7979 "dev": true, 7979 "dev": true,
7980 "requires": { 7980 "requires": {
7981 "@typescript-eslint/experimental-utils": "4.31.2", 7981 "@typescript-eslint/experimental-utils": "5.0.0",
7982 "@typescript-eslint/scope-manager": "4.31.2", 7982 "@typescript-eslint/scope-manager": "5.0.0",
7983 "debug": "^4.3.1", 7983 "debug": "^4.3.1",
7984 "functional-red-black-tree": "^1.0.1", 7984 "functional-red-black-tree": "^1.0.1",
7985 "ignore": "^5.1.8",
7985 "regexpp": "^3.1.0", 7986 "regexpp": "^3.1.0",
7986 "semver": "^7.3.5", 7987 "semver": "^7.3.5",
7987 "tsutils": "^3.21.0" 7988 "tsutils": "^3.21.0"
7988 },
7989 "dependencies": {
7990 "@typescript-eslint/experimental-utils": {
7991 "version": "4.31.2",
7992 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz",
7993 "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==",
7994 "dev": true,
7995 "requires": {
7996 "@types/json-schema": "^7.0.7",
7997 "@typescript-eslint/scope-manager": "4.31.2",
7998 "@typescript-eslint/types": "4.31.2",
7999 "@typescript-eslint/typescript-estree": "4.31.2",
8000 "eslint-scope": "^5.1.1",
8001 "eslint-utils": "^3.0.0"
8002 }
8003 },
8004 "@typescript-eslint/scope-manager": {
8005 "version": "4.31.2",
8006 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz",
8007 "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==",
8008 "dev": true,
8009 "requires": {
8010 "@typescript-eslint/types": "4.31.2",
8011 "@typescript-eslint/visitor-keys": "4.31.2"
8012 }
8013 },
8014 "@typescript-eslint/types": {
8015 "version": "4.31.2",
8016 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz",
8017 "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==",
8018 "dev": true
8019 },
8020 "@typescript-eslint/typescript-estree": {
8021 "version": "4.31.2",
8022 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz",
8023 "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==",
8024 "dev": true,
8025 "requires": {
8026 "@typescript-eslint/types": "4.31.2",
8027 "@typescript-eslint/visitor-keys": "4.31.2",
8028 "debug": "^4.3.1",
8029 "globby": "^11.0.3",
8030 "is-glob": "^4.0.1",
8031 "semver": "^7.3.5",
8032 "tsutils": "^3.21.0"
8033 }
8034 },
8035 "@typescript-eslint/visitor-keys": {
8036 "version": "4.31.2",
8037 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz",
8038 "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==",
8039 "dev": true,
8040 "requires": {
8041 "@typescript-eslint/types": "4.31.2",
8042 "eslint-visitor-keys": "^2.0.0"
8043 }
8044 },
8045 "is-glob": {
8046 "version": "4.0.1",
8047 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
8048 "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
8049 "dev": true,
8050 "requires": {
8051 "is-extglob": "^2.1.1"
8052 }
8053 }
8054 } 7989 }
8055 }, 7990 },
8056 "@typescript-eslint/experimental-utils": { 7991 "@typescript-eslint/experimental-utils": {
8057 "version": "4.28.5", 7992 "version": "5.0.0",
8058 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.5.tgz", 7993 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.0.0.tgz",
8059 "integrity": "sha512-bGPLCOJAa+j49hsynTaAtQIWg6uZd8VLiPcyDe4QPULsvQwLHGLSGKKcBN8/lBxIX14F74UEMK2zNDI8r0okwA==", 7994 "integrity": "sha512-Dnp4dFIsZcPawD6CT1p5NibNUQyGSEz80sULJZkyhyna8AEqArmfwMwJPbmKzWVo4PabqNVzHYlzmcdLQWk+pg==",
8060 "dev": true, 7995 "dev": true,
8061 "requires": { 7996 "requires": {
8062 "@types/json-schema": "^7.0.7", 7997 "@types/json-schema": "^7.0.7",
8063 "@typescript-eslint/scope-manager": "4.28.5", 7998 "@typescript-eslint/scope-manager": "5.0.0",
8064 "@typescript-eslint/types": "4.28.5", 7999 "@typescript-eslint/types": "5.0.0",
8065 "@typescript-eslint/typescript-estree": "4.28.5", 8000 "@typescript-eslint/typescript-estree": "5.0.0",
8066 "eslint-scope": "^5.1.1", 8001 "eslint-scope": "^5.1.1",
8067 "eslint-utils": "^3.0.0" 8002 "eslint-utils": "^3.0.0"
8068 } 8003 }
8069 }, 8004 },
8070 "@typescript-eslint/parser": { 8005 "@typescript-eslint/parser": {
8071 "version": "4.31.2", 8006 "version": "5.0.0",
8072 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", 8007 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.0.0.tgz",
8073 "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", 8008 "integrity": "sha512-B6D5rmmQ14I1fdzs71eL3DAuvnPHTY/t7rQABrL9BLnx/H51Un8ox1xqYAchs0/V2trcoyxB1lMJLlrwrJCDgw==",
8074 "dev": true, 8009 "dev": true,
8075 "requires": { 8010 "requires": {
8076 "@typescript-eslint/scope-manager": "4.31.2", 8011 "@typescript-eslint/scope-manager": "5.0.0",
8077 "@typescript-eslint/types": "4.31.2", 8012 "@typescript-eslint/types": "5.0.0",
8078 "@typescript-eslint/typescript-estree": "4.31.2", 8013 "@typescript-eslint/typescript-estree": "5.0.0",
8079 "debug": "^4.3.1" 8014 "debug": "^4.3.1"
8080 },
8081 "dependencies": {
8082 "@typescript-eslint/scope-manager": {
8083 "version": "4.31.2",
8084 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz",
8085 "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==",
8086 "dev": true,
8087 "requires": {
8088 "@typescript-eslint/types": "4.31.2",
8089 "@typescript-eslint/visitor-keys": "4.31.2"
8090 }
8091 },
8092 "@typescript-eslint/types": {
8093 "version": "4.31.2",
8094 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz",
8095 "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==",
8096 "dev": true
8097 },
8098 "@typescript-eslint/typescript-estree": {
8099 "version": "4.31.2",
8100 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz",
8101 "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==",
8102 "dev": true,
8103 "requires": {
8104 "@typescript-eslint/types": "4.31.2",
8105 "@typescript-eslint/visitor-keys": "4.31.2",
8106 "debug": "^4.3.1",
8107 "globby": "^11.0.3",
8108 "is-glob": "^4.0.1",
8109 "semver": "^7.3.5",
8110 "tsutils": "^3.21.0"
8111 }
8112 },
8113 "@typescript-eslint/visitor-keys": {
8114 "version": "4.31.2",
8115 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz",
8116 "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==",
8117 "dev": true,
8118 "requires": {
8119 "@typescript-eslint/types": "4.31.2",
8120 "eslint-visitor-keys": "^2.0.0"
8121 }
8122 },
8123 "is-glob": {
8124 "version": "4.0.1",
8125 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
8126 "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
8127 "dev": true,
8128 "requires": {
8129 "is-extglob": "^2.1.1"
8130 }
8131 }
8132 } 8015 }
8133 }, 8016 },
8134 "@typescript-eslint/scope-manager": { 8017 "@typescript-eslint/scope-manager": {
8135 "version": "4.28.5", 8018 "version": "5.0.0",
8136 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.5.tgz", 8019 "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.0.0.tgz",
8137 "integrity": "sha512-PHLq6n9nTMrLYcVcIZ7v0VY1X7dK309NM8ya9oL/yG8syFINIMHxyr2GzGoBYUdv3NUfCOqtuqps0ZmcgnZTfQ==", 8020 "integrity": "sha512-5RFjdA/ain/MDUHYXdF173btOKncIrLuBmA9s6FJhzDrRAyVSA+70BHg0/MW6TE+UiKVyRtX91XpVS0gVNwVDQ==",
8138 "dev": true, 8021 "dev": true,
8139 "requires": { 8022 "requires": {
8140 "@typescript-eslint/types": "4.28.5", 8023 "@typescript-eslint/types": "5.0.0",
8141 "@typescript-eslint/visitor-keys": "4.28.5" 8024 "@typescript-eslint/visitor-keys": "5.0.0"
8142 } 8025 }
8143 }, 8026 },
8144 "@typescript-eslint/types": { 8027 "@typescript-eslint/types": {
8145 "version": "4.28.5", 8028 "version": "5.0.0",
8146 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.5.tgz", 8029 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.0.0.tgz",
8147 "integrity": "sha512-MruOu4ZaDOLOhw4f/6iudyks/obuvvZUAHBDSW80Trnc5+ovmViLT2ZMDXhUV66ozcl6z0LJfKs1Usldgi/WCA==", 8030 "integrity": "sha512-dU/pKBUpehdEqYuvkojmlv0FtHuZnLXFBn16zsDmlFF3LXkOpkAQ2vrKc3BidIIve9EMH2zfTlxqw9XM0fFN5w==",
8148 "dev": true 8031 "dev": true
8149 }, 8032 },
8150 "@typescript-eslint/typescript-estree": { 8033 "@typescript-eslint/typescript-estree": {
8151 "version": "4.28.5", 8034 "version": "5.0.0",
8152 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.5.tgz", 8035 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.0.0.tgz",
8153 "integrity": "sha512-FzJUKsBX8poCCdve7iV7ShirP8V+ys2t1fvamVeD1rWpiAnIm550a+BX/fmTHrjEpQJ7ZAn+Z7ZZwJjytk9rZw==", 8036 "integrity": "sha512-V/6w+PPQMhinWKSn+fCiX5jwvd1vRBm7AX7SJQXEGQtwtBvjMPjaU3YTQ1ik2UF1u96X7tsB96HMnulG3eLi9Q==",
8154 "dev": true, 8037 "dev": true,
8155 "requires": { 8038 "requires": {
8156 "@typescript-eslint/types": "4.28.5", 8039 "@typescript-eslint/types": "5.0.0",
8157 "@typescript-eslint/visitor-keys": "4.28.5", 8040 "@typescript-eslint/visitor-keys": "5.0.0",
8158 "debug": "^4.3.1", 8041 "debug": "^4.3.1",
8159 "globby": "^11.0.3", 8042 "globby": "^11.0.3",
8160 "is-glob": "^4.0.1", 8043 "is-glob": "^4.0.1",
@@ -8163,9 +8046,9 @@
8163 }, 8046 },
8164 "dependencies": { 8047 "dependencies": {
8165 "is-glob": { 8048 "is-glob": {
8166 "version": "4.0.1", 8049 "version": "4.0.3",
8167 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 8050 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
8168 "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 8051 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
8169 "dev": true, 8052 "dev": true,
8170 "requires": { 8053 "requires": {
8171 "is-extglob": "^2.1.1" 8054 "is-extglob": "^2.1.1"
@@ -8174,13 +8057,21 @@
8174 } 8057 }
8175 }, 8058 },
8176 "@typescript-eslint/visitor-keys": { 8059 "@typescript-eslint/visitor-keys": {
8177 "version": "4.28.5", 8060 "version": "5.0.0",
8178 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.5.tgz", 8061 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.0.0.tgz",
8179 "integrity": "sha512-dva/7Rr+EkxNWdJWau26xU/0slnFlkh88v3TsyTgRS/IIYFi5iIfpCFM4ikw0vQTFUR9FYSSyqgK4w64gsgxhg==", 8062 "integrity": "sha512-yRyd2++o/IrJdyHuYMxyFyBhU762MRHQ/bAGQeTnN3pGikfh+nEmM61XTqaDH1XDp53afZ+waXrk0ZvenoZ6xw==",
8180 "dev": true, 8063 "dev": true,
8181 "requires": { 8064 "requires": {
8182 "@typescript-eslint/types": "4.28.5", 8065 "@typescript-eslint/types": "5.0.0",
8183 "eslint-visitor-keys": "^2.0.0" 8066 "eslint-visitor-keys": "^3.0.0"
8067 },
8068 "dependencies": {
8069 "eslint-visitor-keys": {
8070 "version": "3.0.0",
8071 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
8072 "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
8073 "dev": true
8074 }
8184 } 8075 }
8185 }, 8076 },
8186 "@ungap/promise-all-settled": { 8077 "@ungap/promise-all-settled": {
@@ -9524,26 +9415,85 @@
9524 "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 9415 "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
9525 }, 9416 },
9526 "array.prototype.flat": { 9417 "array.prototype.flat": {
9527 "version": "1.2.4", 9418 "version": "1.2.5",
9528 "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", 9419 "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
9529 "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", 9420 "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
9530 "dev": true, 9421 "dev": true,
9531 "requires": { 9422 "requires": {
9532 "call-bind": "^1.0.0", 9423 "call-bind": "^1.0.2",
9533 "define-properties": "^1.1.3", 9424 "define-properties": "^1.1.3",
9534 "es-abstract": "^1.18.0-next.1" 9425 "es-abstract": "^1.19.0"
9426 },
9427 "dependencies": {
9428 "es-abstract": {
9429 "version": "1.19.1",
9430 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
9431 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
9432 "dev": true,
9433 "requires": {
9434 "call-bind": "^1.0.2",
9435 "es-to-primitive": "^1.2.1",
9436 "function-bind": "^1.1.1",
9437 "get-intrinsic": "^1.1.1",
9438 "get-symbol-description": "^1.0.0",
9439 "has": "^1.0.3",
9440 "has-symbols": "^1.0.2",
9441 "internal-slot": "^1.0.3",
9442 "is-callable": "^1.2.4",
9443 "is-negative-zero": "^2.0.1",
9444 "is-regex": "^1.1.4",
9445 "is-shared-array-buffer": "^1.0.1",
9446 "is-string": "^1.0.7",
9447 "is-weakref": "^1.0.1",
9448 "object-inspect": "^1.11.0",
9449 "object-keys": "^1.1.1",
9450 "object.assign": "^4.1.2",
9451 "string.prototype.trimend": "^1.0.4",
9452 "string.prototype.trimstart": "^1.0.4",
9453 "unbox-primitive": "^1.0.1"
9454 }
9455 }
9535 } 9456 }
9536 }, 9457 },
9537 "array.prototype.flatmap": { 9458 "array.prototype.flatmap": {
9538 "version": "1.2.4", 9459 "version": "1.2.5",
9539 "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", 9460 "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
9540 "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", 9461 "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
9541 "dev": true, 9462 "dev": true,
9542 "requires": { 9463 "requires": {
9543 "call-bind": "^1.0.0", 9464 "call-bind": "^1.0.0",
9544 "define-properties": "^1.1.3", 9465 "define-properties": "^1.1.3",
9545 "es-abstract": "^1.18.0-next.1", 9466 "es-abstract": "^1.19.0"
9546 "function-bind": "^1.1.1" 9467 },
9468 "dependencies": {
9469 "es-abstract": {
9470 "version": "1.19.1",
9471 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
9472 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
9473 "dev": true,
9474 "requires": {
9475 "call-bind": "^1.0.2",
9476 "es-to-primitive": "^1.2.1",
9477 "function-bind": "^1.1.1",
9478 "get-intrinsic": "^1.1.1",
9479 "get-symbol-description": "^1.0.0",
9480 "has": "^1.0.3",
9481 "has-symbols": "^1.0.2",
9482 "internal-slot": "^1.0.3",
9483 "is-callable": "^1.2.4",
9484 "is-negative-zero": "^2.0.1",
9485 "is-regex": "^1.1.4",
9486 "is-shared-array-buffer": "^1.0.1",
9487 "is-string": "^1.0.7",
9488 "is-weakref": "^1.0.1",
9489 "object-inspect": "^1.11.0",
9490 "object-keys": "^1.1.1",
9491 "object.assign": "^4.1.2",
9492 "string.prototype.trimend": "^1.0.4",
9493 "string.prototype.trimstart": "^1.0.4",
9494 "unbox-primitive": "^1.0.1"
9495 }
9496 }
9547 } 9497 }
9548 }, 9498 },
9549 "arrify": { 9499 "arrify": {
@@ -9664,12 +9614,6 @@
9664 "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", 9614 "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
9665 "dev": true 9615 "dev": true
9666 }, 9616 },
9667 "astral-regex": {
9668 "version": "2.0.0",
9669 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
9670 "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
9671 "dev": true
9672 },
9673 "async": { 9617 "async": {
9674 "version": "3.2.1", 9618 "version": "3.2.1",
9675 "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz", 9619 "resolved": "https://registry.npmjs.org/async/-/async-3.2.1.tgz",
@@ -14708,37 +14652,36 @@
14708 } 14652 }
14709 }, 14653 },
14710 "eslint": { 14654 "eslint": {
14711 "version": "7.32.0", 14655 "version": "8.0.1",
14712 "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 14656 "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz",
14713 "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 14657 "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==",
14714 "dev": true, 14658 "dev": true,
14715 "requires": { 14659 "requires": {
14716 "@babel/code-frame": "7.12.11", 14660 "@eslint/eslintrc": "^1.0.3",
14717 "@eslint/eslintrc": "^0.4.3", 14661 "@humanwhocodes/config-array": "^0.6.0",
14718 "@humanwhocodes/config-array": "^0.5.0",
14719 "ajv": "^6.10.0", 14662 "ajv": "^6.10.0",
14720 "chalk": "^4.0.0", 14663 "chalk": "^4.0.0",
14721 "cross-spawn": "^7.0.2", 14664 "cross-spawn": "^7.0.2",
14722 "debug": "^4.0.1", 14665 "debug": "^4.3.2",
14723 "doctrine": "^3.0.0", 14666 "doctrine": "^3.0.0",
14724 "enquirer": "^2.3.5", 14667 "enquirer": "^2.3.5",
14725 "escape-string-regexp": "^4.0.0", 14668 "escape-string-regexp": "^4.0.0",
14726 "eslint-scope": "^5.1.1", 14669 "eslint-scope": "^6.0.0",
14727 "eslint-utils": "^2.1.0", 14670 "eslint-utils": "^3.0.0",
14728 "eslint-visitor-keys": "^2.0.0", 14671 "eslint-visitor-keys": "^3.0.0",
14729 "espree": "^7.3.1", 14672 "espree": "^9.0.0",
14730 "esquery": "^1.4.0", 14673 "esquery": "^1.4.0",
14731 "esutils": "^2.0.2", 14674 "esutils": "^2.0.2",
14732 "fast-deep-equal": "^3.1.3", 14675 "fast-deep-equal": "^3.1.3",
14733 "file-entry-cache": "^6.0.1", 14676 "file-entry-cache": "^6.0.1",
14734 "functional-red-black-tree": "^1.0.1", 14677 "functional-red-black-tree": "^1.0.1",
14735 "glob-parent": "^5.1.2", 14678 "glob-parent": "^6.0.1",
14736 "globals": "^13.6.0", 14679 "globals": "^13.6.0",
14737 "ignore": "^4.0.6", 14680 "ignore": "^4.0.6",
14738 "import-fresh": "^3.0.0", 14681 "import-fresh": "^3.0.0",
14739 "imurmurhash": "^0.1.4", 14682 "imurmurhash": "^0.1.4",
14740 "is-glob": "^4.0.0", 14683 "is-glob": "^4.0.0",
14741 "js-yaml": "^3.13.1", 14684 "js-yaml": "^4.1.0",
14742 "json-stable-stringify-without-jsonify": "^1.0.1", 14685 "json-stable-stringify-without-jsonify": "^1.0.1",
14743 "levn": "^0.4.1", 14686 "levn": "^0.4.1",
14744 "lodash.merge": "^4.6.2", 14687 "lodash.merge": "^4.6.2",
@@ -14746,24 +14689,14 @@
14746 "natural-compare": "^1.4.0", 14689 "natural-compare": "^1.4.0",
14747 "optionator": "^0.9.1", 14690 "optionator": "^0.9.1",
14748 "progress": "^2.0.0", 14691 "progress": "^2.0.0",
14749 "regexpp": "^3.1.0", 14692 "regexpp": "^3.2.0",
14750 "semver": "^7.2.1", 14693 "semver": "^7.2.1",
14751 "strip-ansi": "^6.0.0", 14694 "strip-ansi": "^6.0.0",
14752 "strip-json-comments": "^3.1.0", 14695 "strip-json-comments": "^3.1.0",
14753 "table": "^6.0.9",
14754 "text-table": "^0.2.0", 14696 "text-table": "^0.2.0",
14755 "v8-compile-cache": "^2.0.3" 14697 "v8-compile-cache": "^2.0.3"
14756 }, 14698 },
14757 "dependencies": { 14699 "dependencies": {
14758 "@babel/code-frame": {
14759 "version": "7.12.11",
14760 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
14761 "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
14762 "dev": true,
14763 "requires": {
14764 "@babel/highlight": "^7.10.4"
14765 }
14766 },
14767 "ansi-colors": { 14700 "ansi-colors": {
14768 "version": "4.1.1", 14701 "version": "4.1.1",
14769 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 14702 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
@@ -14771,9 +14704,9 @@
14771 "dev": true 14704 "dev": true
14772 }, 14705 },
14773 "ansi-regex": { 14706 "ansi-regex": {
14774 "version": "5.0.0", 14707 "version": "5.0.1",
14775 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 14708 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
14776 "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 14709 "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
14777 "dev": true 14710 "dev": true
14778 }, 14711 },
14779 "ansi-styles": { 14712 "ansi-styles": {
@@ -14785,15 +14718,6 @@
14785 "color-convert": "^2.0.1" 14718 "color-convert": "^2.0.1"
14786 } 14719 }
14787 }, 14720 },
14788 "argparse": {
14789 "version": "1.0.10",
14790 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
14791 "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
14792 "dev": true,
14793 "requires": {
14794 "sprintf-js": "~1.0.2"
14795 }
14796 },
14797 "chalk": { 14721 "chalk": {
14798 "version": "4.1.2", 14722 "version": "4.1.2",
14799 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 14723 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -14845,36 +14769,41 @@
14845 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 14769 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
14846 "dev": true 14770 "dev": true
14847 }, 14771 },
14848 "eslint-utils": { 14772 "eslint-scope": {
14849 "version": "2.1.0", 14773 "version": "6.0.0",
14850 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 14774 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
14851 "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 14775 "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==",
14852 "dev": true, 14776 "dev": true,
14853 "requires": { 14777 "requires": {
14854 "eslint-visitor-keys": "^1.1.0" 14778 "esrecurse": "^4.3.0",
14855 }, 14779 "estraverse": "^5.2.0"
14856 "dependencies": {
14857 "eslint-visitor-keys": {
14858 "version": "1.3.0",
14859 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
14860 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
14861 "dev": true
14862 }
14863 } 14780 }
14864 }, 14781 },
14782 "eslint-visitor-keys": {
14783 "version": "3.0.0",
14784 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
14785 "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
14786 "dev": true
14787 },
14788 "estraverse": {
14789 "version": "5.2.0",
14790 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
14791 "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
14792 "dev": true
14793 },
14865 "glob-parent": { 14794 "glob-parent": {
14866 "version": "5.1.2", 14795 "version": "6.0.2",
14867 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 14796 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
14868 "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 14797 "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
14869 "dev": true, 14798 "dev": true,
14870 "requires": { 14799 "requires": {
14871 "is-glob": "^4.0.1" 14800 "is-glob": "^4.0.3"
14872 } 14801 }
14873 }, 14802 },
14874 "globals": { 14803 "globals": {
14875 "version": "13.10.0", 14804 "version": "13.11.0",
14876 "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", 14805 "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
14877 "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", 14806 "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
14878 "dev": true, 14807 "dev": true,
14879 "requires": { 14808 "requires": {
14880 "type-fest": "^0.20.2" 14809 "type-fest": "^0.20.2"
@@ -14893,24 +14822,14 @@
14893 "dev": true 14822 "dev": true
14894 }, 14823 },
14895 "is-glob": { 14824 "is-glob": {
14896 "version": "4.0.1", 14825 "version": "4.0.3",
14897 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 14826 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
14898 "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 14827 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
14899 "dev": true, 14828 "dev": true,
14900 "requires": { 14829 "requires": {
14901 "is-extglob": "^2.1.1" 14830 "is-extglob": "^2.1.1"
14902 } 14831 }
14903 }, 14832 },
14904 "js-yaml": {
14905 "version": "3.14.1",
14906 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
14907 "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
14908 "dev": true,
14909 "requires": {
14910 "argparse": "^1.0.7",
14911 "esprima": "^4.0.0"
14912 }
14913 },
14914 "path-key": { 14833 "path-key": {
14915 "version": "3.1.1", 14834 "version": "3.1.1",
14916 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 14835 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -14933,12 +14852,12 @@
14933 "dev": true 14852 "dev": true
14934 }, 14853 },
14935 "strip-ansi": { 14854 "strip-ansi": {
14936 "version": "6.0.0", 14855 "version": "6.0.1",
14937 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 14856 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
14938 "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 14857 "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
14939 "dev": true, 14858 "dev": true,
14940 "requires": { 14859 "requires": {
14941 "ansi-regex": "^5.0.0" 14860 "ansi-regex": "^5.0.1"
14942 } 14861 }
14943 }, 14862 },
14944 "strip-json-comments": { 14863 "strip-json-comments": {
@@ -14996,10 +14915,13 @@
14996 } 14915 }
14997 }, 14916 },
14998 "eslint-config-airbnb-typescript": { 14917 "eslint-config-airbnb-typescript": {
14999 "version": "14.0.0", 14918 "version": "14.0.1",
15000 "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-14.0.0.tgz", 14919 "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-14.0.1.tgz",
15001 "integrity": "sha512-d2Nit2ByZARGRYK6tgSNl3nnmGZPyvsgbsKFcmm+nAhvT8VjVpifG5jI4tzObUUPb0sWw0E1oO/0pSpBD/pIuQ==", 14920 "integrity": "sha512-tF4GwC3sRrw8kEj4/yxX8F7AcLzj/1IESBnsCiFMplzYmxre459qm2z9DFkCpqBVQFSH6j2K4+VKVteX4m0GsQ==",
15002 "dev": true 14921 "dev": true,
14922 "requires": {
14923 "eslint-config-airbnb-base": "14.2.1"
14924 }
15003 }, 14925 },
15004 "eslint-config-prettier": { 14926 "eslint-config-prettier": {
15005 "version": "8.3.0", 14927 "version": "8.3.0",
@@ -15029,12 +14951,13 @@
15029 } 14951 }
15030 }, 14952 },
15031 "eslint-module-utils": { 14953 "eslint-module-utils": {
15032 "version": "2.6.2", 14954 "version": "2.7.1",
15033 "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", 14955 "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
15034 "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", 14956 "integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
15035 "dev": true, 14957 "dev": true,
15036 "requires": { 14958 "requires": {
15037 "debug": "^3.2.7", 14959 "debug": "^3.2.7",
14960 "find-up": "^2.1.0",
15038 "pkg-dir": "^2.0.0" 14961 "pkg-dir": "^2.0.0"
15039 }, 14962 },
15040 "dependencies": { 14963 "dependencies": {
@@ -15108,28 +15031,39 @@
15108 } 15031 }
15109 }, 15032 },
15110 "eslint-plugin-import": { 15033 "eslint-plugin-import": {
15111 "version": "2.24.2", 15034 "version": "2.25.2",
15112 "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", 15035 "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
15113 "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", 15036 "integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
15114 "dev": true, 15037 "dev": true,
15115 "requires": { 15038 "requires": {
15116 "array-includes": "^3.1.3", 15039 "array-includes": "^3.1.4",
15117 "array.prototype.flat": "^1.2.4", 15040 "array.prototype.flat": "^1.2.5",
15118 "debug": "^2.6.9", 15041 "debug": "^2.6.9",
15119 "doctrine": "^2.1.0", 15042 "doctrine": "^2.1.0",
15120 "eslint-import-resolver-node": "^0.3.6", 15043 "eslint-import-resolver-node": "^0.3.6",
15121 "eslint-module-utils": "^2.6.2", 15044 "eslint-module-utils": "^2.7.0",
15122 "find-up": "^2.0.0",
15123 "has": "^1.0.3", 15045 "has": "^1.0.3",
15124 "is-core-module": "^2.6.0", 15046 "is-core-module": "^2.7.0",
15047 "is-glob": "^4.0.3",
15125 "minimatch": "^3.0.4", 15048 "minimatch": "^3.0.4",
15126 "object.values": "^1.1.4", 15049 "object.values": "^1.1.5",
15127 "pkg-up": "^2.0.0",
15128 "read-pkg-up": "^3.0.0",
15129 "resolve": "^1.20.0", 15050 "resolve": "^1.20.0",
15130 "tsconfig-paths": "^3.11.0" 15051 "tsconfig-paths": "^3.11.0"
15131 }, 15052 },
15132 "dependencies": { 15053 "dependencies": {
15054 "array-includes": {
15055 "version": "3.1.4",
15056 "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
15057 "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
15058 "dev": true,
15059 "requires": {
15060 "call-bind": "^1.0.2",
15061 "define-properties": "^1.1.3",
15062 "es-abstract": "^1.19.1",
15063 "get-intrinsic": "^1.1.1",
15064 "is-string": "^1.0.7"
15065 }
15066 },
15133 "debug": { 15067 "debug": {
15134 "version": "2.6.9", 15068 "version": "2.6.9",
15135 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 15069 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -15148,32 +15082,50 @@
15148 "esutils": "^2.0.2" 15082 "esutils": "^2.0.2"
15149 } 15083 }
15150 }, 15084 },
15151 "find-up": { 15085 "es-abstract": {
15152 "version": "2.1.0", 15086 "version": "1.19.1",
15153 "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 15087 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
15154 "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 15088 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
15155 "dev": true, 15089 "dev": true,
15156 "requires": { 15090 "requires": {
15157 "locate-path": "^2.0.0" 15091 "call-bind": "^1.0.2",
15092 "es-to-primitive": "^1.2.1",
15093 "function-bind": "^1.1.1",
15094 "get-intrinsic": "^1.1.1",
15095 "get-symbol-description": "^1.0.0",
15096 "has": "^1.0.3",
15097 "has-symbols": "^1.0.2",
15098 "internal-slot": "^1.0.3",
15099 "is-callable": "^1.2.4",
15100 "is-negative-zero": "^2.0.1",
15101 "is-regex": "^1.1.4",
15102 "is-shared-array-buffer": "^1.0.1",
15103 "is-string": "^1.0.7",
15104 "is-weakref": "^1.0.1",
15105 "object-inspect": "^1.11.0",
15106 "object-keys": "^1.1.1",
15107 "object.assign": "^4.1.2",
15108 "string.prototype.trimend": "^1.0.4",
15109 "string.prototype.trimstart": "^1.0.4",
15110 "unbox-primitive": "^1.0.1"
15158 } 15111 }
15159 }, 15112 },
15160 "is-core-module": { 15113 "is-core-module": {
15161 "version": "2.6.0", 15114 "version": "2.8.0",
15162 "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", 15115 "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
15163 "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", 15116 "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
15164 "dev": true, 15117 "dev": true,
15165 "requires": { 15118 "requires": {
15166 "has": "^1.0.3" 15119 "has": "^1.0.3"
15167 } 15120 }
15168 }, 15121 },
15169 "locate-path": { 15122 "is-glob": {
15170 "version": "2.0.0", 15123 "version": "4.0.3",
15171 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 15124 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
15172 "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 15125 "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
15173 "dev": true, 15126 "dev": true,
15174 "requires": { 15127 "requires": {
15175 "p-locate": "^2.0.0", 15128 "is-extglob": "^2.1.1"
15176 "path-exists": "^3.0.0"
15177 } 15129 }
15178 }, 15130 },
15179 "ms": { 15131 "ms": {
@@ -15181,82 +15133,16 @@
15181 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 15133 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
15182 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 15134 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
15183 "dev": true 15135 "dev": true
15184 },
15185 "p-limit": {
15186 "version": "1.3.0",
15187 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
15188 "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
15189 "dev": true,
15190 "requires": {
15191 "p-try": "^1.0.0"
15192 }
15193 },
15194 "p-locate": {
15195 "version": "2.0.0",
15196 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
15197 "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
15198 "dev": true,
15199 "requires": {
15200 "p-limit": "^1.1.0"
15201 }
15202 },
15203 "p-try": {
15204 "version": "1.0.0",
15205 "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
15206 "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
15207 "dev": true
15208 },
15209 "path-exists": {
15210 "version": "3.0.0",
15211 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
15212 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
15213 "dev": true
15214 },
15215 "path-type": {
15216 "version": "3.0.0",
15217 "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
15218 "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
15219 "dev": true,
15220 "requires": {
15221 "pify": "^3.0.0"
15222 }
15223 },
15224 "pify": {
15225 "version": "3.0.0",
15226 "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
15227 "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
15228 "dev": true
15229 },
15230 "read-pkg": {
15231 "version": "3.0.0",
15232 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
15233 "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
15234 "dev": true,
15235 "requires": {
15236 "load-json-file": "^4.0.0",
15237 "normalize-package-data": "^2.3.2",
15238 "path-type": "^3.0.0"
15239 }
15240 },
15241 "read-pkg-up": {
15242 "version": "3.0.0",
15243 "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
15244 "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
15245 "dev": true,
15246 "requires": {
15247 "find-up": "^2.0.0",
15248 "read-pkg": "^3.0.0"
15249 }
15250 } 15136 }
15251 } 15137 }
15252 }, 15138 },
15253 "eslint-plugin-jest": { 15139 "eslint-plugin-jest": {
15254 "version": "24.4.0", 15140 "version": "25.2.1",
15255 "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", 15141 "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.2.1.tgz",
15256 "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", 15142 "integrity": "sha512-fC6T95lqgWHsdVFd+f0kTHH32NxbIzIm1fJ/3kGaCFcQP1fJc5khV7DzUHjNQSTOHd5Toa7ccEBptab4uFqbNQ==",
15257 "dev": true, 15143 "dev": true,
15258 "requires": { 15144 "requires": {
15259 "@typescript-eslint/experimental-utils": "^4.0.1" 15145 "@typescript-eslint/experimental-utils": "^5.0.0"
15260 } 15146 }
15261 }, 15147 },
15262 "eslint-plugin-jsx-a11y": { 15148 "eslint-plugin-jsx-a11y": {
@@ -15296,23 +15182,24 @@
15296 } 15182 }
15297 }, 15183 },
15298 "eslint-plugin-react": { 15184 "eslint-plugin-react": {
15299 "version": "7.25.1", 15185 "version": "7.26.1",
15300 "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz", 15186 "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz",
15301 "integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==", 15187 "integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==",
15302 "dev": true, 15188 "dev": true,
15303 "requires": { 15189 "requires": {
15304 "array-includes": "^3.1.3", 15190 "array-includes": "^3.1.3",
15305 "array.prototype.flatmap": "^1.2.4", 15191 "array.prototype.flatmap": "^1.2.4",
15306 "doctrine": "^2.1.0", 15192 "doctrine": "^2.1.0",
15307 "estraverse": "^5.2.0", 15193 "estraverse": "^5.2.0",
15308 "has": "^1.0.3",
15309 "jsx-ast-utils": "^2.4.1 || ^3.0.0", 15194 "jsx-ast-utils": "^2.4.1 || ^3.0.0",
15310 "minimatch": "^3.0.4", 15195 "minimatch": "^3.0.4",
15311 "object.entries": "^1.1.4", 15196 "object.entries": "^1.1.4",
15312 "object.fromentries": "^2.0.4", 15197 "object.fromentries": "^2.0.4",
15198 "object.hasown": "^1.0.0",
15313 "object.values": "^1.1.4", 15199 "object.values": "^1.1.4",
15314 "prop-types": "^15.7.2", 15200 "prop-types": "^15.7.2",
15315 "resolve": "^2.0.0-next.3", 15201 "resolve": "^2.0.0-next.3",
15202 "semver": "^6.3.0",
15316 "string.prototype.matchall": "^4.0.5" 15203 "string.prototype.matchall": "^4.0.5"
15317 }, 15204 },
15318 "dependencies": { 15205 "dependencies": {
@@ -15340,6 +15227,12 @@
15340 "is-core-module": "^2.2.0", 15227 "is-core-module": "^2.2.0",
15341 "path-parse": "^1.0.6" 15228 "path-parse": "^1.0.6"
15342 } 15229 }
15230 },
15231 "semver": {
15232 "version": "6.3.0",
15233 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
15234 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
15235 "dev": true
15343 } 15236 }
15344 } 15237 }
15345 }, 15238 },
@@ -15350,9 +15243,9 @@
15350 "dev": true 15243 "dev": true
15351 }, 15244 },
15352 "eslint-plugin-unicorn": { 15245 "eslint-plugin-unicorn": {
15353 "version": "36.0.0", 15246 "version": "37.0.1",
15354 "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-36.0.0.tgz", 15247 "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-37.0.1.tgz",
15355 "integrity": "sha512-xxN2vSctGWnDW6aLElm/LKIwcrmk6mdiEcW55Uv5krcrVcIFSWMmEgc/hwpemYfZacKZ5npFERGNz4aThsp1AA==", 15248 "integrity": "sha512-E1jq5u9ojnadisJcPi+hMXTGSiIzkIUMDvWsBudsCGXvKUB2aNSU2TcfyW2/jAS5A4ryBXfzxLykMxX1EdluSQ==",
15356 "dev": true, 15249 "dev": true,
15357 "requires": { 15250 "requires": {
15358 "@babel/helper-validator-identifier": "^7.14.9", 15251 "@babel/helper-validator-identifier": "^7.14.9",
@@ -15360,15 +15253,24 @@
15360 "clean-regexp": "^1.0.0", 15253 "clean-regexp": "^1.0.0",
15361 "eslint-template-visitor": "^2.3.2", 15254 "eslint-template-visitor": "^2.3.2",
15362 "eslint-utils": "^3.0.0", 15255 "eslint-utils": "^3.0.0",
15256 "esquery": "^1.4.0",
15257 "indent-string": "4",
15363 "is-builtin-module": "^3.1.0", 15258 "is-builtin-module": "^3.1.0",
15364 "lodash": "^4.17.21", 15259 "lodash": "^4.17.21",
15365 "pluralize": "^8.0.0", 15260 "pluralize": "^8.0.0",
15366 "read-pkg-up": "^7.0.1", 15261 "read-pkg-up": "^7.0.1",
15367 "regexp-tree": "^0.1.23", 15262 "regexp-tree": "^0.1.23",
15368 "safe-regex": "^2.1.1", 15263 "safe-regex": "^2.1.1",
15369 "semver": "^7.3.5" 15264 "semver": "^7.3.5",
15265 "strip-indent": "^3.0.0"
15370 }, 15266 },
15371 "dependencies": { 15267 "dependencies": {
15268 "indent-string": {
15269 "version": "4.0.0",
15270 "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
15271 "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
15272 "dev": true
15273 },
15372 "pluralize": { 15274 "pluralize": {
15373 "version": "8.0.0", 15275 "version": "8.0.0",
15374 "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", 15276 "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@@ -15425,20 +15327,26 @@
15425 "dev": true 15327 "dev": true
15426 }, 15328 },
15427 "espree": { 15329 "espree": {
15428 "version": "7.3.1", 15330 "version": "9.0.0",
15429 "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 15331 "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz",
15430 "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 15332 "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==",
15431 "dev": true, 15333 "dev": true,
15432 "requires": { 15334 "requires": {
15433 "acorn": "^7.4.0", 15335 "acorn": "^8.5.0",
15434 "acorn-jsx": "^5.3.1", 15336 "acorn-jsx": "^5.3.1",
15435 "eslint-visitor-keys": "^1.3.0" 15337 "eslint-visitor-keys": "^3.0.0"
15436 }, 15338 },
15437 "dependencies": { 15339 "dependencies": {
15340 "acorn": {
15341 "version": "8.5.0",
15342 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
15343 "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
15344 "dev": true
15345 },
15438 "eslint-visitor-keys": { 15346 "eslint-visitor-keys": {
15439 "version": "1.3.0", 15347 "version": "3.0.0",
15440 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 15348 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz",
15441 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 15349 "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==",
15442 "dev": true 15350 "dev": true
15443 } 15351 }
15444 } 15352 }
@@ -16391,31 +16299,6 @@
16391 "requires": { 16299 "requires": {
16392 "flatted": "^3.1.0", 16300 "flatted": "^3.1.0",
16393 "rimraf": "^3.0.2" 16301 "rimraf": "^3.0.2"
16394 },
16395 "dependencies": {
16396 "glob": {
16397 "version": "7.1.7",
16398 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
16399 "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
16400 "dev": true,
16401 "requires": {
16402 "fs.realpath": "^1.0.0",
16403 "inflight": "^1.0.4",
16404 "inherits": "2",
16405 "minimatch": "^3.0.4",
16406 "once": "^1.3.0",
16407 "path-is-absolute": "^1.0.0"
16408 }
16409 },
16410 "rimraf": {
16411 "version": "3.0.2",
16412 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
16413 "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
16414 "dev": true,
16415 "requires": {
16416 "glob": "^7.1.3"
16417 }
16418 }
16419 } 16302 }
16420 }, 16303 },
16421 "flatted": { 16304 "flatted": {
@@ -16879,6 +16762,16 @@
16879 "pump": "^3.0.0" 16762 "pump": "^3.0.0"
16880 } 16763 }
16881 }, 16764 },
16765 "get-symbol-description": {
16766 "version": "1.0.0",
16767 "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
16768 "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
16769 "dev": true,
16770 "requires": {
16771 "call-bind": "^1.0.2",
16772 "get-intrinsic": "^1.1.1"
16773 }
16774 },
16882 "get-value": { 16775 "get-value": {
16883 "version": "2.0.6", 16776 "version": "2.0.6",
16884 "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 16777 "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -19127,6 +19020,12 @@
19127 "is-unc-path": "^1.0.0" 19020 "is-unc-path": "^1.0.0"
19128 } 19021 }
19129 }, 19022 },
19023 "is-shared-array-buffer": {
19024 "version": "1.0.1",
19025 "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
19026 "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
19027 "dev": true
19028 },
19130 "is-ssh": { 19029 "is-ssh": {
19131 "version": "1.3.3", 19030 "version": "1.3.3",
19132 "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz", 19031 "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.3.tgz",
@@ -19199,6 +19098,15 @@
19199 "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", 19098 "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
19200 "dev": true 19099 "dev": true
19201 }, 19100 },
19101 "is-weakref": {
19102 "version": "1.0.1",
19103 "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
19104 "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
19105 "dev": true,
19106 "requires": {
19107 "call-bind": "^1.0.0"
19108 }
19109 },
19202 "is-windows": { 19110 "is-windows": {
19203 "version": "1.0.2", 19111 "version": "1.0.2",
19204 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 19112 "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
@@ -21830,12 +21738,6 @@
21830 "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 21738 "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
21831 "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 21739 "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
21832 }, 21740 },
21833 "lodash.clonedeep": {
21834 "version": "4.5.0",
21835 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
21836 "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
21837 "dev": true
21838 },
21839 "lodash.debounce": { 21741 "lodash.debounce": {
21840 "version": "4.0.8", 21742 "version": "4.0.8",
21841 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 21743 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -21924,12 +21826,6 @@
21924 "lodash._reinterpolate": "^3.0.0" 21826 "lodash._reinterpolate": "^3.0.0"
21925 } 21827 }
21926 }, 21828 },
21927 "lodash.truncate": {
21928 "version": "4.4.2",
21929 "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
21930 "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
21931 "dev": true
21932 },
21933 "log-ok": { 21829 "log-ok": {
21934 "version": "0.1.1", 21830 "version": "0.1.1",
21935 "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz", 21831 "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
@@ -24319,15 +24215,44 @@
24319 } 24215 }
24320 }, 24216 },
24321 "object.fromentries": { 24217 "object.fromentries": {
24322 "version": "2.0.4", 24218 "version": "2.0.5",
24323 "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", 24219 "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
24324 "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", 24220 "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
24325 "dev": true, 24221 "dev": true,
24326 "requires": { 24222 "requires": {
24327 "call-bind": "^1.0.2", 24223 "call-bind": "^1.0.2",
24328 "define-properties": "^1.1.3", 24224 "define-properties": "^1.1.3",
24329 "es-abstract": "^1.18.0-next.2", 24225 "es-abstract": "^1.19.1"
24330 "has": "^1.0.3" 24226 },
24227 "dependencies": {
24228 "es-abstract": {
24229 "version": "1.19.1",
24230 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
24231 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
24232 "dev": true,
24233 "requires": {
24234 "call-bind": "^1.0.2",
24235 "es-to-primitive": "^1.2.1",
24236 "function-bind": "^1.1.1",
24237 "get-intrinsic": "^1.1.1",
24238 "get-symbol-description": "^1.0.0",
24239 "has": "^1.0.3",
24240 "has-symbols": "^1.0.2",
24241 "internal-slot": "^1.0.3",
24242 "is-callable": "^1.2.4",
24243 "is-negative-zero": "^2.0.1",
24244 "is-regex": "^1.1.4",
24245 "is-shared-array-buffer": "^1.0.1",
24246 "is-string": "^1.0.7",
24247 "is-weakref": "^1.0.1",
24248 "object-inspect": "^1.11.0",
24249 "object-keys": "^1.1.1",
24250 "object.assign": "^4.1.2",
24251 "string.prototype.trimend": "^1.0.4",
24252 "string.prototype.trimstart": "^1.0.4",
24253 "unbox-primitive": "^1.0.1"
24254 }
24255 }
24331 } 24256 }
24332 }, 24257 },
24333 "object.getownpropertydescriptors": { 24258 "object.getownpropertydescriptors": {
@@ -24341,6 +24266,46 @@
24341 "es-abstract": "^1.18.0-next.2" 24266 "es-abstract": "^1.18.0-next.2"
24342 } 24267 }
24343 }, 24268 },
24269 "object.hasown": {
24270 "version": "1.1.0",
24271 "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
24272 "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
24273 "dev": true,
24274 "requires": {
24275 "define-properties": "^1.1.3",
24276 "es-abstract": "^1.19.1"
24277 },
24278 "dependencies": {
24279 "es-abstract": {
24280 "version": "1.19.1",
24281 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
24282 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
24283 "dev": true,
24284 "requires": {
24285 "call-bind": "^1.0.2",
24286 "es-to-primitive": "^1.2.1",
24287 "function-bind": "^1.1.1",
24288 "get-intrinsic": "^1.1.1",
24289 "get-symbol-description": "^1.0.0",
24290 "has": "^1.0.3",
24291 "has-symbols": "^1.0.2",
24292 "internal-slot": "^1.0.3",
24293 "is-callable": "^1.2.4",
24294 "is-negative-zero": "^2.0.1",
24295 "is-regex": "^1.1.4",
24296 "is-shared-array-buffer": "^1.0.1",
24297 "is-string": "^1.0.7",
24298 "is-weakref": "^1.0.1",
24299 "object-inspect": "^1.11.0",
24300 "object-keys": "^1.1.1",
24301 "object.assign": "^4.1.2",
24302 "string.prototype.trimend": "^1.0.4",
24303 "string.prototype.trimstart": "^1.0.4",
24304 "unbox-primitive": "^1.0.1"
24305 }
24306 }
24307 }
24308 },
24344 "object.map": { 24309 "object.map": {
24345 "version": "1.0.1", 24310 "version": "1.0.1",
24346 "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", 24311 "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
@@ -24369,14 +24334,44 @@
24369 } 24334 }
24370 }, 24335 },
24371 "object.values": { 24336 "object.values": {
24372 "version": "1.1.4", 24337 "version": "1.1.5",
24373 "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", 24338 "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
24374 "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", 24339 "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
24375 "dev": true, 24340 "dev": true,
24376 "requires": { 24341 "requires": {
24377 "call-bind": "^1.0.2", 24342 "call-bind": "^1.0.2",
24378 "define-properties": "^1.1.3", 24343 "define-properties": "^1.1.3",
24379 "es-abstract": "^1.18.2" 24344 "es-abstract": "^1.19.1"
24345 },
24346 "dependencies": {
24347 "es-abstract": {
24348 "version": "1.19.1",
24349 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
24350 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
24351 "dev": true,
24352 "requires": {
24353 "call-bind": "^1.0.2",
24354 "es-to-primitive": "^1.2.1",
24355 "function-bind": "^1.1.1",
24356 "get-intrinsic": "^1.1.1",
24357 "get-symbol-description": "^1.0.0",
24358 "has": "^1.0.3",
24359 "has-symbols": "^1.0.2",
24360 "internal-slot": "^1.0.3",
24361 "is-callable": "^1.2.4",
24362 "is-negative-zero": "^2.0.1",
24363 "is-regex": "^1.1.4",
24364 "is-shared-array-buffer": "^1.0.1",
24365 "is-string": "^1.0.7",
24366 "is-weakref": "^1.0.1",
24367 "object-inspect": "^1.11.0",
24368 "object-keys": "^1.1.1",
24369 "object.assign": "^4.1.2",
24370 "string.prototype.trimend": "^1.0.4",
24371 "string.prototype.trimstart": "^1.0.4",
24372 "unbox-primitive": "^1.0.1"
24373 }
24374 }
24380 } 24375 }
24381 }, 24376 },
24382 "obuf": { 24377 "obuf": {
@@ -25133,66 +25128,6 @@
25133 "find-up": "^3.0.0" 25128 "find-up": "^3.0.0"
25134 } 25129 }
25135 }, 25130 },
25136 "pkg-up": {
25137 "version": "2.0.0",
25138 "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
25139 "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
25140 "dev": true,
25141 "requires": {
25142 "find-up": "^2.1.0"
25143 },
25144 "dependencies": {
25145 "find-up": {
25146 "version": "2.1.0",
25147 "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
25148 "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
25149 "dev": true,
25150 "requires": {
25151 "locate-path": "^2.0.0"
25152 }
25153 },
25154 "locate-path": {
25155 "version": "2.0.0",
25156 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
25157 "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
25158 "dev": true,
25159 "requires": {
25160 "p-locate": "^2.0.0",
25161 "path-exists": "^3.0.0"
25162 }
25163 },
25164 "p-limit": {
25165 "version": "1.3.0",
25166 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
25167 "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
25168 "dev": true,
25169 "requires": {
25170 "p-try": "^1.0.0"
25171 }
25172 },
25173 "p-locate": {
25174 "version": "2.0.0",
25175 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
25176 "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
25177 "dev": true,
25178 "requires": {
25179 "p-limit": "^1.1.0"
25180 }
25181 },
25182 "p-try": {
25183 "version": "1.0.0",
25184 "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
25185 "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
25186 "dev": true
25187 },
25188 "path-exists": {
25189 "version": "3.0.0",
25190 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
25191 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
25192 "dev": true
25193 }
25194 }
25195 },
25196 "platform": { 25131 "platform": {
25197 "version": "1.3.6", 25132 "version": "1.3.6",
25198 "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", 25133 "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz",
@@ -26926,9 +26861,9 @@
26926 } 26861 }
26927 }, 26862 },
26928 "regexp-tree": { 26863 "regexp-tree": {
26929 "version": "0.1.23", 26864 "version": "0.1.24",
26930 "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.23.tgz", 26865 "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz",
26931 "integrity": "sha512-+7HWfb4Bvu8Rs2eQTUIpX9I/PlQkYOuTNbRpKLJlQpSgwSkzFYh+pUj0gtvglnOZLKB6YgnIgRuJ2/IlpL48qw==", 26866 "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==",
26932 "dev": true 26867 "dev": true
26933 }, 26868 },
26934 "regexp.prototype.flags": { 26869 "regexp.prototype.flags": {
@@ -27142,12 +27077,6 @@
27142 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 27077 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
27143 "dev": true 27078 "dev": true
27144 }, 27079 },
27145 "require-from-string": {
27146 "version": "2.0.2",
27147 "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
27148 "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
27149 "dev": true
27150 },
27151 "require-main-filename": { 27080 "require-main-filename": {
27152 "version": "1.0.1", 27081 "version": "1.0.1",
27153 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 27082 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
@@ -28735,19 +28664,49 @@
28735 } 28664 }
28736 }, 28665 },
28737 "string.prototype.matchall": { 28666 "string.prototype.matchall": {
28738 "version": "4.0.5", 28667 "version": "4.0.6",
28739 "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", 28668 "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz",
28740 "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", 28669 "integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==",
28741 "dev": true, 28670 "dev": true,
28742 "requires": { 28671 "requires": {
28743 "call-bind": "^1.0.2", 28672 "call-bind": "^1.0.2",
28744 "define-properties": "^1.1.3", 28673 "define-properties": "^1.1.3",
28745 "es-abstract": "^1.18.2", 28674 "es-abstract": "^1.19.1",
28746 "get-intrinsic": "^1.1.1", 28675 "get-intrinsic": "^1.1.1",
28747 "has-symbols": "^1.0.2", 28676 "has-symbols": "^1.0.2",
28748 "internal-slot": "^1.0.3", 28677 "internal-slot": "^1.0.3",
28749 "regexp.prototype.flags": "^1.3.1", 28678 "regexp.prototype.flags": "^1.3.1",
28750 "side-channel": "^1.0.4" 28679 "side-channel": "^1.0.4"
28680 },
28681 "dependencies": {
28682 "es-abstract": {
28683 "version": "1.19.1",
28684 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
28685 "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
28686 "dev": true,
28687 "requires": {
28688 "call-bind": "^1.0.2",
28689 "es-to-primitive": "^1.2.1",
28690 "function-bind": "^1.1.1",
28691 "get-intrinsic": "^1.1.1",
28692 "get-symbol-description": "^1.0.0",
28693 "has": "^1.0.3",
28694 "has-symbols": "^1.0.2",
28695 "internal-slot": "^1.0.3",
28696 "is-callable": "^1.2.4",
28697 "is-negative-zero": "^2.0.1",
28698 "is-regex": "^1.1.4",
28699 "is-shared-array-buffer": "^1.0.1",
28700 "is-string": "^1.0.7",
28701 "is-weakref": "^1.0.1",
28702 "object-inspect": "^1.11.0",
28703 "object-keys": "^1.1.1",
28704 "object.assign": "^4.1.2",
28705 "string.prototype.trimend": "^1.0.4",
28706 "string.prototype.trimstart": "^1.0.4",
28707 "unbox-primitive": "^1.0.1"
28708 }
28709 }
28751 } 28710 }
28752 }, 28711 },
28753 "string.prototype.trimend": { 28712 "string.prototype.trimend": {
@@ -28918,107 +28877,6 @@
28918 "acorn-node": "^1.2.0" 28877 "acorn-node": "^1.2.0"
28919 } 28878 }
28920 }, 28879 },
28921 "table": {
28922 "version": "6.7.1",
28923 "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
28924 "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
28925 "dev": true,
28926 "requires": {
28927 "ajv": "^8.0.1",
28928 "lodash.clonedeep": "^4.5.0",
28929 "lodash.truncate": "^4.4.2",
28930 "slice-ansi": "^4.0.0",
28931 "string-width": "^4.2.0",
28932 "strip-ansi": "^6.0.0"
28933 },
28934 "dependencies": {
28935 "ajv": {
28936 "version": "8.6.2",
28937 "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
28938 "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
28939 "dev": true,
28940 "requires": {
28941 "fast-deep-equal": "^3.1.1",
28942 "json-schema-traverse": "^1.0.0",
28943 "require-from-string": "^2.0.2",
28944 "uri-js": "^4.2.2"
28945 }
28946 },
28947 "ansi-regex": {
28948 "version": "5.0.0",
28949 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
28950 "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
28951 "dev": true
28952 },
28953 "ansi-styles": {
28954 "version": "4.3.0",
28955 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
28956 "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
28957 "dev": true,
28958 "requires": {
28959 "color-convert": "^2.0.1"
28960 }
28961 },
28962 "color-convert": {
28963 "version": "2.0.1",
28964 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
28965 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
28966 "dev": true,
28967 "requires": {
28968 "color-name": "~1.1.4"
28969 }
28970 },
28971 "color-name": {
28972 "version": "1.1.4",
28973 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
28974 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
28975 "dev": true
28976 },
28977 "is-fullwidth-code-point": {
28978 "version": "3.0.0",
28979 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
28980 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
28981 "dev": true
28982 },
28983 "json-schema-traverse": {
28984 "version": "1.0.0",
28985 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
28986 "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
28987 "dev": true
28988 },
28989 "slice-ansi": {
28990 "version": "4.0.0",
28991 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
28992 "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
28993 "dev": true,
28994 "requires": {
28995 "ansi-styles": "^4.0.0",
28996 "astral-regex": "^2.0.0",
28997 "is-fullwidth-code-point": "^3.0.0"
28998 }
28999 },
29000 "string-width": {
29001 "version": "4.2.2",
29002 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
29003 "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
29004 "dev": true,
29005 "requires": {
29006 "emoji-regex": "^8.0.0",
29007 "is-fullwidth-code-point": "^3.0.0",
29008 "strip-ansi": "^6.0.0"
29009 }
29010 },
29011 "strip-ansi": {
29012 "version": "6.0.0",
29013 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
29014 "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
29015 "dev": true,
29016 "requires": {
29017 "ansi-regex": "^5.0.0"
29018 }
29019 }
29020 }
29021 },
29022 "tapable": { 28880 "tapable": {
29023 "version": "1.1.3", 28881 "version": "1.1.3",
29024 "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", 28882 "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
diff --git a/package.json b/package.json
index f818cc496..ce3368fe3 100644
--- a/package.json
+++ b/package.json
@@ -130,7 +130,7 @@
130 "ws": "8.2.2" 130 "ws": "8.2.2"
131 }, 131 },
132 "devDependencies": { 132 "devDependencies": {
133 "@babel/eslint-parser": "7.15.7", 133 "@babel/eslint-parser": "7.15.8",
134 "@babel/plugin-proposal-class-properties": "7.14.5", 134 "@babel/plugin-proposal-class-properties": "7.14.5",
135 "@babel/plugin-proposal-decorators": "7.15.4", 135 "@babel/plugin-proposal-decorators": "7.15.4",
136 "@babel/preset-env": "7.15.6", 136 "@babel/preset-env": "7.15.6",
@@ -153,8 +153,8 @@
153 "@types/tar": "4.0.5", 153 "@types/tar": "4.0.5",
154 "@types/uuid": "8.3.1", 154 "@types/uuid": "8.3.1",
155 "@types/validator": "13.6.3", 155 "@types/validator": "13.6.3",
156 "@typescript-eslint/eslint-plugin": "4.31.2", 156 "@typescript-eslint/eslint-plugin": "5.0.0",
157 "@typescript-eslint/parser": "4.31.2", 157 "@typescript-eslint/parser": "5.0.0",
158 "all-contributors-cli": "6.20.0", 158 "all-contributors-cli": "6.20.0",
159 "babel-plugin-formatjs": "10.3.9", 159 "babel-plugin-formatjs": "10.3.9",
160 "commitizen": "4.2.4", 160 "commitizen": "4.2.4",
@@ -165,17 +165,17 @@
165 "electron": "15.2.0", 165 "electron": "15.2.0",
166 "electron-builder": "22.14.5", 166 "electron-builder": "22.14.5",
167 "electron-notarize": "1.1.0", 167 "electron-notarize": "1.1.0",
168 "eslint": "7.32.0", 168 "eslint": "8.0.1",
169 "eslint-config-airbnb": "18.2.1", 169 "eslint-config-airbnb": "18.2.1",
170 "eslint-config-airbnb-typescript": "14.0.0", 170 "eslint-config-airbnb-typescript": "14.0.1",
171 "eslint-config-prettier": "8.3.0", 171 "eslint-config-prettier": "8.3.0",
172 "eslint-plugin-import": "2.24.2", 172 "eslint-plugin-import": "2.25.2",
173 "eslint-plugin-jest": "24.4.0", 173 "eslint-plugin-jest": "25.2.1",
174 "eslint-plugin-jsx-a11y": "6.4.1", 174 "eslint-plugin-jsx-a11y": "6.4.1",
175 "eslint-plugin-prettier": "4.0.0", 175 "eslint-plugin-prettier": "4.0.0",
176 "eslint-plugin-react": "7.25.1", 176 "eslint-plugin-react": "7.26.1",
177 "eslint-plugin-react-hooks": "4.2.0", 177 "eslint-plugin-react-hooks": "4.2.0",
178 "eslint-plugin-unicorn": "36.0.0", 178 "eslint-plugin-unicorn": "37.0.1",
179 "expect.js": "0.3.1", 179 "expect.js": "0.3.1",
180 "gulp": "4.0.2", 180 "gulp": "4.0.2",
181 "gulp-babel": "8.0.0", 181 "gulp-babel": "8.0.0",
diff --git a/scripts/postinstall.ts b/scripts/postinstall.ts
index 4fa71c35f..7205f6c46 100644
--- a/scripts/postinstall.ts
+++ b/scripts/postinstall.ts
@@ -1,6 +1,5 @@
1import { exec } from 'child_process'; 1import { exec } from 'child_process';
2 2
3// eslint-disable-next-line no-console
4const log = (err, stdout, stderr) => console.log(err || stdout || stderr); 3const log = (err, stdout, stderr) => console.log(err || stdout || stderr);
5 4
6if (!process.env.BUNDLING) { 5if (!process.env.BUNDLING) {
diff --git a/src/actions/user.ts b/src/actions/user.ts
index 20d27ee53..15a9216bd 100644
--- a/src/actions/user.ts
+++ b/src/actions/user.ts
@@ -25,8 +25,10 @@ export default {
25 userData: PropTypes.object.isRequired, 25 userData: PropTypes.object.isRequired,
26 }, 26 },
27 resetStatus: {}, 27 resetStatus: {},
28 importLegacyServices: PropTypes.arrayOf(PropTypes.shape({ 28 importLegacyServices: PropTypes.arrayOf(
29 recipe: PropTypes.string.isRequired, 29 PropTypes.shape({
30 })).isRequired, 30 recipe: PropTypes.string.isRequired,
31 }),
32 ).isRequired,
31 delete: {}, 33 delete: {},
32}; 34};
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 76edcf2e1..fc33a3c58 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -177,7 +177,7 @@ class Sidebar extends Component {
177 > 177 >
178 <i className="mdi mdi-check-all" /> 178 <i className="mdi mdi-check-all" />
179 </button> 179 </button>
180 ) : null} 180 ) : null}
181 {workspaceStore.isFeatureEnabled ? ( 181 {workspaceStore.isFeatureEnabled ? (
182 <button 182 <button
183 type="button" 183 type="button"
@@ -243,7 +243,7 @@ class Sidebar extends Component {
243 this.props.stores.app.updateStatusTypes.AVAILABLE || 243 this.props.stores.app.updateStatusTypes.AVAILABLE ||
244 this.props.stores.app.updateStatus === 244 this.props.stores.app.updateStatus ===
245 this.props.stores.app.updateStatusTypes.DOWNLOADED) && ( 245 this.props.stores.app.updateStatusTypes.DOWNLOADED) && (
246 <span className="update-available">•</span> 246 <span className="update-available">•</span>
247 )} 247 )}
248 </button> 248 </button>
249 {this.state.tooltipEnabled && ( 249 {this.state.tooltipEnabled && (
diff --git a/src/components/services/content/ErrorHandlers/styles.ts b/src/components/services/content/ErrorHandlers/styles.ts
index 72d62f5e3..9e2509ee5 100644
--- a/src/components/services/content/ErrorHandlers/styles.ts
+++ b/src/components/services/content/ErrorHandlers/styles.ts
@@ -1,4 +1,4 @@
1export default (theme) => ({ 1export default theme => ({
2 component: { 2 component: {
3 left: 0, 3 left: 0,
4 position: 'absolute', 4 position: 'absolute',
diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js
index 8e44efc5f..1bc1fbf5f 100644
--- a/src/components/services/content/ServiceView.js
+++ b/src/components/services/content/ServiceView.js
@@ -123,7 +123,7 @@ class ServiceView extends Component {
123 service.isFirstLoad && 123 service.isFirstLoad &&
124 !service.isServiceAccessRestricted && ( 124 !service.isServiceAccessRestricted && (
125 <WebviewLoader loaded={false} name={service.name} /> 125 <WebviewLoader loaded={false} name={service.name} />
126 )} 126 )}
127 {service.isError && ( 127 {service.isError && (
128 <WebviewErrorHandler 128 <WebviewErrorHandler
129 name={service.recipe.name} 129 name={service.recipe.name}
diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js
index b60ed3267..185d41175 100644
--- a/src/components/services/content/ServiceWebview.js
+++ b/src/components/services/content/ServiceWebview.js
@@ -24,12 +24,10 @@ class ServiceWebview extends Component {
24 super(props); 24 super(props);
25 25
26 reaction( 26 reaction(
27 () => ( 27 () => this.webview,
28 this.webview
29 ),
30 () => { 28 () => {
31 if (this.webview && this.webview.view) { 29 if (this.webview && this.webview.view) {
32 this.webview.view.addEventListener('console-message', (e) => { 30 this.webview.view.addEventListener('console-message', e => {
33 debug('Service logged a message:', e.message); 31 debug('Service logged a message:', e.message);
34 }); 32 });
35 } 33 }
@@ -55,20 +53,26 @@ class ServiceWebview extends Component {
55 }; 53 };
56 54
57 render() { 55 render() {
58 const { 56 const { service, setWebviewReference, isSpellcheckerEnabled } = this.props;
59 service,
60 setWebviewReference,
61 isSpellcheckerEnabled,
62 } = this.props;
63 57
64 const preloadScript = join(__dirname, '..', '..', '..', 'webview', 'recipe.js'); 58 const preloadScript = join(
59 __dirname,
60 '..',
61 '..',
62 '..',
63 'webview',
64 'recipe.js',
65 );
65 66
66 return ( 67 return (
67 <ElectronWebView 68 <ElectronWebView
68 ref={(webview) => { 69 ref={webview => {
69 this.webview = webview; 70 this.webview = webview;
70 if (webview && webview.view) { 71 if (webview && webview.view) {
71 webview.view.addEventListener('did-stop-loading', this.refocusWebview); 72 webview.view.addEventListener(
73 'did-stop-loading',
74 this.refocusWebview,
75 );
72 } 76 }
73 }} 77 }}
74 autosize 78 autosize
@@ -83,10 +87,14 @@ class ServiceWebview extends Component {
83 }} 87 }}
84 onUpdateTargetUrl={this.updateTargetUrl} 88 onUpdateTargetUrl={this.updateTargetUrl}
85 useragent={service.userAgent} 89 useragent={service.userAgent}
86 disablewebsecurity={service.recipe.disablewebsecurity ? true : undefined} 90 disablewebsecurity={
91 service.recipe.disablewebsecurity ? true : undefined
92 }
87 allowpopups 93 allowpopups
88 nodeintegration 94 nodeintegration
89 webpreferences={`spellcheck=${isSpellcheckerEnabled ? 1 : 0}, contextIsolation=1, enableRemoteModule=1`} 95 webpreferences={`spellcheck=${
96 isSpellcheckerEnabled ? 1 : 0
97 }, contextIsolation=1, enableRemoteModule=1`}
90 /> 98 />
91 ); 99 );
92 } 100 }
diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js
index 146cd93eb..69a12e982 100644
--- a/src/components/services/tabs/TabBarSortableList.js
+++ b/src/components/services/tabs/TabBarSortableList.js
@@ -22,7 +22,7 @@ class TabBarSortableList extends Component {
22 wakeUpService: PropTypes.func.isRequired, 22 wakeUpService: PropTypes.func.isRequired,
23 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 23 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
24 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 24 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
25 } 25 };
26 26
27 render() { 27 render() {
28 const { 28 const {
@@ -43,9 +43,7 @@ class TabBarSortableList extends Component {
43 } = this.props; 43 } = this.props;
44 44
45 return ( 45 return (
46 <ul 46 <ul className="tabs">
47 className="tabs"
48 >
49 {services.map((service, index) => ( 47 {services.map((service, index) => (
50 <TabItem 48 <TabItem
51 key={service.id} 49 key={service.id}
@@ -54,7 +52,9 @@ class TabBarSortableList extends Component {
54 index={index} 52 index={index}
55 shortcutIndex={index + 1} 53 shortcutIndex={index + 1}
56 reload={() => reload({ serviceId: service.id })} 54 reload={() => reload({ serviceId: service.id })}
57 toggleNotifications={() => toggleNotifications({ serviceId: service.id })} 55 toggleNotifications={() =>
56 toggleNotifications({ serviceId: service.id })
57 }
58 toggleAudio={() => toggleAudio({ serviceId: service.id })} 58 toggleAudio={() => toggleAudio({ serviceId: service.id })}
59 toggleDarkMode={() => toggleDarkMode({ serviceId: service.id })} 59 toggleDarkMode={() => toggleDarkMode({ serviceId: service.id })}
60 deleteService={() => deleteService({ serviceId: service.id })} 60 deleteService={() => deleteService({ serviceId: service.id })}
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 40242858a..948e9ccd5 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -12,13 +12,17 @@ import ToggleRaw from '../../ui/ToggleRaw';
12import Select from '../../ui/Select'; 12import Select from '../../ui/Select';
13import Input from '../../ui/Input'; 13import Input from '../../ui/Input';
14 14
15import { DEFAULT_APP_SETTINGS, FRANZ_TRANSLATION, GITHUB_FRANZ_URL } from '../../../config';
16import { 15import {
17 isMac, 16 DEFAULT_APP_SETTINGS,
18 isWindows, 17 FRANZ_TRANSLATION,
19 lockFerdiShortcutKey, 18 GITHUB_FRANZ_URL,
20} from '../../../environment'; 19} from '../../../config';
21import { ferdiVersion, userDataPath, userDataRecipesPath } from '../../../environment-remote'; 20import { isMac, isWindows, lockFerdiShortcutKey } from '../../../environment';
21import {
22 ferdiVersion,
23 userDataPath,
24 userDataRecipesPath,
25} from '../../../environment-remote';
22import { openPath } from '../../../helpers/url-helpers'; 26import { openPath } from '../../../helpers/url-helpers';
23import globalMessages from '../../../i18n/globalMessages'; 27import globalMessages from '../../../i18n/globalMessages';
24 28
diff --git a/src/components/ui/Modal/styles.ts b/src/components/ui/Modal/styles.ts
index f32c075ce..c2bebf9bb 100644
--- a/src/components/ui/Modal/styles.ts
+++ b/src/components/ui/Modal/styles.ts
@@ -1,4 +1,4 @@
1export default (theme) => ({ 1export default theme => ({
2 component: { 2 component: {
3 zIndex: 500, 3 zIndex: 500,
4 position: 'absolute', 4 position: 'absolute',
diff --git a/src/components/ui/ServiceIcon.js b/src/components/ui/ServiceIcon.js
index 2e9312d27..f067f8955 100644
--- a/src/components/ui/ServiceIcon.js
+++ b/src/components/ui/ServiceIcon.js
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6 6
7import ServiceModel from '../../models/Service'; 7import ServiceModel from '../../models/Service';
8 8
9const styles = (theme) => ({ 9const styles = theme => ({
10 root: { 10 root: {
11 height: 'auto', 11 height: 'auto',
12 }, 12 },
@@ -24,7 +24,8 @@ const styles = (theme) => ({
24 }, 24 },
25}); 25});
26 26
27@injectSheet(styles) @observer 27@injectSheet(styles)
28@observer
28class ServiceIcon extends Component { 29class ServiceIcon extends Component {
29 static propTypes = { 30 static propTypes = {
30 classes: PropTypes.object.isRequired, 31 classes: PropTypes.object.isRequired,
@@ -37,19 +38,10 @@ class ServiceIcon extends Component {
37 }; 38 };
38 39
39 render() { 40 render() {
40 const { 41 const { classes, className, service } = this.props;
41 classes,
42 className,
43 service,
44 } = this.props;
45 42
46 return ( 43 return (
47 <div 44 <div className={classnames([classes.root, className])}>
48 className={classnames([
49 classes.root,
50 className,
51 ])}
52 >
53 <img 45 <img
54 src={service.icon} 46 src={service.icon}
55 className={classnames([ 47 className={classnames([
diff --git a/src/components/ui/WebviewLoader/styles.ts b/src/components/ui/WebviewLoader/styles.ts
index 5d58011fe..dbd75db8a 100644
--- a/src/components/ui/WebviewLoader/styles.ts
+++ b/src/components/ui/WebviewLoader/styles.ts
@@ -1,4 +1,4 @@
1export default (theme) => ({ 1export default theme => ({
2 component: { 2 component: {
3 background: theme.colorWebviewLoaderBackground, 3 background: theme.colorWebviewLoaderBackground,
4 padding: 20, 4 padding: 20,
diff --git a/src/components/util/ErrorBoundary/styles.js b/src/components/util/ErrorBoundary/styles.js
index 51b36fdf3..0960546ff 100644
--- a/src/components/util/ErrorBoundary/styles.js
+++ b/src/components/util/ErrorBoundary/styles.js
@@ -1,4 +1,4 @@
1export default (theme) => ({ 1export default theme => ({
2 component: { 2 component: {
3 display: 'flex', 3 display: 'flex',
4 width: '100%', 4 width: '100%',
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 889f3f87f..aea077a1e 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -297,7 +297,9 @@ class EditSettingsScreen extends Component {
297 scheduledDNDStart: settingsData.scheduledDNDStart, 297 scheduledDNDStart: settingsData.scheduledDNDStart,
298 scheduledDNDEnd: settingsData.scheduledDNDEnd, 298 scheduledDNDEnd: settingsData.scheduledDNDEnd,
299 enableGPUAcceleration: Boolean(settingsData.enableGPUAcceleration), 299 enableGPUAcceleration: Boolean(settingsData.enableGPUAcceleration),
300 enableGlobalHideShortcut: Boolean(settingsData.enableGlobalHideShortcut), 300 enableGlobalHideShortcut: Boolean(
301 settingsData.enableGlobalHideShortcut,
302 ),
301 showDisabledServices: Boolean(settingsData.showDisabledServices), 303 showDisabledServices: Boolean(settingsData.showDisabledServices),
302 darkMode: Boolean(settingsData.darkMode), 304 darkMode: Boolean(settingsData.darkMode),
303 adaptableDarkMode: Boolean(settingsData.adaptableDarkMode), 305 adaptableDarkMode: Boolean(settingsData.adaptableDarkMode),
@@ -305,7 +307,9 @@ class EditSettingsScreen extends Component {
305 splitMode: Boolean(settingsData.splitMode), 307 splitMode: Boolean(settingsData.splitMode),
306 serviceRibbonWidth: Number(settingsData.serviceRibbonWidth), 308 serviceRibbonWidth: Number(settingsData.serviceRibbonWidth),
307 iconSize: Number(settingsData.iconSize), 309 iconSize: Number(settingsData.iconSize),
308 enableLongPressServiceHint: Boolean(settingsData.enableLongPressServiceHint), 310 enableLongPressServiceHint: Boolean(
311 settingsData.enableLongPressServiceHint,
312 ),
309 useVerticalStyle: Boolean(settingsData.useVerticalStyle), 313 useVerticalStyle: Boolean(settingsData.useVerticalStyle),
310 alwaysShowWorkspaces: Boolean(settingsData.alwaysShowWorkspaces), 314 alwaysShowWorkspaces: Boolean(settingsData.alwaysShowWorkspaces),
311 accentColor: settingsData.accentColor, 315 accentColor: settingsData.accentColor,
diff --git a/src/containers/settings/RecipesScreen.js b/src/containers/settings/RecipesScreen.js
index 832c2db10..7f55e54c5 100644
--- a/src/containers/settings/RecipesScreen.js
+++ b/src/containers/settings/RecipesScreen.js
@@ -130,21 +130,21 @@ class RecipesScreen extends Component {
130 130
131 const allRecipes = this.state.needle 131 const allRecipes = this.state.needle
132 ? this.prepareRecipes([ 132 ? this.prepareRecipes([
133 // All search recipes from server 133 // All search recipes from server
134 ...recipePreviews.searchResults, 134 ...recipePreviews.searchResults,
135 // All search recipes from local recipes 135 // All search recipes from local recipes
136 ...this.createPreviews( 136 ...this.createPreviews(
137 this.customRecipes.filter( 137 this.customRecipes.filter(
138 service => 138 service =>
139 service.name 139 service.name
140 .toLowerCase() 140 .toLowerCase()
141 .includes(this.state.needle.toLowerCase()) || 141 .includes(this.state.needle.toLowerCase()) ||
142 (service.aliases || []).some(alias => 142 (service.aliases || []).some(alias =>
143 alias.toLowerCase().includes(this.state.needle.toLowerCase()), 143 alias.toLowerCase().includes(this.state.needle.toLowerCase()),
144 ), 144 ),
145 ),
145 ), 146 ),
146 ), 147 ]).sort(this._sortByName)
147 ]).sort(this._sortByName)
148 : recipeFilter; 148 : recipeFilter;
149 149
150 const customWebsiteRecipe = recipePreviews.all.find( 150 const customWebsiteRecipe = recipePreviews.all.find(
diff --git a/src/electron/exception.ts b/src/electron/exception.ts
index 0065e2604..ada98d17b 100644
--- a/src/electron/exception.ts
+++ b/src/electron/exception.ts
@@ -1,4 +1,4 @@
1process.on('uncaughtException', (err) => { 1process.on('uncaughtException', err => {
2 // handle the error safely 2 // handle the error safely
3 console.error(err); 3 console.error(err);
4}); 4});
diff --git a/src/electron/ipc-api/sessionStorage.ts b/src/electron/ipc-api/sessionStorage.ts
index 3eda568a1..1ff0a51ea 100644
--- a/src/electron/ipc-api/sessionStorage.ts
+++ b/src/electron/ipc-api/sessionStorage.ts
@@ -6,7 +6,11 @@ const debug = require('debug')('Ferdi:ipcApi:sessionStorage');
6 6
7function deduceSession(serviceId: string | undefined | null): Session { 7function deduceSession(serviceId: string | undefined | null): Session {
8 if (serviceId) { 8 if (serviceId) {
9 return session.fromPartition(serviceId === TODOS_PARTITION_ID ? TODOS_PARTITION_ID : `persist:service-${serviceId}`); 9 return session.fromPartition(
10 serviceId === TODOS_PARTITION_ID
11 ? TODOS_PARTITION_ID
12 : `persist:service-${serviceId}`,
13 );
10 } 14 }
11 return session.defaultSession; 15 return session.defaultSession;
12} 16}
diff --git a/src/enforce-macos-app-location.ts b/src/enforce-macos-app-location.ts
index 0f858013d..0e6bf9ecc 100644
--- a/src/enforce-macos-app-location.ts
+++ b/src/enforce-macos-app-location.ts
@@ -12,11 +12,9 @@ export function enforceMacOSAppLocation() {
12 const clickedButtonIndex = api.dialog.showMessageBoxSync({ 12 const clickedButtonIndex = api.dialog.showMessageBoxSync({
13 type: 'error', 13 type: 'error',
14 message: 'Move to Applications folder?', 14 message: 'Move to Applications folder?',
15 detail: 'Ferdi must live in the Applications folder to be able to run correctly.', 15 detail:
16 buttons: [ 16 'Ferdi must live in the Applications folder to be able to run correctly.',
17 'Move to Applications folder', 17 buttons: ['Move to Applications folder', 'Quit Ferdi'],
18 'Quit Ferdi',
19 ],
20 defaultId: 0, 18 defaultId: 0,
21 cancelId: 1, 19 cancelId: 1,
22 }); 20 });
@@ -28,13 +26,13 @@ export function enforceMacOSAppLocation() {
28 26
29 api.app.moveToApplicationsFolder({ 27 api.app.moveToApplicationsFolder({
30 conflictHandler: conflict => { 28 conflictHandler: conflict => {
31 if (conflict === 'existsAndRunning') { // Can't replace the active version of the app 29 if (conflict === 'existsAndRunning') {
30 // Can't replace the active version of the app
32 api.dialog.showMessageBoxSync({ 31 api.dialog.showMessageBoxSync({
33 type: 'error', 32 type: 'error',
34 message: 'Another version of Ferdi is currently running. Quit it, then launch this version of the app again.', 33 message:
35 buttons: [ 34 'Another version of Ferdi is currently running. Quit it, then launch this version of the app again.',
36 'OK', 35 buttons: ['OK'],
37 ],
38 }); 36 });
39 37
40 api.app.quit(); 38 api.app.quit();
diff --git a/src/environment-remote.ts b/src/environment-remote.ts
index 192510f37..c87e89772 100644
--- a/src/environment-remote.ts
+++ b/src/environment-remote.ts
@@ -14,7 +14,13 @@ import {
14 LOCAL_TODOS_FRONTEND_URL, 14 LOCAL_TODOS_FRONTEND_URL,
15 PRODUCTION_TODOS_FRONTEND_URL, 15 PRODUCTION_TODOS_FRONTEND_URL,
16} from './config'; 16} from './config';
17import { chromeVersion, electronVersion, isWindows, nodeVersion, osArch } from './environment'; 17import {
18 chromeVersion,
19 electronVersion,
20 isWindows,
21 nodeVersion,
22 osArch,
23} from './environment';
18 24
19// @ts-expect-error Cannot find module './buildInfo.json' or its corresponding type declarations. 25// @ts-expect-error Cannot find module './buildInfo.json' or its corresponding type declarations.
20import * as buildInfo from './buildInfo.json'; 26import * as buildInfo from './buildInfo.json';
@@ -28,14 +34,20 @@ if (process.env.FERDI_APPDATA_DIR != null) {
28 app.setPath('appData', process.env.FERDI_APPDATA_DIR); 34 app.setPath('appData', process.env.FERDI_APPDATA_DIR);
29 app.setPath('userData', app.getPath('appData')); 35 app.setPath('userData', app.getPath('appData'));
30} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) { 36} else if (process.env.PORTABLE_EXECUTABLE_DIR != null) {
31 app.setPath('appData', join(process.env.PORTABLE_EXECUTABLE_DIR, `${app.name}AppData`)); 37 app.setPath(
38 'appData',
39 join(process.env.PORTABLE_EXECUTABLE_DIR, `${app.name}AppData`),
40 );
32 app.setPath('userData', join(app.getPath('appData'), `${app.name}AppData`)); 41 app.setPath('userData', join(app.getPath('appData'), `${app.name}AppData`));
33} else if (isWindows && process.env.APPDATA != null) { 42} else if (isWindows && process.env.APPDATA != null) {
34 app.setPath('appData', process.env.APPDATA); 43 app.setPath('appData', process.env.APPDATA);
35 app.setPath('userData', join(app.getPath('appData'), app.name)); 44 app.setPath('userData', join(app.getPath('appData'), app.name));
36} 45}
37 46
38export const isDevMode = process.env.ELECTRON_IS_DEV !== undefined ? Number.parseInt(process.env.ELECTRON_IS_DEV, 10) === 1 : !app.isPackaged; 47export const isDevMode =
48 process.env.ELECTRON_IS_DEV !== undefined
49 ? Number.parseInt(process.env.ELECTRON_IS_DEV, 10) === 1
50 : !app.isPackaged;
39if (isDevMode) { 51if (isDevMode) {
40 app.setPath('userData', join(app.getPath('appData'), `${app.name}Dev`)); 52 app.setPath('userData', join(app.getPath('appData'), `${app.name}Dev`));
41} 53}
diff --git a/src/features/settingsWS/actions.ts b/src/features/settingsWS/actions.ts
index 631670c8a..03a398eb5 100755
--- a/src/features/settingsWS/actions.ts
+++ b/src/features/settingsWS/actions.ts
@@ -1,10 +1,13 @@
1import PropTypes from 'prop-types'; 1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions'; 2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3 3
4export const settingsWSActions = createActionsFromDefinitions({ 4export const settingsWSActions = createActionsFromDefinitions(
5 greet: { 5 {
6 name: PropTypes.string.isRequired, 6 greet: {
7 name: PropTypes.string.isRequired,
8 },
7 }, 9 },
8}, PropTypes.checkPropTypes); 10 PropTypes.checkPropTypes,
11);
9 12
10export default settingsWSActions; 13export default settingsWSActions;
diff --git a/src/features/todos/components/TodosWebview.js b/src/features/todos/components/TodosWebview.js
index b31c7d858..1d423544b 100644
--- a/src/features/todos/components/TodosWebview.js
+++ b/src/features/todos/components/TodosWebview.js
@@ -7,14 +7,15 @@ 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',
14 borderLeft: [1, 'solid', theme.todos.todosLayer.borderLeftColor], 14 borderLeft: [1, 'solid', theme.todos.todosLayer.borderLeftColor],
15 zIndex: 300, 15 zIndex: 300,
16 16
17 transform: ({ isVisible, width, isTodosServiceActive }) => `translateX(${isVisible || isTodosServiceActive ? 0 : width}px)`, 17 transform: ({ isVisible, width, isTodosServiceActive }) =>
18 `translateX(${isVisible || isTodosServiceActive ? 0 : width}px)`,
18 19
19 '& webview': { 20 '& webview': {
20 height: '100%', 21 height: '100%',
@@ -79,7 +80,7 @@ class TodosWebview extends Component {
79 this.node.addEventListener('mouseleave', this.stopResize.bind(this)); 80 this.node.addEventListener('mouseleave', this.stopResize.bind(this));
80 } 81 }
81 82
82 startResize = (event) => { 83 startResize = event => {
83 this.setState({ 84 this.setState({
84 isDragging: true, 85 isDragging: true,
85 initialPos: event.clientX, 86 initialPos: event.clientX,
@@ -126,7 +127,7 @@ class TodosWebview extends Component {
126 startListeningToIpcMessages() { 127 startListeningToIpcMessages() {
127 const { handleClientMessage } = this.props; 128 const { handleClientMessage } = this.props;
128 if (!this.webview) return; 129 if (!this.webview) return;
129 this.webview.addEventListener('ipc-message', (e) => { 130 this.webview.addEventListener('ipc-message', e => {
130 // console.log(e); 131 // console.log(e);
131 handleClientMessage({ channel: e.channel, message: e.args[0] }); 132 handleClientMessage({ channel: e.channel, message: e.args[0] });
132 }); 133 });
@@ -159,7 +160,7 @@ class TodosWebview extends Component {
159 })} 160 })}
160 style={{ width: displayedWidth }} 161 style={{ width: displayedWidth }}
161 onMouseUp={() => this.stopResize()} 162 onMouseUp={() => this.stopResize()}
162 ref={(node) => { 163 ref={node => {
163 this.node = node; 164 this.node = node;
164 }} 165 }}
165 id="todos-panel" 166 id="todos-panel"
@@ -170,7 +171,7 @@ class TodosWebview extends Component {
170 left: delta, 171 left: delta,
171 ...(isDragging ? { width: 600, marginLeft: -200 } : {}), 172 ...(isDragging ? { width: 600, marginLeft: -200 } : {}),
172 }} // This hack is required as resizing with webviews beneath behaves quite bad 173 }} // This hack is required as resizing with webviews beneath behaves quite bad
173 onMouseDown={(e) => this.startResize(e)} 174 onMouseDown={e => this.startResize(e)}
174 /> 175 />
175 {isDragging && ( 176 {isDragging && (
176 <div 177 <div
@@ -188,7 +189,7 @@ class TodosWebview extends Component {
188 }} 189 }}
189 partition={TODOS_PARTITION_ID} 190 partition={TODOS_PARTITION_ID}
190 preload="./features/todos/preload.js" 191 preload="./features/todos/preload.js"
191 ref={(webview) => { 192 ref={webview => {
192 this.webview = webview ? webview.view : null; 193 this.webview = webview ? webview.view : null;
193 }} 194 }}
194 useragent={userAgent} 195 useragent={userAgent}
diff --git a/src/features/todos/containers/TodosScreen.js b/src/features/todos/containers/TodosScreen.js
index c2b6a5af4..536810d2d 100644
--- a/src/features/todos/containers/TodosScreen.js
+++ b/src/features/todos/containers/TodosScreen.js
@@ -10,24 +10,31 @@ import { TODOS_MIN_WIDTH } from '../../../config';
10import { todoActions } from '../actions'; 10import { todoActions } from '../actions';
11import ServicesStore from '../../../stores/ServicesStore'; 11import ServicesStore from '../../../stores/ServicesStore';
12 12
13@inject('stores', 'actions') @observer 13@inject('stores', 'actions')
14@observer
14class TodosScreen extends Component { 15class TodosScreen extends Component {
15 render() { 16 render() {
16 if (!todosStore || !todosStore.isFeatureActive || todosStore.isTodosPanelForceHidden) { 17 if (
18 !todosStore ||
19 !todosStore.isFeatureActive ||
20 todosStore.isTodosPanelForceHidden
21 ) {
17 return null; 22 return null;
18 } 23 }
19 24
20 return ( 25 return (
21 <ErrorBoundary> 26 <ErrorBoundary>
22 <TodosWebview 27 <TodosWebview
23 isTodosServiceActive={this.props.stores.services.isTodosServiceActive || false} 28 isTodosServiceActive={
29 this.props.stores.services.isTodosServiceActive || false
30 }
24 isVisible={todosStore.isTodosPanelVisible} 31 isVisible={todosStore.isTodosPanelVisible}
25 togglePanel={todoActions.toggleTodosPanel} 32 togglePanel={todoActions.toggleTodosPanel}
26 handleClientMessage={todoActions.handleClientMessage} 33 handleClientMessage={todoActions.handleClientMessage}
27 setTodosWebview={(webview) => todoActions.setTodosWebview({ webview })} 34 setTodosWebview={webview => todoActions.setTodosWebview({ webview })}
28 width={todosStore.width} 35 width={todosStore.width}
29 minWidth={TODOS_MIN_WIDTH} 36 minWidth={TODOS_MIN_WIDTH}
30 resize={(width) => todoActions.resize({ width })} 37 resize={width => todoActions.resize({ width })}
31 userAgent={todosStore.userAgent} 38 userAgent={todosStore.userAgent}
32 todoUrl={todosStore.todoUrl} 39 todoUrl={todosStore.todoUrl}
33 isTodoUrlValid={todosStore.isTodoUrlValid} 40 isTodoUrlValid={todosStore.isTodoUrlValid}
diff --git a/src/features/utils/ActionBinding.ts b/src/features/utils/ActionBinding.ts
index 787166d44..16308fae4 100644
--- a/src/features/utils/ActionBinding.ts
+++ b/src/features/utils/ActionBinding.ts
@@ -24,6 +24,5 @@ export default class ActionBinding {
24 } 24 }
25} 25}
26 26
27export const createActionBindings = (actions) => ( 27export const createActionBindings = actions =>
28 actions.map((a) => new ActionBinding(a)) 28 actions.map(a => new ActionBinding(a));
29);
diff --git a/src/features/utils/FeatureStore.test.js b/src/features/utils/FeatureStore.test.js
index 92308bf52..1995431bd 100644
--- a/src/features/utils/FeatureStore.test.js
+++ b/src/features/utils/FeatureStore.test.js
@@ -5,9 +5,12 @@ import { createActionsFromDefinitions } from '../../actions/lib/actions';
5import { createActionBindings } from './ActionBinding'; 5import { createActionBindings } from './ActionBinding';
6import { createReactions } from '../../stores/lib/Reaction'; 6import { createReactions } from '../../stores/lib/Reaction';
7 7
8const actions = createActionsFromDefinitions({ 8const actions = createActionsFromDefinitions(
9 countUp: {}, 9 {
10}, PropTypes.checkPropTypes); 10 countUp: {},
11 },
12 PropTypes.checkPropTypes,
13);
11 14
12class TestFeatureStore extends FeatureStore { 15class TestFeatureStore extends FeatureStore {
13 @observable count = 0; 16 @observable count = 0;
@@ -15,12 +18,10 @@ class TestFeatureStore extends FeatureStore {
15 reactionInvokedCount = 0; 18 reactionInvokedCount = 0;
16 19
17 start() { 20 start() {
18 this._registerActions(createActionBindings([ 21 this._registerActions(
19 [actions.countUp, this._countUp], 22 createActionBindings([[actions.countUp, this._countUp]]),
20 ])); 23 );
21 this._registerReactions(createReactions([ 24 this._registerReactions(createReactions([this._countReaction]));
22 this._countReaction,
23 ]));
24 } 25 }
25 26
26 _countUp = () => { 27 _countUp = () => {
@@ -29,7 +30,7 @@ class TestFeatureStore extends FeatureStore {
29 30
30 _countReaction = () => { 31 _countReaction = () => {
31 this.reactionInvokedCount += 1; 32 this.reactionInvokedCount += 1;
32 } 33 };
33} 34}
34 35
35describe('FeatureStore', () => { 36describe('FeatureStore', () => {
diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js
index 237f9488b..d3c9fa767 100644
--- a/src/features/workspaces/components/WorkspaceDrawerItem.js
+++ b/src/features/workspaces/components/WorkspaceDrawerItem.js
@@ -118,14 +118,12 @@ class WorkspaceDrawerItem extends Component {
118 isActive ? classes.isActiveItem : null, 118 isActive ? classes.isActiveItem : null,
119 ])} 119 ])}
120 onClick={onClick} 120 onClick={onClick}
121 onContextMenu={() => 121 onContextMenu={() => onContextMenuEditClick && contextMenu.popup()}
122 onContextMenuEditClick && contextMenu.popup()
123 }
124 data-tip={`${ 122 data-tip={`${
125 shortcutIndex <= 9 123 shortcutIndex <= 9
126 ? `(${cmdOrCtrlShortcutKey(false)}+${altKey( 124 ? `(${cmdOrCtrlShortcutKey(false)}+${altKey(
127 false, 125 false,
128 )}+${shortcutIndex})` 126 )}+${shortcutIndex})`
129 : '' 127 : ''
130 }`} 128 }`}
131 > 129 >
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
index 78b758e7d..8ab9174d3 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.js
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -40,7 +40,8 @@ const messages = defineMessages({
40 }, 40 },
41 workspaceFeatureInfo: { 41 workspaceFeatureInfo: {
42 id: 'settings.workspaces.workspaceFeatureInfo', 42 id: 'settings.workspaces.workspaceFeatureInfo',
43 defaultMessage: 'Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.', 43 defaultMessage:
44 'Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.',
44 }, 45 },
45 workspaceFeatureHeadline: { 46 workspaceFeatureHeadline: {
46 id: 'settings.workspaces.workspaceFeatureHeadline', 47 id: 'settings.workspaces.workspaceFeatureHeadline',
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
index db2b69f99..0fa43b723 100644
--- a/src/features/workspaces/store.js
+++ b/src/features/workspaces/store.js
@@ -124,7 +124,7 @@ export default class WorkspacesStore extends FeatureStore {
124 this.isFeatureActive = false; 124 this.isFeatureActive = false;
125 } 125 }
126 126
127 filterServicesByActiveWorkspace = (services) => { 127 filterServicesByActiveWorkspace = services => {
128 const { activeWorkspace, isFeatureActive } = this; 128 const { activeWorkspace, isFeatureActive } = this;
129 if (isFeatureActive && activeWorkspace) { 129 if (isFeatureActive && activeWorkspace) {
130 return this.getWorkspaceServices(activeWorkspace); 130 return this.getWorkspaceServices(activeWorkspace);
@@ -134,14 +134,14 @@ export default class WorkspacesStore extends FeatureStore {
134 134
135 getWorkspaceServices(workspace) { 135 getWorkspaceServices(workspace) {
136 const { services } = this.stores; 136 const { services } = this.stores;
137 return workspace.services.map((id) => services.one(id)).filter((s) => !!s); 137 return workspace.services.map(id => services.one(id)).filter(s => !!s);
138 } 138 }
139 139
140 // ========== PRIVATE METHODS ========= // 140 // ========== PRIVATE METHODS ========= //
141 141
142 _getWorkspaceById = (id) => this.workspaces.find((w) => w.id === id); 142 _getWorkspaceById = id => this.workspaces.find(w => w.id === id);
143 143
144 _updateSettings = (changes) => { 144 _updateSettings = changes => {
145 localStorage.setItem('workspaces', { 145 localStorage.setItem('workspaces', {
146 ...this.settings, 146 ...this.settings,
147 ...changes, 147 ...changes,
@@ -191,9 +191,15 @@ export default class WorkspacesStore extends FeatureStore {
191 this.isSwitchingWorkspace = false; 191 this.isSwitchingWorkspace = false;
192 this.nextWorkspace = null; 192 this.nextWorkspace = null;
193 if (this.stores.settings.app.splitMode) { 193 if (this.stores.settings.app.splitMode) {
194 const serviceNames = new Set(this.getWorkspaceServices(workspace).map(service => service.name)); 194 const serviceNames = new Set(
195 for (const wrapper of document.querySelectorAll('.services__webview-wrapper')) { 195 this.getWorkspaceServices(workspace).map(service => service.name),
196 wrapper.style.display = serviceNames.has(wrapper.dataset.name) ? '' : 'none'; 196 );
197 for (const wrapper of document.querySelectorAll(
198 '.services__webview-wrapper',
199 )) {
200 wrapper.style.display = serviceNames.has(wrapper.dataset.name)
201 ? ''
202 : 'none';
197 } 203 }
198 } 204 }
199 }, 1000); 205 }, 1000);
@@ -212,7 +218,9 @@ export default class WorkspacesStore extends FeatureStore {
212 setTimeout(() => { 218 setTimeout(() => {
213 this.isSwitchingWorkspace = false; 219 this.isSwitchingWorkspace = false;
214 if (this.stores.settings.app.splitMode) { 220 if (this.stores.settings.app.splitMode) {
215 for (const wrapper of document.querySelectorAll('.services__webview-wrapper')) { 221 for (const wrapper of document.querySelectorAll(
222 '.services__webview-wrapper',
223 )) {
216 wrapper.style.display = ''; 224 wrapper.style.display = '';
217 } 225 }
218 } 226 }
@@ -262,7 +270,8 @@ export default class WorkspacesStore extends FeatureStore {
262 const activeService = this.stores.services.active; 270 const activeService = this.stores.services.active;
263 const workspaceServices = this.getWorkspaceServices(this.activeWorkspace); 271 const workspaceServices = this.getWorkspaceServices(this.activeWorkspace);
264 if (workspaceServices.length <= 0) return; 272 if (workspaceServices.length <= 0) return;
265 const isActiveServiceInWorkspace = workspaceServices.includes(activeService); 273 const isActiveServiceInWorkspace =
274 workspaceServices.includes(activeService);
266 if (!isActiveServiceInWorkspace) { 275 if (!isActiveServiceInWorkspace) {
267 this.actions.service.setActive({ 276 this.actions.service.setActive({
268 serviceId: workspaceServices[0].id, 277 serviceId: workspaceServices[0].id,
@@ -288,8 +297,10 @@ export default class WorkspacesStore extends FeatureStore {
288 const isWorkspaceSettingsRoute = router.location.pathname.includes( 297 const isWorkspaceSettingsRoute = router.location.pathname.includes(
289 WORKSPACES_ROUTES.ROOT, 298 WORKSPACES_ROUTES.ROOT,
290 ); 299 );
291 const isSwitchingToSettingsRoute = !this.isSettingsRouteActive && isWorkspaceSettingsRoute; 300 const isSwitchingToSettingsRoute =
292 const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this.isSettingsRouteActive; 301 !this.isSettingsRouteActive && isWorkspaceSettingsRoute;
302 const isLeavingSettingsRoute =
303 !isWorkspaceSettingsRoute && this.isSettingsRouteActive;
293 304
294 if (isSwitchingToSettingsRoute) { 305 if (isSwitchingToSettingsRoute) {
295 this.isSettingsRouteActive = true; 306 this.isSettingsRouteActive = true;
@@ -300,8 +311,8 @@ export default class WorkspacesStore extends FeatureStore {
300 } else if (isLeavingSettingsRoute) { 311 } else if (isLeavingSettingsRoute) {
301 this.isSettingsRouteActive = false; 312 this.isSettingsRouteActive = false;
302 if ( 313 if (
303 !this._wasDrawerOpenBeforeSettingsRoute 314 !this._wasDrawerOpenBeforeSettingsRoute &&
304 && this.isWorkspaceDrawerOpen 315 this.isWorkspaceDrawerOpen
305 ) { 316 ) {
306 workspaceActions.toggleWorkspaceDrawer(); 317 workspaceActions.toggleWorkspaceDrawer();
307 } 318 }
@@ -311,14 +322,15 @@ export default class WorkspacesStore extends FeatureStore {
311 _cleanupInvalidServiceReferences = () => { 322 _cleanupInvalidServiceReferences = () => {
312 const { services } = this.stores; 323 const { services } = this.stores;
313 const { allServicesRequest } = services; 324 const { allServicesRequest } = services;
314 const servicesHaveBeenLoaded = allServicesRequest.wasExecuted && !allServicesRequest.isError; 325 const servicesHaveBeenLoaded =
326 allServicesRequest.wasExecuted && !allServicesRequest.isError;
315 // Loop through all workspaces and remove invalid service ids (locally) 327 // Loop through all workspaces and remove invalid service ids (locally)
316 for (const workspace of this.workspaces) { 328 for (const workspace of this.workspaces) {
317 for (const serviceId of workspace.services) { 329 for (const serviceId of workspace.services) {
318 if ( 330 if (
319 servicesHaveBeenLoaded 331 servicesHaveBeenLoaded &&
320 && !services.one(serviceId) 332 !services.one(serviceId) &&
321 && serviceId !== KEEP_WS_LOADED_USID 333 serviceId !== KEEP_WS_LOADED_USID
322 ) { 334 ) {
323 workspace.services.remove(serviceId); 335 workspace.services.remove(serviceId);
324 } 336 }
diff --git a/src/helpers/array-helpers.ts b/src/helpers/array-helpers.ts
index ae5d8d99f..3f8806176 100644
--- a/src/helpers/array-helpers.ts
+++ b/src/helpers/array-helpers.ts
@@ -1,4 +1,5 @@
1export const shuffleArray = (arr: any[]) => arr 1export const shuffleArray = (arr: any[]) =>
2 .map((a) => [Math.random(), a]) 2 arr
3 .sort((a, b) => a[0] - b[0]) 3 .map(a => [Math.random(), a])
4 .map((a) => a[1]); 4 .sort((a, b) => a[0] - b[0])
5 .map(a => a[1]);
diff --git a/src/helpers/async-helpers.ts b/src/helpers/async-helpers.ts
index aae3c3928..6b1f24b5a 100644
--- a/src/helpers/async-helpers.ts
+++ b/src/helpers/async-helpers.ts
@@ -1,5 +1,3 @@
1/* eslint-disable import/prefer-default-export */
2
3export function sleep(ms: number = 0) { 1export function sleep(ms: number = 0) {
4 return new Promise((r) => setTimeout(r, ms)); 2 return new Promise(r => setTimeout(r, ms));
5} 3}
diff --git a/src/helpers/routing-helpers.ts b/src/helpers/routing-helpers.ts
index 18169f01b..46895aa6b 100644
--- a/src/helpers/routing-helpers.ts
+++ b/src/helpers/routing-helpers.ts
@@ -1,3 +1,4 @@
1import RouteParser from 'route-parser'; 1import RouteParser from 'route-parser';
2 2
3export const matchRoute = (pattern: string, path: string) => new RouteParser(pattern).match(path); 3export const matchRoute = (pattern: string, path: string) =>
4 new RouteParser(pattern).match(path);
diff --git a/src/helpers/schedule-helpers.ts b/src/helpers/schedule-helpers.ts
index 55b7c1e6f..37caffd79 100644
--- a/src/helpers/schedule-helpers.ts
+++ b/src/helpers/schedule-helpers.ts
@@ -1,17 +1,9 @@
1/* eslint-disable import/prefer-default-export */
2
3export function isInTimeframe(start: string, end: string) { 1export function isInTimeframe(start: string, end: string) {
4 const [ 2 const [startHourStr, startMinuteStr] = start.split(':');
5 startHourStr,
6 startMinuteStr,
7 ] = start.split(':');
8 const startHour = Number.parseInt(startHourStr, 10); 3 const startHour = Number.parseInt(startHourStr, 10);
9 const startMinute = Number.parseInt(startMinuteStr, 10); 4 const startMinute = Number.parseInt(startMinuteStr, 10);
10 5
11 const [ 6 const [endHourStr, endMinuteStr] = end.split(':');
12 endHourStr,
13 endMinuteStr,
14 ] = end.split(':');
15 const endHour = Number.parseInt(endHourStr, 10); 7 const endHour = Number.parseInt(endHourStr, 10);
16 const endMinute = Number.parseInt(endMinuteStr, 10); 8 const endMinute = Number.parseInt(endMinuteStr, 10);
17 9
@@ -20,46 +12,31 @@ export function isInTimeframe(start: string, end: string) {
20 12
21 // Check if the end time is before the start time (scheduled overnight) 13 // Check if the end time is before the start time (scheduled overnight)
22 // as we need to change our checks based on this 14 // as we need to change our checks based on this
23 const endBeforeStart = (startHour > endHour || (startHour === endHour && startMinute > endMinute)); 15 const endBeforeStart =
16 startHour > endHour || (startHour === endHour && startMinute > endMinute);
24 17
25 if ( 18 if (
26 // End is after start (e.g. 09:00-17:00) 19 // End is after start (e.g. 09:00-17:00)
27 !endBeforeStart 20 !endBeforeStart &&
28 // Check if past start 21 // Check if past start
29 && ((currentHour > startHour 22 (currentHour > startHour ||
30 || ( 23 (currentHour === startHour && currentMinute >= startMinute)) &&
31 currentHour === startHour 24 // Check that not past end
32 && currentMinute >= startMinute 25 (currentHour < endHour ||
33 ) 26 (currentHour === endHour && currentMinute < endMinute))
34 )
35 // Check that not past end
36 && (currentHour < endHour
37 || (
38 currentHour === endHour
39 && currentMinute < endMinute
40 )
41 ))
42 ) { 27 ) {
43 // We are in scheduled timeframe 28 // We are in scheduled timeframe
44 return true; 29 return true;
45 } 30 }
46 if ( 31 if (
47 // End is before start (e.g. 17:00-09:00) 32 // End is before start (e.g. 17:00-09:00)
48 endBeforeStart 33 endBeforeStart &&
49 // Check if past start 34 // Check if past start
50 && ((currentHour > startHour 35 (currentHour > startHour ||
51 || ( 36 (currentHour === startHour && currentMinute >= startMinute) ||
52 currentHour === startHour
53 && currentMinute >= startMinute
54 )
55 )
56 // Check that we are not past end 37 // Check that we are not past end
57 || (currentHour < endHour 38 currentHour < endHour ||
58 || ( 39 (currentHour === endHour && currentMinute < endMinute))
59 currentHour === endHour
60 && currentMinute < endMinute
61 )
62 ))
63 ) { 40 ) {
64 // We are also in scheduled timeframe 41 // We are also in scheduled timeframe
65 return true; 42 return true;
diff --git a/src/helpers/url-helpers.ts b/src/helpers/url-helpers.ts
index 1e87ecabb..135f06cbf 100644
--- a/src/helpers/url-helpers.ts
+++ b/src/helpers/url-helpers.ts
@@ -29,7 +29,10 @@ export async function openPath(folderName: string) {
29} 29}
30 30
31// TODO: Need to verify and fix/remove the skipping logic. Ideally, we should never skip this check 31// TODO: Need to verify and fix/remove the skipping logic. Ideally, we should never skip this check
32export function openExternalUrl(url: string | URL, skipValidityCheck: boolean = false) { 32export function openExternalUrl(
33 url: string | URL,
34 skipValidityCheck: boolean = false,
35) {
33 debug('Open url:', url, 'with skipValidityCheck:', skipValidityCheck); 36 debug('Open url:', url, 'with skipValidityCheck:', skipValidityCheck);
34 if (skipValidityCheck || isValidExternalURL(url)) { 37 if (skipValidityCheck || isValidExternalURL(url)) {
35 shell.openExternal(url.toString()); 38 shell.openExternal(url.toString());
diff --git a/src/internal-server/app/Controllers/Http/RecipeController.js b/src/internal-server/app/Controllers/Http/RecipeController.js
index d44839db1..1b0ac7035 100644
--- a/src/internal-server/app/Controllers/Http/RecipeController.js
+++ b/src/internal-server/app/Controllers/Http/RecipeController.js
@@ -56,7 +56,6 @@ class RecipeController {
56 let remoteResults = []; 56 let remoteResults = [];
57 // eslint-disable-next-line eqeqeq 57 // eslint-disable-next-line eqeqeq
58 if (Env.get('CONNECT_WITH_FRANZ') == 'true') { 58 if (Env.get('CONNECT_WITH_FRANZ') == 'true') {
59 // eslint-disable-line eqeqeq
60 remoteResults = JSON.parse( 59 remoteResults = JSON.parse(
61 await ( 60 await (
62 await fetch( 61 await fetch(
@@ -112,7 +111,6 @@ class RecipeController {
112 } 111 }
113 // eslint-disable-next-line eqeqeq 112 // eslint-disable-next-line eqeqeq
114 if (Env.get('CONNECT_WITH_FRANZ') == 'true') { 113 if (Env.get('CONNECT_WITH_FRANZ') == 'true') {
115 // eslint-disable-line eqeqeq
116 return response.redirect(`${RECIPES_URL}/download/${service}`); 114 return response.redirect(`${RECIPES_URL}/download/${service}`);
117 } 115 }
118 return response.status(400).send({ 116 return response.status(400).send({
diff --git a/src/internal-server/app/Controllers/Http/ServiceController.js b/src/internal-server/app/Controllers/Http/ServiceController.js
index 133473b68..dedb5a12b 100644
--- a/src/internal-server/app/Controllers/Http/ServiceController.js
+++ b/src/internal-server/app/Controllers/Http/ServiceController.js
@@ -36,7 +36,7 @@ class ServiceController {
36 } while ( 36 } while (
37 (await Service.query().where('serviceId', serviceId).fetch()).rows 37 (await Service.query().where('serviceId', serviceId).fetch()).rows
38 .length > 0 38 .length > 0
39 ); // eslint-disable-line no-await-in-loop 39 );
40 40
41 await Service.create({ 41 await Service.create({
42 serviceId, 42 serviceId,
diff --git a/src/internal-server/app/Controllers/Http/UserController.js b/src/internal-server/app/Controllers/Http/UserController.js
index 25b5277bd..2ecc8241c 100644
--- a/src/internal-server/app/Controllers/Http/UserController.js
+++ b/src/internal-server/app/Controllers/Http/UserController.js
@@ -171,7 +171,6 @@ class UserController {
171 return response.status(401).send(errorMessage); 171 return response.status(401).send(errorMessage);
172 } 172 }
173 173
174 // eslint-disable-next-line prefer-destructuring
175 token = content.token; 174 token = content.token;
176 } catch (error) { 175 } catch (error) {
177 return response.status(401).send({ 176 return response.status(401).send({
@@ -300,7 +299,7 @@ class UserController {
300 } while ( 299 } while (
301 (await Workspace.query().where('workspaceId', newWorkspaceId).fetch()) 300 (await Workspace.query().where('workspaceId', newWorkspaceId).fetch())
302 .rows.length > 0 301 .rows.length > 0
303 ); // eslint-disable-line no-await-in-loop 302 );
304 303
305 if ( 304 if (
306 workspace.services && 305 workspace.services &&
@@ -340,7 +339,7 @@ class UserController {
340 } while ( 339 } while (
341 (await Service.query().where('serviceId', newServiceId).fetch()).rows 340 (await Service.query().where('serviceId', newServiceId).fetch()).rows
342 .length > 0 341 .length > 0
343 ); // eslint-disable-line no-await-in-loop 342 );
344 343
345 // store the old serviceId as the key for future lookup 344 // store the old serviceId as the key for future lookup
346 serviceIdTranslation[service.serviceId] = newServiceId; 345 serviceIdTranslation[service.serviceId] = newServiceId;
diff --git a/src/internal-server/app/Controllers/Http/WorkspaceController.js b/src/internal-server/app/Controllers/Http/WorkspaceController.js
index 9d461135e..528721f13 100644
--- a/src/internal-server/app/Controllers/Http/WorkspaceController.js
+++ b/src/internal-server/app/Controllers/Http/WorkspaceController.js
@@ -27,7 +27,7 @@ class WorkspaceController {
27 } while ( 27 } while (
28 (await Workspace.query().where('workspaceId', workspaceId).fetch()).rows 28 (await Workspace.query().where('workspaceId', workspaceId).fetch()).rows
29 .length > 0 29 .length > 0
30 ); // eslint-disable-line no-await-in-loop 30 );
31 31
32 const order = (await Workspace.all()).rows.length; 32 const order = (await Workspace.all()).rows.length;
33 const { name } = data; 33 const { name } = data;
diff --git a/src/internal-server/config/app.js b/src/internal-server/config/app.js
index 0a1644932..379190734 100644
--- a/src/internal-server/config/app.js
+++ b/src/internal-server/config/app.js
@@ -2,7 +2,6 @@
2const Env = use('Env'); 2const Env = use('Env');
3 3
4module.exports = { 4module.exports = {
5
6 /* 5 /*
7 |-------------------------------------------------------------------------- 6 |--------------------------------------------------------------------------
8 | Application Name 7 | Application Name
diff --git a/src/internal-server/config/bodyParser.js b/src/internal-server/config/bodyParser.js
index 8a5406f9e..ef2eedf40 100644
--- a/src/internal-server/config/bodyParser.js
+++ b/src/internal-server/config/bodyParser.js
@@ -58,9 +58,7 @@ module.exports = {
58 | 58 |
59 */ 59 */
60 raw: { 60 raw: {
61 types: [ 61 types: ['text/*'],
62 'text/*',
63 ],
64 }, 62 },
65 63
66 /* 64 /*
@@ -72,9 +70,7 @@ module.exports = {
72 | 70 |
73 */ 71 */
74 form: { 72 form: {
75 types: [ 73 types: ['application/x-www-form-urlencoded'],
76 'application/x-www-form-urlencoded',
77 ],
78 }, 74 },
79 75
80 /* 76 /*
@@ -86,9 +82,7 @@ module.exports = {
86 | 82 |
87 */ 83 */
88 files: { 84 files: {
89 types: [ 85 types: ['multipart/form-data'],
90 'multipart/form-data',
91 ],
92 86
93 /* 87 /*
94 |-------------------------------------------------------------------------- 88 |--------------------------------------------------------------------------
diff --git a/src/internal-server/database/migrations/1503250034279_user.js b/src/internal-server/database/migrations/1503250034279_user.js
index 80b49020a..d502e4fa0 100644
--- a/src/internal-server/database/migrations/1503250034279_user.js
+++ b/src/internal-server/database/migrations/1503250034279_user.js
@@ -3,7 +3,7 @@ const Schema = use('Schema');
3 3
4class UserSchema extends Schema { 4class UserSchema extends Schema {
5 up() { 5 up() {
6 this.create('users', (table) => { 6 this.create('users', table => {
7 table.increments(); 7 table.increments();
8 table.json('settings'); 8 table.json('settings');
9 table.timestamps(); 9 table.timestamps();
diff --git a/src/internal-server/database/migrations/1566385379883_service_schema.js b/src/internal-server/database/migrations/1566385379883_service_schema.js
index d887ef193..d8087248f 100644
--- a/src/internal-server/database/migrations/1566385379883_service_schema.js
+++ b/src/internal-server/database/migrations/1566385379883_service_schema.js
@@ -3,7 +3,7 @@ const Schema = use('Schema');
3 3
4class ServiceSchema extends Schema { 4class ServiceSchema extends Schema {
5 up() { 5 up() {
6 this.create('services', (table) => { 6 this.create('services', table => {
7 table.increments(); 7 table.increments();
8 table.string('serviceId', 80).notNullable(); 8 table.string('serviceId', 80).notNullable();
9 table.string('name', 80).notNullable(); 9 table.string('name', 80).notNullable();
diff --git a/src/internal-server/database/migrations/1566554231482_recipe_schema.js b/src/internal-server/database/migrations/1566554231482_recipe_schema.js
index 514d57600..41bebdacb 100644
--- a/src/internal-server/database/migrations/1566554231482_recipe_schema.js
+++ b/src/internal-server/database/migrations/1566554231482_recipe_schema.js
@@ -3,7 +3,7 @@ const Schema = use('Schema');
3 3
4class RecipeSchema extends Schema { 4class RecipeSchema extends Schema {
5 up() { 5 up() {
6 this.create('recipes', (table) => { 6 this.create('recipes', table => {
7 table.increments(); 7 table.increments();
8 table.string('name', 80).notNullable(); 8 table.string('name', 80).notNullable();
9 table.string('recipeId', 254).notNullable().unique(); 9 table.string('recipeId', 254).notNullable().unique();
diff --git a/src/internal-server/database/migrations/1566554359294_workspace_schema.js b/src/internal-server/database/migrations/1566554359294_workspace_schema.js
index 421a406b5..3e5385f45 100644
--- a/src/internal-server/database/migrations/1566554359294_workspace_schema.js
+++ b/src/internal-server/database/migrations/1566554359294_workspace_schema.js
@@ -3,7 +3,7 @@ const Schema = use('Schema');
3 3
4class WorkspaceSchema extends Schema { 4class WorkspaceSchema extends Schema {
5 up() { 5 up() {
6 this.create('workspaces', (table) => { 6 this.create('workspaces', table => {
7 table.increments(); 7 table.increments();
8 table.string('workspaceId', 80).notNullable().unique(); 8 table.string('workspaceId', 80).notNullable().unique();
9 table.string('name', 80).notNullable(); 9 table.string('name', 80).notNullable();
diff --git a/src/internal-server/start/app.js b/src/internal-server/start/app.js
index 8b1a49f57..7ca544085 100644
--- a/src/internal-server/start/app.js
+++ b/src/internal-server/start/app.js
@@ -28,9 +28,7 @@ const providers = [
28| Providers for migrations, tests etc. 28| Providers for migrations, tests etc.
29| 29|
30*/ 30*/
31const aceProviders = [ 31const aceProviders = ['@adonisjs/lucid/providers/MigrationsProvider'];
32 '@adonisjs/lucid/providers/MigrationsProvider',
33];
34 32
35/* 33/*
36|-------------------------------------------------------------------------- 34|--------------------------------------------------------------------------
@@ -57,5 +55,8 @@ const aliases = {};
57const commands = []; 55const commands = [];
58 56
59module.exports = { 57module.exports = {
60 providers, aceProviders, aliases, commands, 58 providers,
59 aceProviders,
60 aliases,
61 commands,
61}; 62};
diff --git a/src/jsUtils.ts b/src/jsUtils.ts
index b1baad7c5..d7ea4eb40 100644
--- a/src/jsUtils.ts
+++ b/src/jsUtils.ts
@@ -1,3 +1,14 @@
1export const ifUndefinedString = (source: string | undefined | null, defaultValue: string): string => (source !== undefined && source !== null ? source : defaultValue); 1export const ifUndefinedString = (
2export const ifUndefinedBoolean = (source: boolean | undefined | null, defaultValue: boolean): boolean => Boolean(source !== undefined && source !== null ? source : defaultValue); 2 source: string | undefined | null,
3export const ifUndefinedNumber = (source: number | undefined | null, defaultValue: number): number => Number(source !== undefined && source !== null ? source : defaultValue); 3 defaultValue: string,
4): string => (source !== undefined && source !== null ? source : defaultValue);
5export const ifUndefinedBoolean = (
6 source: boolean | undefined | null,
7 defaultValue: boolean,
8): boolean =>
9 Boolean(source !== undefined && source !== null ? source : defaultValue);
10export const ifUndefinedNumber = (
11 source: number | undefined | null,
12 defaultValue: number,
13): number =>
14 Number(source !== undefined && source !== null ? source : defaultValue);
diff --git a/src/lib/Tray.js b/src/lib/Tray.js
index 7360611cd..e7afc3552 100644
--- a/src/lib/Tray.js
+++ b/src/lib/Tray.js
@@ -1,5 +1,11 @@
1import { 1import {
2 app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain, 2 app,
3 Menu,
4 nativeImage,
5 nativeTheme,
6 systemPreferences,
7 Tray,
8 ipcMain,
3} from 'electron'; 9} from 'electron';
4import { join } from 'path'; 10import { join } from 'path';
5import macosVersion from 'macos-version'; 11import macosVersion from 'macos-version';
@@ -65,7 +71,9 @@ export default class TrayIcon {
65 71
66 if (appSettings.type === 'app') { 72 if (appSettings.type === 'app') {
67 const { isAppMuted } = appSettings.data; 73 const { isAppMuted } = appSettings.data;
68 this.trayMenuTemplate[1].label = isAppMuted ? 'Enable Notifications && Audio' : 'Disable Notifications && Audio'; 74 this.trayMenuTemplate[1].label = isAppMuted
75 ? 'Enable Notifications && Audio'
76 : 'Disable Notifications && Audio';
69 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate); 77 this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate);
70 if (isLinux) { 78 if (isLinux) {
71 this.trayIcon.setContextMenu(this.trayMenu); 79 this.trayIcon.setContextMenu(this.trayMenu);
@@ -108,9 +116,12 @@ export default class TrayIcon {
108 } 116 }
109 117
110 if (isMac) { 118 if (isMac) {
111 this.themeChangeSubscriberId = systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => { 119 this.themeChangeSubscriberId = systemPreferences.subscribeNotification(
112 this._refreshIcon(); 120 'AppleInterfaceThemeChangedNotification',
113 }); 121 () => {
122 this._refreshIcon();
123 },
124 );
114 } 125 }
115 } 126 }
116 127
@@ -150,7 +161,8 @@ export default class TrayIcon {
150 _getAssetFromIndicator(indicator) { 161 _getAssetFromIndicator(indicator) {
151 if (indicator === '•') { 162 if (indicator === '•') {
152 return INDICATOR_TRAY_INDIRECT; 163 return INDICATOR_TRAY_INDIRECT;
153 } if (indicator !== 0) { 164 }
165 if (indicator !== 0) {
154 return INDICATOR_TRAY_UNREAD; 166 return INDICATOR_TRAY_UNREAD;
155 } 167 }
156 return INDICATOR_TRAY_PLAIN; 168 return INDICATOR_TRAY_PLAIN;
@@ -159,11 +171,16 @@ export default class TrayIcon {
159 _refreshIcon() { 171 _refreshIcon() {
160 if (!this.trayIcon) return; 172 if (!this.trayIcon) return;
161 173
162 this.trayIcon.setImage(this._getAsset('tray', this._getAssetFromIndicator(this.indicator))); 174 this.trayIcon.setImage(
175 this._getAsset('tray', this._getAssetFromIndicator(this.indicator)),
176 );
163 177
164 if (isMac) { 178 if (isMac) {
165 this.trayIcon.setPressedImage( 179 this.trayIcon.setPressedImage(
166 this._getAsset('tray', `${this._getAssetFromIndicator(this.indicator)}-active`), 180 this._getAsset(
181 'tray',
182 `${this._getAssetFromIndicator(this.indicator)}-active`,
183 ),
167 ); 184 );
168 } 185 }
169 } 186 }
@@ -171,12 +188,24 @@ export default class TrayIcon {
171 _getAsset(type, asset) { 188 _getAsset(type, asset) {
172 let { platform } = process; 189 let { platform } = process;
173 190
174 if (isMac && (nativeTheme.shouldUseDarkColors || macosVersion.isGreaterThanOrEqualTo('11'))) { 191 if (
192 isMac &&
193 (nativeTheme.shouldUseDarkColors ||
194 macosVersion.isGreaterThanOrEqualTo('11'))
195 ) {
175 platform = `${platform}-dark`; 196 platform = `${platform}-dark`;
176 } 197 }
177 198
178 return nativeImage.createFromPath(join( 199 return nativeImage.createFromPath(
179 __dirname, '..', 'assets', 'images', type, platform, `${asset}.${FILE_EXTENSION}`, 200 join(
180 )); 201 __dirname,
202 '..',
203 'assets',
204 'images',
205 type,
206 platform,
207 `${asset}.${FILE_EXTENSION}`,
208 ),
209 );
181 } 210 }
182} 211}
diff --git a/src/models/Recipe.ts b/src/models/Recipe.ts
index 859c75df0..e45977f24 100644
--- a/src/models/Recipe.ts
+++ b/src/models/Recipe.ts
@@ -1,10 +1,7 @@
1import semver from 'semver'; 1import semver from 'semver';
2import { pathExistsSync } from 'fs-extra'; 2import { pathExistsSync } from 'fs-extra';
3import { join } from 'path'; 3import { join } from 'path';
4import { 4import { ifUndefinedString, ifUndefinedBoolean } from '../jsUtils';
5 ifUndefinedString,
6 ifUndefinedBoolean,
7} from '../jsUtils';
8 5
9interface IRecipe { 6interface IRecipe {
10 id: string; 7 id: string;
@@ -75,7 +72,8 @@ export default class Recipe {
75 72
76 message: string = ''; 73 message: string = '';
77 74
78 allowFavoritesDelineationInUnreadCount: boolean = DEFAULT_RECIPE_SETTINGS.allowFavoritesDelineationInUnreadCount; 75 allowFavoritesDelineationInUnreadCount: boolean =
76 DEFAULT_RECIPE_SETTINGS.allowFavoritesDelineationInUnreadCount;
79 77
80 disablewebsecurity: boolean = DEFAULT_RECIPE_SETTINGS.disablewebsecurity; 78 disablewebsecurity: boolean = DEFAULT_RECIPE_SETTINGS.disablewebsecurity;
81 79
@@ -98,7 +96,9 @@ export default class Recipe {
98 } 96 }
99 97
100 if (!semver.valid(data.version)) { 98 if (!semver.valid(data.version)) {
101 throw new Error(`Version ${data.version} of recipe '${data.name}' is not a valid semver version`); 99 throw new Error(
100 `Version ${data.version} of recipe '${data.name}' is not a valid semver version`,
101 );
102 } 102 }
103 103
104 // from the recipe 104 // from the recipe
@@ -106,19 +106,52 @@ export default class Recipe {
106 this.name = ifUndefinedString(data.name, this.name); 106 this.name = ifUndefinedString(data.name, this.name);
107 this.version = ifUndefinedString(data.version, this.version); 107 this.version = ifUndefinedString(data.version, this.version);
108 this.aliases = data.aliases || this.aliases; 108 this.aliases = data.aliases || this.aliases;
109 this.serviceURL = ifUndefinedString(data.config.serviceURL, this.serviceURL); 109 this.serviceURL = ifUndefinedString(
110 this.hasDirectMessages = ifUndefinedBoolean(data.config.hasDirectMessages, this.hasDirectMessages); 110 data.config.serviceURL,
111 this.hasIndirectMessages = ifUndefinedBoolean(data.config.hasIndirectMessages, this.hasIndirectMessages); 111 this.serviceURL,
112 this.hasNotificationSound = ifUndefinedBoolean(data.config.hasNotificationSound, this.hasNotificationSound); 112 );
113 this.hasDirectMessages = ifUndefinedBoolean(
114 data.config.hasDirectMessages,
115 this.hasDirectMessages,
116 );
117 this.hasIndirectMessages = ifUndefinedBoolean(
118 data.config.hasIndirectMessages,
119 this.hasIndirectMessages,
120 );
121 this.hasNotificationSound = ifUndefinedBoolean(
122 data.config.hasNotificationSound,
123 this.hasNotificationSound,
124 );
113 this.hasTeamId = ifUndefinedBoolean(data.config.hasTeamId, this.hasTeamId); 125 this.hasTeamId = ifUndefinedBoolean(data.config.hasTeamId, this.hasTeamId);
114 this.hasCustomUrl = ifUndefinedBoolean(data.config.hasCustomUrl, this.hasCustomUrl); 126 this.hasCustomUrl = ifUndefinedBoolean(
115 this.hasHostedOption = ifUndefinedBoolean(data.config.hasHostedOption, this.hasHostedOption); 127 data.config.hasCustomUrl,
116 this.urlInputPrefix = ifUndefinedString(data.config.urlInputPrefix, this.urlInputPrefix); 128 this.hasCustomUrl,
117 this.urlInputSuffix = ifUndefinedString(data.config.urlInputSuffix, this.urlInputSuffix); 129 );
118 this.disablewebsecurity = ifUndefinedBoolean(data.config.disablewebsecurity, this.disablewebsecurity); 130 this.hasHostedOption = ifUndefinedBoolean(
119 this.autoHibernate = ifUndefinedBoolean(data.config.autoHibernate, this.autoHibernate); 131 data.config.hasHostedOption,
132 this.hasHostedOption,
133 );
134 this.urlInputPrefix = ifUndefinedString(
135 data.config.urlInputPrefix,
136 this.urlInputPrefix,
137 );
138 this.urlInputSuffix = ifUndefinedString(
139 data.config.urlInputSuffix,
140 this.urlInputSuffix,
141 );
142 this.disablewebsecurity = ifUndefinedBoolean(
143 data.config.disablewebsecurity,
144 this.disablewebsecurity,
145 );
146 this.autoHibernate = ifUndefinedBoolean(
147 data.config.autoHibernate,
148 this.autoHibernate,
149 );
120 this.message = ifUndefinedString(data.config.message, this.message); 150 this.message = ifUndefinedString(data.config.message, this.message);
121 this.allowFavoritesDelineationInUnreadCount = ifUndefinedBoolean(data.config.allowFavoritesDelineationInUnreadCount, this.allowFavoritesDelineationInUnreadCount); 151 this.allowFavoritesDelineationInUnreadCount = ifUndefinedBoolean(
152 data.config.allowFavoritesDelineationInUnreadCount,
153 this.allowFavoritesDelineationInUnreadCount,
154 );
122 155
123 // computed 156 // computed
124 this.path = data.path; 157 this.path = data.path;
diff --git a/src/models/User.ts b/src/models/User.ts
index a04d46d3c..571f1f847 100644
--- a/src/models/User.ts
+++ b/src/models/User.ts
@@ -59,7 +59,8 @@ export default class User {
59 this.beta = data.beta || this.beta; 59 this.beta = data.beta || this.beta;
60 this.locale = data.locale || this.locale; 60 this.locale = data.locale || this.locale;
61 61
62 this.isSubscriptionOwner = data.isSubscriptionOwner || this.isSubscriptionOwner; 62 this.isSubscriptionOwner =
63 data.isSubscriptionOwner || this.isSubscriptionOwner;
63 64
64 this.team = data.team || this.team; 65 this.team = data.team || this.team;
65 } 66 }
diff --git a/src/models/UserAgent.js b/src/models/UserAgent.js
index 33bf9d072..02ff97db1 100644
--- a/src/models/UserAgent.js
+++ b/src/models/UserAgent.js
@@ -63,8 +63,12 @@ export default class UserAgent {
63 } 63 }
64 64
65 @computed get userAgent() { 65 @computed get userAgent() {
66 return this.serviceUserAgentPref 66 return (
67 || (this.chromelessUserAgent ? this.userAgentWithoutChromeVersion : this.defaultUserAgent); 67 this.serviceUserAgentPref ||
68 (this.chromelessUserAgent
69 ? this.userAgentWithoutChromeVersion
70 : this.defaultUserAgent)
71 );
68 } 72 }
69 73
70 @action setWebviewReference(webview) { 74 @action setWebviewReference(webview) {
diff --git a/src/stores/RecipePreviewsStore.js b/src/stores/RecipePreviewsStore.js
index f4e39306c..e01e8fc6f 100644
--- a/src/stores/RecipePreviewsStore.js
+++ b/src/stores/RecipePreviewsStore.js
@@ -5,9 +5,15 @@ import CachedRequest from './lib/CachedRequest';
5import Request from './lib/Request'; 5import Request from './lib/Request';
6 6
7export default class RecipePreviewsStore extends Store { 7export default class RecipePreviewsStore extends Store {
8 @observable allRecipePreviewsRequest = new CachedRequest(this.api.recipePreviews, 'all'); 8 @observable allRecipePreviewsRequest = new CachedRequest(
9 this.api.recipePreviews,
10 'all',
11 );
9 12
10 @observable searchRecipePreviewsRequest = new Request(this.api.recipePreviews, 'search'); 13 @observable searchRecipePreviewsRequest = new Request(
14 this.api.recipePreviews,
15 'search',
16 );
11 17
12 constructor(...args) { 18 constructor(...args) {
13 super(...args); 19 super(...args);
@@ -25,7 +31,7 @@ export default class RecipePreviewsStore extends Store {
25 } 31 }
26 32
27 @computed get dev() { 33 @computed get dev() {
28 return this.stores.recipes.all.filter((r) => r.local); 34 return this.stores.recipes.all.filter(r => r.local);
29 } 35 }
30 36
31 // Actions 37 // Actions
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index e27567e8f..5ed9e3534 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -394,7 +394,7 @@ export default class ServicesStore extends Store {
394 } 394 }
395 395
396 // set default values for serviceData 396 // set default values for serviceData
397 // eslint-disable-next-line prefer-object-spread 397
398 // TODO: How is this different from the defaults of the recipe in 'src/models/Recipe' file? 398 // TODO: How is this different from the defaults of the recipe in 'src/models/Recipe' file?
399 serviceData = { 399 serviceData = {
400 isEnabled: true, 400 isEnabled: true,
diff --git a/src/stores/SettingsStore.js b/src/stores/SettingsStore.js
index ec80fee7c..ac9356404 100644
--- a/src/stores/SettingsStore.js
+++ b/src/stores/SettingsStore.js
@@ -2,7 +2,11 @@ import { ipcRenderer } from 'electron';
2import { getCurrentWindow } from '@electron/remote'; 2import { getCurrentWindow } from '@electron/remote';
3import { action, computed, observable, reaction } from 'mobx'; 3import { action, computed, observable, reaction } from 'mobx';
4import localStorage from 'mobx-localstorage'; 4import localStorage from 'mobx-localstorage';
5import { DEFAULT_APP_SETTINGS, FILE_SYSTEM_SETTINGS_TYPES, LOCAL_SERVER } from '../config'; 5import {
6 DEFAULT_APP_SETTINGS,
7 FILE_SYSTEM_SETTINGS_TYPES,
8 LOCAL_SERVER,
9} from '../config';
6import { hash } from '../helpers/password-helpers'; 10import { hash } from '../helpers/password-helpers';
7import Request from './lib/Request'; 11import Request from './lib/Request';
8import Store from './lib/Store'; 12import Store from './lib/Store';
diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js
index 9f222d2d3..9a5d8cb30 100644
--- a/src/stores/UserStore.js
+++ b/src/stores/UserStore.js
@@ -273,13 +273,11 @@ export default class UserStore extends Store {
273 273
274 // Install recipes 274 // Install recipes
275 for (const recipe of recipes) { 275 for (const recipe of recipes) {
276 // eslint-disable-line no-unused-vars
277 // eslint-disable-next-line no-await-in-loop 276 // eslint-disable-next-line no-await-in-loop
278 await this.stores.recipes._install({ recipeId: recipe }); 277 await this.stores.recipes._install({ recipeId: recipe });
279 } 278 }
280 279
281 for (const service of services) { 280 for (const service of services) {
282 // eslint-disable-line no-unused-vars
283 this.actions.service.createFromLegacyService({ 281 this.actions.service.createFromLegacyService({
284 data: service, 282 data: service,
285 }); 283 });
diff --git a/src/stores/lib/Request.js b/src/stores/lib/Request.js
index 39f32729a..65871ea17 100644
--- a/src/stores/lib/Request.js
+++ b/src/stores/lib/Request.js
@@ -38,42 +38,56 @@ export default class Request {
38 if (this._isWaitingForResponse) return this; 38 if (this._isWaitingForResponse) return this;
39 39
40 if (!this._api[this._method]) { 40 if (!this._api[this._method]) {
41 throw new Error(`Missing method <${this._method}> on api object:`, this._api); 41 throw new Error(
42 `Missing method <${this._method}> on api object:`,
43 this._api,
44 );
42 } 45 }
43 46
44 // This timeout is necessary to avoid warnings from mobx 47 // This timeout is necessary to avoid warnings from mobx
45 // regarding triggering actions as side-effect of getters 48 // regarding triggering actions as side-effect of getters
46 setTimeout(action(() => { 49 setTimeout(
47 this.isExecuting = true; 50 action(() => {
48 }), 0); 51 this.isExecuting = true;
52 }),
53 0,
54 );
49 55
50 // Issue api call & save it as promise that is handled to update the results of the operation 56 // Issue api call & save it as promise that is handled to update the results of the operation
51 this._promise = new Promise((resolve, reject) => { 57 this._promise = new Promise((resolve, reject) => {
52 this._api[this._method](...callArgs) 58 this._api[this._method](...callArgs)
53 .then((result) => { 59 .then(result => {
54 setTimeout(action(() => { 60 setTimeout(
55 this.result = result; 61 action(() => {
56 if (this._currentApiCall) this._currentApiCall.result = result; 62 this.result = result;
57 this.isExecuting = false; 63 if (this._currentApiCall) this._currentApiCall.result = result;
58 this.isError = false; 64 this.isExecuting = false;
59 this.wasExecuted = true; 65 this.isError = false;
60 this._isWaitingForResponse = false; 66 this.wasExecuted = true;
61 this._triggerHooks(); 67 this._isWaitingForResponse = false;
62 resolve(result); 68 this._triggerHooks();
63 }), 1); 69 resolve(result);
70 }),
71 1,
72 );
64 return result; 73 return result;
65 }) 74 })
66 .catch(action((error) => { 75 .catch(
67 setTimeout(action(() => { 76 action(error => {
68 this.error = error; 77 setTimeout(
69 this.isExecuting = false; 78 action(() => {
70 this.isError = true; 79 this.error = error;
71 this.wasExecuted = true; 80 this.isExecuting = false;
72 this._isWaitingForResponse = false; 81 this.isError = true;
73 this._triggerHooks(); 82 this.wasExecuted = true;
74 reject(error); 83 this._isWaitingForResponse = false;
75 }), 1); 84 this._triggerHooks();
76 })); 85 reject(error);
86 }),
87 1,
88 );
89 }),
90 );
77 }); 91 });
78 92
79 this._isWaitingForResponse = true; 93 this._isWaitingForResponse = true;
@@ -89,7 +103,11 @@ export default class Request {
89 retry = () => this.reload(); 103 retry = () => this.reload();
90 104
91 isExecutingWithArgs(...args) { 105 isExecutingWithArgs(...args) {
92 return this.isExecuting && this._currentApiCall && isEqual(this._currentApiCall.args, args); 106 return (
107 this.isExecuting &&
108 this._currentApiCall &&
109 isEqual(this._currentApiCall.args, args)
110 );
93 } 111 }
94 112
95 @computed get isExecutingFirstTime() { 113 @computed get isExecutingFirstTime() {
@@ -97,12 +115,18 @@ export default class Request {
97 } 115 }
98 116
99 then(...args) { 117 then(...args) {
100 if (!this._promise) throw new Error('You have to call Request::execute before you can access it as promise'); 118 if (!this._promise)
119 throw new Error(
120 'You have to call Request::execute before you can access it as promise',
121 );
101 return this._promise.then(...args); 122 return this._promise.then(...args);
102 } 123 }
103 124
104 catch(...args) { 125 catch(...args) {
105 if (!this._promise) throw new Error('You have to call Request::execute before you can access it as promise'); 126 if (!this._promise)
127 throw new Error(
128 'You have to call Request::execute before you can access it as promise',
129 );
106 return this._promise.catch(...args); 130 return this._promise.catch(...args);
107 } 131 }
108 132
diff --git a/src/stores/lib/Store.js b/src/stores/lib/Store.js
index b39070ce8..a867c3a46 100644
--- a/src/stores/lib/Store.js
+++ b/src/stores/lib/Store.js
@@ -28,7 +28,8 @@ export default class Store {
28 } 28 }
29 29
30 registerReactions(reactions) { 30 registerReactions(reactions) {
31 for (const reaction of reactions) this._reactions.push(new Reaction(reaction)); 31 for (const reaction of reactions)
32 this._reactions.push(new Reaction(reaction));
32 } 33 }
33 34
34 setup() {} 35 setup() {}
diff --git a/src/webview/badge.ts b/src/webview/badge.ts
index 8e8b66c0c..fb696723d 100644
--- a/src/webview/badge.ts
+++ b/src/webview/badge.ts
@@ -3,7 +3,7 @@ import { ipcRenderer } from 'electron';
3const debug = require('debug')('Ferdi:Plugin:BadgeHandler'); 3const debug = require('debug')('Ferdi:Plugin:BadgeHandler');
4 4
5export class BadgeHandler { 5export class BadgeHandler {
6 countCache: { direct: number; indirect: number; }; 6 countCache: { direct: number; indirect: number };
7 7
8 constructor() { 8 constructor() {
9 this.countCache = { 9 this.countCache = {
@@ -26,14 +26,19 @@ export class BadgeHandler {
26 return Math.max(adjustedNumber, 0); 26 return Math.max(adjustedNumber, 0);
27 } 27 }
28 28
29 setBadge(direct: string | number | undefined | null, indirect: string | number | undefined | null) { 29 setBadge(
30 direct: string | number | undefined | null,
31 indirect: string | number | undefined | null,
32 ) {
30 const count = { 33 const count = {
31 direct: this.safeParseInt(direct), 34 direct: this.safeParseInt(direct),
32 indirect: this.safeParseInt(indirect), 35 indirect: this.safeParseInt(indirect),
33 }; 36 };
34 37
35 if (this.countCache.direct.toString() === count.direct.toString() 38 if (
36 && this.countCache.indirect.toString() === count.indirect.toString()) { 39 this.countCache.direct.toString() === count.direct.toString() &&
40 this.countCache.indirect.toString() === count.indirect.toString()
41 ) {
37 return; 42 return;
38 } 43 }
39 44
diff --git a/src/webview/contextMenuBuilder.ts b/src/webview/contextMenuBuilder.ts
index fda5fa8b8..7b8c6cb2d 100644
--- a/src/webview/contextMenuBuilder.ts
+++ b/src/webview/contextMenuBuilder.ts
@@ -6,7 +6,7 @@
6 * 6 *
7 * Source: https://github.com/electron-userland/electron-spellchecker/blob/master/src/context-menu-builder.js 7 * Source: https://github.com/electron-userland/electron-spellchecker/blob/master/src/context-menu-builder.js
8 */ 8 */
9// eslint-disable-next-line no-unused-vars 9
10import { clipboard, ipcRenderer, nativeImage, WebContents } from 'electron'; 10import { clipboard, ipcRenderer, nativeImage, WebContents } from 'electron';
11import { Menu, MenuItem } from '@electron/remote'; 11import { Menu, MenuItem } from '@electron/remote';
12import { cmdOrCtrlShortcutKey, isMac } from '../environment'; 12import { cmdOrCtrlShortcutKey, isMac } from '../environment';
@@ -311,7 +311,7 @@ export class ContextMenuBuilder {
311 menu.append( 311 menu.append(
312 new MenuItem({ 312 new MenuItem({
313 label: suggestion, 313 label: suggestion,
314 // eslint-disable-next-line no-loop-func 314
315 click: () => webContents.replaceMisspelling(suggestion), 315 click: () => webContents.replaceMisspelling(suggestion),
316 }), 316 }),
317 ); 317 );
diff --git a/src/webview/spellchecker.ts b/src/webview/spellchecker.ts
index 468a1b4ae..ee70589d5 100644
--- a/src/webview/spellchecker.ts
+++ b/src/webview/spellchecker.ts
@@ -5,7 +5,11 @@ import { isMac } from '../environment';
5const debug = require('debug')('Ferdi:spellchecker'); 5const debug = require('debug')('Ferdi:spellchecker');
6 6
7export function getSpellcheckerLocaleByFuzzyIdentifier(identifier: string) { 7export function getSpellcheckerLocaleByFuzzyIdentifier(identifier: string) {
8 const locales = Object.keys(SPELLCHECKER_LOCALES).filter((key) => key.toLocaleLowerCase() === identifier.toLowerCase() || key.split('-')[0] === identifier.toLowerCase()); 8 const locales = Object.keys(SPELLCHECKER_LOCALES).filter(
9 key =>
10 key.toLocaleLowerCase() === identifier.toLowerCase() ||
11 key.split('-')[0] === identifier.toLowerCase(),
12 );
9 13
10 return locales.length > 0 ? locales[0] : null; 14 return locales.length > 0 ? locales[0] : null;
11} 15}
diff --git a/uidev/src/index.tsx b/uidev/src/index.tsx
index c996d9f69..0f2003d24 100644
--- a/uidev/src/index.tsx
+++ b/uidev/src/index.tsx
@@ -1,8 +1,6 @@
1import { render } from 'react-dom'; 1import { render } from 'react-dom';
2import { App } from './app'; 2import { App } from './app';
3 3
4const app = () => ( 4const app = () => <App />;
5 <App />
6);
7 5
8render(app(), document.querySelector('#root')); 6render(app(), document.querySelector('#root'));
diff --git a/uidev/src/stories/button.stories.tsx b/uidev/src/stories/button.stories.tsx
index e948e8ca4..400063cea 100644
--- a/uidev/src/stories/button.stories.tsx
+++ b/uidev/src/stories/button.stories.tsx
@@ -32,117 +32,144 @@ const createStore = (args?: any) => observable({ ...defaultProps, ...args });
32const WithStoreButton = observer(({ store }: { store: any }) => ( 32const WithStoreButton = observer(({ store }: { store: any }) => (
33 <> 33 <>
34 <Button 34 <Button
35 {...({ ...defaultProps, ...store })} 35 {...{ ...defaultProps, ...store }}
36 onClick={!store.onClick ? () => { 36 onClick={
37 store.busy = !store.busy; 37 !store.onClick
38 ? () => {
39 store.busy = !store.busy;
38 40
39 window.setTimeout(() => { 41 window.setTimeout(() => {
40 store.busy = !store.busy; 42 store.busy = !store.busy;
41 }, 1000); 43 }, 1000);
42 } : store.onClick} 44 }
45 : store.onClick
46 }
43 /> 47 />
44 </> 48 </>
45)); 49));
46 50
47storiesOf('Button') 51storiesOf('Button')
48 .add('Basic', () => ( 52 .add('Basic', () => <WithStoreButton store={createStore()} />)
49 <WithStoreButton store={createStore()} />
50 ))
51 .add('Secondary', () => ( 53 .add('Secondary', () => (
52 <WithStoreButton store={createStore({ 54 <WithStoreButton
53 buttonType: 'secondary', 55 store={createStore({
54 })} 56 buttonType: 'secondary',
57 })}
55 /> 58 />
56 )) 59 ))
57 .add('Success', () => ( 60 .add('Success', () => (
58 <WithStoreButton store={createStore({ 61 <WithStoreButton
59 buttonType: 'success', 62 store={createStore({
60 })} 63 buttonType: 'success',
64 })}
61 /> 65 />
62 )) 66 ))
63 .add('Warning', () => ( 67 .add('Warning', () => (
64 <WithStoreButton store={createStore({ 68 <WithStoreButton
65 buttonType: 'warning', 69 store={createStore({
66 })} 70 buttonType: 'warning',
71 })}
67 /> 72 />
68 )) 73 ))
69 .add('Danger', () => ( 74 .add('Danger', () => (
70 <WithStoreButton store={createStore({ 75 <WithStoreButton
71 buttonType: 'danger', 76 store={createStore({
72 })} 77 buttonType: 'danger',
78 })}
73 /> 79 />
74 )) 80 ))
75 .add('Inverted', () => ( 81 .add('Inverted', () => (
76 <WithStoreButton store={createStore({ 82 <WithStoreButton
77 buttonType: 'inverted', 83 store={createStore({
78 })} 84 buttonType: 'inverted',
85 })}
79 /> 86 />
80 )) 87 ))
81 .add('Full width', () => ( 88 .add('Full width', () => (
82 <WithStoreButton store={createStore({ 89 <WithStoreButton
83 stretch: true, 90 store={createStore({
84 })} 91 stretch: true,
92 })}
85 /> 93 />
86 )) 94 ))
87 .add('Disabled', () => ( 95 .add('Disabled', () => (
88 <WithStoreButton store={createStore({ 96 <WithStoreButton
89 disabled: true, 97 store={createStore({
90 })} 98 disabled: true,
99 })}
91 /> 100 />
92 )) 101 ))
93 .add('With loader', () => ( 102 .add('With loader', () => (
94 <WithStoreButton store={createStore({ 103 <WithStoreButton
95 busy: true, 104 store={createStore({
96 })} 105 busy: true,
106 })}
97 /> 107 />
98 )) 108 ))
99 .add('With icon', () => ( 109 .add('With icon', () => (
100 <WithStoreButton store={createStore({ 110 <WithStoreButton
101 icon: mdiInformation, 111 store={createStore({
102 })} 112 icon: mdiInformation,
113 })}
103 /> 114 />
104 )) 115 ))
105 .add('As link', () => ( 116 .add('As link', () => (
106 <WithStoreButton store={createStore({ 117 <WithStoreButton
107 href: 'https://meetfranz.com', 118 store={createStore({
108 })} 119 href: 'https://meetfranz.com',
120 })}
109 /> 121 />
110 )) 122 ))
111 .add('As link (target=_blank)', () => ( 123 .add('As link (target=_blank)', () => (
112 <WithStoreButton store={createStore({ 124 <WithStoreButton
113 href: 'https://meetfranz.com', 125 store={createStore({
114 target: '_blank', 126 href: 'https://meetfranz.com',
115 })} 127 target: '_blank',
128 })}
116 /> 129 />
117 )) 130 ))
118 .add('As link (with onClick)', () => ( 131 .add('As link (with onClick)', () => (
119 <WithStoreButton store={createStore({ 132 <WithStoreButton
120 href: 'https://meetfranz.com', 133 store={createStore({
121 onClick: (e: React.MouseEvent<HTMLAnchorElement>) => { 134 href: 'https://meetfranz.com',
122 e.preventDefault(); 135 onClick: (e: React.MouseEvent<HTMLAnchorElement>) => {
123 alert('Click event'); 136 e.preventDefault();
124 }, 137 alert('Click event');
125 })} 138 },
139 })}
126 /> 140 />
127 )) 141 ))
128 .add('Long multi-line button', () => ( 142 .add('Long multi-line button', () => (
129 <WithStoreButton store={createStore({ 143 <WithStoreButton
130 label: 'But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force.', 144 store={createStore({
131 })} 145 label:
146 'But there is something that I must say to my people, who stand on the warm threshold which leads into the palace of justice: In the process of gaining our rightful place, we must not be guilty of wrongful deeds. Let us not seek to satisfy our thirst for freedom by drinking from the cup of bitterness and hatred. We must forever conduct our struggle on the high plane of dignity and discipline. We must not allow our creative protest to degenerate into physical violence. Again and again, we must rise to the majestic heights of meeting physical force with soul force.',
147 })}
132 /> 148 />
133 )) 149 ))
134 .add('Button with Input', injectSheet(styles)(observer(({ classes }: { classes: Classes }) => ( 150 .add(
135 <div className={classes.combinedElements}> 151 'Button with Input',
136 <Input showLabel={false} className={classes.input} noMargin /> 152 injectSheet(styles)(
137 <WithStoreButton store={createStore({})} /> 153 observer(({ classes }: { classes: Classes }) => (
138 </div> 154 <div className={classes.combinedElements}>
139 )))) 155 <Input showLabel={false} className={classes.input} noMargin />
140 .add('Icon Button with Input', injectSheet(styles)(observer(({ classes }: { classes: Classes }) => ( 156 <WithStoreButton store={createStore({})} />
141 <div className={classes.combinedElements}> 157 </div>
142 <Input showLabel={false} className={classes.input} noMargin /> 158 )),
143 <WithStoreButton store={createStore({ 159 ),
144 icon: mdiInformation, 160 )
145 })} 161 .add(
146 /> 162 'Icon Button with Input',
147 </div> 163 injectSheet(styles)(
148 )))); 164 observer(({ classes }: { classes: Classes }) => (
165 <div className={classes.combinedElements}>
166 <Input showLabel={false} className={classes.input} noMargin />
167 <WithStoreButton
168 store={createStore({
169 icon: mdiInformation,
170 })}
171 />
172 </div>
173 )),
174 ),
175 );
diff --git a/uidev/src/stories/headline.stories.tsx b/uidev/src/stories/headline.stories.tsx
index 1f1ab2036..f6a95b1f4 100644
--- a/uidev/src/stories/headline.stories.tsx
+++ b/uidev/src/stories/headline.stories.tsx
@@ -38,12 +38,11 @@ import { storiesOf } from '../stores/stories';
38// </> 38// </>
39// )); 39// ));
40 40
41storiesOf('Typo') 41storiesOf('Typo').add('Headlines', () => (
42 .add('Headlines', () => ( 42 <>
43 <> 43 <H1>Welcome to the world of tomorrow</H1>
44 <H1>Welcome to the world of tomorrow</H1> 44 <H2>Welcome to the world of tomorrow</H2>
45 <H2>Welcome to the world of tomorrow</H2> 45 <H3>Welcome to the world of tomorrow</H3>
46 <H3>Welcome to the world of tomorrow</H3> 46 <H4>Welcome to the world of tomorrow</H4>
47 <H4>Welcome to the world of tomorrow</H4> 47 </>
48 </> 48));
49 ));
diff --git a/uidev/src/stories/icon.stories.tsx b/uidev/src/stories/icon.stories.tsx
index 12c08fd57..73ed1b927 100644
--- a/uidev/src/stories/icon.stories.tsx
+++ b/uidev/src/stories/icon.stories.tsx
@@ -3,11 +3,10 @@ import { mdiAccountCircle } from '@mdi/js';
3import { Icon } from '@meetfranz/ui'; 3import { Icon } from '@meetfranz/ui';
4import { storiesOf } from '../stores/stories'; 4import { storiesOf } from '../stores/stories';
5 5
6storiesOf('Icon') 6storiesOf('Icon').add('Basic', () => (
7 .add('Basic', () => ( 7 <>
8 <> 8 <Icon icon={mdiAccountCircle} />
9 <Icon icon={mdiAccountCircle} /> 9 <Icon icon={mdiAccountCircle} size={2} />
10 <Icon icon={mdiAccountCircle} size={2} /> 10 <Icon icon={mdiAccountCircle} size={3} />
11 <Icon icon={mdiAccountCircle} size={3} /> 11 </>
12 </> 12));
13 ));
diff --git a/uidev/src/stories/infobox.stories.tsx b/uidev/src/stories/infobox.stories.tsx
index 166150606..b5f86e37d 100644
--- a/uidev/src/stories/infobox.stories.tsx
+++ b/uidev/src/stories/infobox.stories.tsx
@@ -14,30 +14,37 @@ interface IStoreArgs {
14 className?: string; 14 className?: string;
15} 15}
16 16
17const createStore = (args?: IStoreArgs) => observable({ type: 'primary', 17const createStore = (args?: IStoreArgs) =>
18 observable({
19 type: 'primary',
18 ctaOnClick: () => { 20 ctaOnClick: () => {
19 alert('on click handler'); 21 alert('on click handler');
20 }, 22 },
21...args }); 23 ...args,
24 });
22 25
23const WithStoreInfobox = observer(({ store, children }: { store: any, children: string | React.ReactNode }) => ( 26const WithStoreInfobox = observer(
24 <> 27 ({ store, children }: { store: any; children: string | React.ReactNode }) => (
25 <Infobox 28 <>
26 icon={store.icon} 29 <Infobox
27 ctaLabel={store.ctaLabel} 30 icon={store.icon}
28 type={store.type} 31 ctaLabel={store.ctaLabel}
29 ctaOnClick={store.ctaOnClick} 32 type={store.type}
30 dismissable={store.dismissable} 33 ctaOnClick={store.ctaOnClick}
31 className={store.className} 34 dismissable={store.dismissable}
32 > 35 className={store.className}
33 {children} 36 >
34 </Infobox> 37 {children}
35 </> 38 </Infobox>
36)); 39 </>
40 ),
41);
37 42
38storiesOf('Infobox') 43storiesOf('Infobox')
39 .add('Basic', () => ( 44 .add('Basic', () => (
40 <WithStoreInfobox store={createStore()}>Welcome to the world of tomorrow</WithStoreInfobox> 45 <WithStoreInfobox store={createStore()}>
46 Welcome to the world of tomorrow
47 </WithStoreInfobox>
41 )) 48 ))
42 .add('Icon + Dismissable', () => ( 49 .add('Icon + Dismissable', () => (
43 <WithStoreInfobox 50 <WithStoreInfobox
@@ -66,7 +73,10 @@ storiesOf('Infobox')
66 ctaLabel: 'Ok, hi!', 73 ctaLabel: 'Ok, hi!',
67 })} 74 })}
68 > 75 >
69 Ferdi is your messaging app / former Emperor of Austria and combines chat & messaging services into one application. Ferdi currently supports Slack, WhatsApp, WeChat, HipChat, Facebook Messenger, Telegram, Google Hangouts,GroupMe, Skype and many more. 76 Ferdi is your messaging app / former Emperor of Austria and combines chat
77 & messaging services into one application. Ferdi currently supports Slack,
78 WhatsApp, WeChat, HipChat, Facebook Messenger, Telegram, Google
79 Hangouts,GroupMe, Skype and many more.
70 </WithStoreInfobox> 80 </WithStoreInfobox>
71 )) 81 ))
72 .add('Secondary', () => ( 82 .add('Secondary', () => (
@@ -125,9 +135,10 @@ storiesOf('Infobox')
125 </WithStoreInfobox> 135 </WithStoreInfobox>
126 )) 136 ))
127 .add('With className', () => ( 137 .add('With className', () => (
128 <WithStoreInfobox store={createStore({ 138 <WithStoreInfobox
129 className: 'franz-is-awesome', 139 store={createStore({
130 })} 140 className: 'franz-is-awesome',
141 })}
131 > 142 >
132 Welcome to the world of tomorrow 143 Welcome to the world of tomorrow
133 </WithStoreInfobox> 144 </WithStoreInfobox>
diff --git a/uidev/src/stories/loader.stories.tsx b/uidev/src/stories/loader.stories.tsx
index ad38dffe8..bbe4d3421 100644
--- a/uidev/src/stories/loader.stories.tsx
+++ b/uidev/src/stories/loader.stories.tsx
@@ -1,9 +1,8 @@
1import { Loader } from '@meetfranz/ui'; 1import { Loader } from '@meetfranz/ui';
2import { storiesOf } from '../stores/stories'; 2import { storiesOf } from '../stores/stories';
3 3
4storiesOf('Loader') 4storiesOf('Loader').add('Basic', () => (
5 .add('Basic', () => ( 5 <>
6 <> 6 <Loader />
7 <Loader /> 7 </>
8 </> 8));
9 ));
diff --git a/uidev/src/withTheme/index.tsx b/uidev/src/withTheme/index.tsx
index 5184ff340..0e39b4810 100644
--- a/uidev/src/withTheme/index.tsx
+++ b/uidev/src/withTheme/index.tsx
@@ -28,14 +28,22 @@ const styles = (theme: Theme) => ({
28 }, 28 },
29}); 29});
30 30
31const Container = injectSheet(styles)(({ name, classes, story }: { name: string, classes: Classes, story: React.ReactNode }) => ( 31const Container = injectSheet(styles)(
32 <article> 32 ({
33 <h1 className={classes.title}>{name}</h1> 33 name,
34 <div className={classes.container}> 34 classes,
35 {story} 35 story,
36 </div> 36 }: {
37 </article> 37 name: string;
38)); 38 classes: Classes;
39 story: React.ReactNode;
40 }) => (
41 <article>
42 <h1 className={classes.title}>{name}</h1>
43 <div className={classes.container}>{story}</div>
44 </article>
45 ),
46);
39 47
40export const WithTheme = ({ children }: { children: React.ReactChild }) => ( 48export const WithTheme = ({ children }: { children: React.ReactChild }) => (
41 <> 49 <>
@@ -43,6 +51,6 @@ export const WithTheme = ({ children }: { children: React.ReactChild }) => (
43 <ThemeProvider key={key} theme={theme.variables}> 51 <ThemeProvider key={key} theme={theme.variables}>
44 <Container story={children} name={theme.name} /> 52 <Container story={children} name={theme.name} />
45 </ThemeProvider> 53 </ThemeProvider>
46 ))} 54 ))}
47 </> 55 </>
48 ); 56);
diff --git a/uidev/webpack.config.js b/uidev/webpack.config.js
index 74ea870ef..faabac784 100644
--- a/uidev/webpack.config.js
+++ b/uidev/webpack.config.js
@@ -4,11 +4,13 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
4module.exports = { 4module.exports = {
5 entry: './src/index.tsx', 5 entry: './src/index.tsx',
6 module: { 6 module: {
7 rules: [{ 7 rules: [
8 test: /\.tsx?$/, 8 {
9 use: 'ts-loader', 9 test: /\.tsx?$/,
10 exclude: /node_modules/, 10 use: 'ts-loader',
11 }], 11 exclude: /node_modules/,
12 },
13 ],
12 }, 14 },
13 resolve: { 15 resolve: {
14 extensions: ['.tsx', '.ts', '.js'], 16 extensions: ['.tsx', '.ts', '.js'],