From bc76d19c6f5687dd18c96db249e0abe7ad79a673 Mon Sep 17 00:00:00 2001 From: Vijay A Date: Sun, 15 Aug 2021 17:15:09 +0530 Subject: chore: typescript conversion of some minor utilities Also removed 'targz' unused package from runtime. --- src/helpers/userAgent-helpers.ts | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/helpers/userAgent-helpers.ts (limited to 'src/helpers/userAgent-helpers.ts') diff --git a/src/helpers/userAgent-helpers.ts b/src/helpers/userAgent-helpers.ts new file mode 100644 index 000000000..73c8bfd03 --- /dev/null +++ b/src/helpers/userAgent-helpers.ts @@ -0,0 +1,41 @@ +import os from 'os'; +import macosVersion from 'macos-version'; +import { chrome } from 'useragent-generator'; +import { + chromeVersion, isMac, isWindows, is64Bit, osArch, osRelease, +} from '../environment'; + +function macOS() { + const version = macosVersion() || ''; + let cpuName = os.cpus()[0].model.split(' ')[0]; + if (cpuName && cpuName.match(/\(/)) { + cpuName = cpuName.split('(')[0]; + } + return `Macintosh; ${cpuName} Mac OS X ${version.replace(/\./g, '_')}`; +} + +function windows() { + const version = osRelease; + const [majorVersion, minorVersion] = version.split('.'); + const archString = is64Bit ? 'Win64' : 'Win32'; + return `Windows NT ${majorVersion}.${minorVersion}; ${archString}; ${osArch}`; +} + +function linux() { + const archString = is64Bit ? 'x86_64' : osArch; + return `X11; Ubuntu; Linux ${archString}`; +} + +export default function userAgent() { + let platformString = ''; + + if (isMac) { + platformString = macOS(); + } else if (isWindows) { + platformString = windows(); + } else { + platformString = linux(); + } + + return chrome({ os: platformString, version: chromeVersion }); +} -- cgit v1.2.3-54-g00ecf From 26a9dba22236bc22a7612107630282cfe02d20e0 Mon Sep 17 00:00:00 2001 From: Markus Hatvan Date: Mon, 16 Aug 2021 18:10:23 +0200 Subject: chore: update outdated node_modules (#1807) - upgrade 'uuid', '@types/uuid', 'macos-version', 'normalize-url' and 'os-name' dependencies to latest - updated 'macos-version' imports to named imports --- package-lock.json | 147 +++++++++++------ package.json | 10 +- src/electron/macOSPermissions.js | 9 +- src/helpers/userAgent-helpers.ts | 11 +- .../app/Controllers/Http/ServiceController.js | 6 +- .../app/Controllers/Http/UserController.js | 178 +++++++++++---------- .../app/Controllers/Http/WorkspaceController.js | 57 +++---- src/lib/Tray.js | 55 +++++-- src/webview/notifications.js | 19 ++- uidev/src/stories/input.stories.tsx | 66 ++------ uidev/src/stories/select.stories.tsx | 31 +--- uidev/src/stories/textarea.stories.tsx | 25 +-- uidev/src/stories/toggle.stories.tsx | 46 +++--- 13 files changed, 346 insertions(+), 314 deletions(-) (limited to 'src/helpers/userAgent-helpers.ts') diff --git a/package-lock.json b/package-lock.json index 8f302a8fe..4adabbe9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -104,6 +104,13 @@ "ms": "^2.1.1", "resetable": "^1.0.3", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "@adonisjs/bodyparser": { @@ -290,6 +297,11 @@ "jsonfile": "^4.0.0", "universalify": "^0.1.0" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -304,6 +316,13 @@ "node-csp": "^1.0.1", "node-guard": "^1.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "@adonisjs/validator": { @@ -6733,9 +6752,9 @@ } }, "@types/uuid": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.9.tgz", - "integrity": "sha512-XDwyIlt/47l2kWLTzw/mtrpLdB+GPSskR2n/PIcPn+VYhVO77rGhRncIR5GPU0KRzXuqkDO+J5qqrG0Y8P6jzQ==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==", "dev": true }, "@types/verror": { @@ -13939,18 +13958,18 @@ } }, "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "dependencies": { @@ -13965,12 +13984,9 @@ } }, "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "path-key": { "version": "3.1.1", @@ -16672,9 +16688,9 @@ } }, "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "humanize-ms": { "version": "1.2.1", @@ -19901,6 +19917,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -20520,23 +20541,16 @@ } }, "macos-release": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", - "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.0.0.tgz", + "integrity": "sha512-y+uUjBt2D1YK0w8k0D19r6O8BYrCkSokWMaTJPvE68RjUOVYQmPXUD7Y4wGphM+/DEJNU+e46hl1lXOzPpvo+w==" }, "macos-version": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-5.2.1.tgz", - "integrity": "sha512-OHJU8nTNxHYL1FQhD+nZawWgXKXAqDGr4kluLtaqKO4au3cR41y1mKuVShOU5U4rOYiuPanljq6oFGmV2B9DFA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/macos-version/-/macos-version-6.0.0.tgz", + "integrity": "sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==", "requires": { - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } + "semver": "^7.3.5" } }, "macroable": { @@ -22338,9 +22352,9 @@ "dev": true }, "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-7.0.1.tgz", + "integrity": "sha512-WjLnBQVhYX5XRIectq7CEXgu7O13OB1vsj3rkVItD4c48G/JRD5dohJ1R5vVwZ5wI2/SJDNHfpdQ0Xsqbr1dhQ==" }, "normalize-version": { "version": "1.0.5", @@ -22970,12 +22984,12 @@ } }, "os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.0.tgz", + "integrity": "sha512-2NNINSnda99omAve/ayz0vIOwwS7fC1jNlutqxAcAsS8NXOGU3Rdku1lCm00fDNFdOMLd1YCVTNnfUsVs5471Q==", "requires": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" + "macos-release": "^3.0.0", + "windows-release": "^5.0.0" } }, "os-tmpdir": { @@ -23409,6 +23423,14 @@ "normalize-url": "^6.1.0", "parse-path": "^4.0.0", "protocols": "^1.4.0" + }, + "dependencies": { + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + } } }, "parse5": { @@ -25557,6 +25579,11 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -27522,6 +27549,12 @@ "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -27533,6 +27566,14 @@ "requires": { "temp-dir": "^2.0.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } } }, "terminal-link": { @@ -28790,9 +28831,9 @@ "dev": true }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -29806,6 +29847,12 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true } } }, @@ -29968,11 +30015,11 @@ } }, "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.0.tgz", + "integrity": "sha512-oiBC+rh4zgwD2E1WvsdcuaBlcNtO+bfoq4GT7sR36J8X+AZNJuXXf+5BjLflDqhEZty25SahBMYSEBhg/V8ikg==", "requires": { - "execa": "^4.0.2" + "execa": "^5.1.1" } }, "winreg": { diff --git a/package.json b/package.json index 7aa100668..3a448bae7 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "jss": "10.7.1", "lodash": "4.17.21", "macos-notification-state": "1.3.5", - "macos-version": "5.2.1", + "macos-version": "6.0.0", "marked": "0.7.0", "mime-types": "2.1.32", "minimist": "1.2.5", @@ -103,8 +103,8 @@ "ms": "2.1.3", "node-fetch": "2.6.1", "node-mac-permissions": "2.2.0", - "normalize-url": "6.1.0", - "os-name": "4.0.1", + "normalize-url": "7.0.1", + "os-name": "5.0.0", "pretty-bytes": "5.6.0", "prop-types": "15.7.2", "react": "16.14.0", @@ -126,7 +126,7 @@ "tar": "4.4.15", "tslib": "2.3.1", "useragent-generator": "1.1.1-amkt-22079-finish.0", - "uuid": "3.3.3", + "uuid": "8.3.2", "validator": "11.0.0", "ws": "7.4.6" }, @@ -155,7 +155,7 @@ "@types/react-dom": "16.9.13", "@types/route-parser": "0.1.3", "@types/tar": "4.0.5", - "@types/uuid": "3.4.9", + "@types/uuid": "8.3.1", "@typescript-eslint/eslint-plugin": "4.29.1", "@typescript-eslint/parser": "4.29.1", "all-contributors-cli": "6.20.0", diff --git a/src/electron/macOSPermissions.js b/src/electron/macOSPermissions.js index 887af2903..fc2f9b72d 100644 --- a/src/electron/macOSPermissions.js +++ b/src/electron/macOSPermissions.js @@ -1,14 +1,17 @@ import { systemPreferences, dialog } from 'electron'; import { pathExistsSync, mkdirSync, writeFileSync } from 'fs-extra'; -import macosVersion from 'macos-version'; +import { isMacOSVersionGreaterThanOrEqualTo } from 'macos-version'; import { dirname } from 'path'; import { askForScreenCaptureAccess } from 'node-mac-permissions'; import { userDataPath } from '../environment'; const debug = require('debug')('Ferdi:macOSPermissions'); -const isExplicitScreenCapturePermissionReqd = macosVersion.isGreaterThanOrEqualTo('10.15'); -debug(`Should check explicitly for screen-capture permissions: ${isExplicitScreenCapturePermissionReqd}`); +const isExplicitScreenCapturePermissionReqd = + isMacOSVersionGreaterThanOrEqualTo('10.15'); +debug( + `Should check explicitly for screen-capture permissions: ${isExplicitScreenCapturePermissionReqd}`, +); const filePath = userDataPath('.has-app-requested-screen-capture-permissions'); diff --git a/src/helpers/userAgent-helpers.ts b/src/helpers/userAgent-helpers.ts index 73c8bfd03..dea49ad7e 100644 --- a/src/helpers/userAgent-helpers.ts +++ b/src/helpers/userAgent-helpers.ts @@ -1,12 +1,17 @@ import os from 'os'; -import macosVersion from 'macos-version'; +import { macOSVersion } from 'macos-version'; import { chrome } from 'useragent-generator'; import { - chromeVersion, isMac, isWindows, is64Bit, osArch, osRelease, + chromeVersion, + isMac, + isWindows, + is64Bit, + osArch, + osRelease, } from '../environment'; function macOS() { - const version = macosVersion() || ''; + const version = macOSVersion() || ''; let cpuName = os.cpus()[0].model.split(' ')[0]; if (cpuName && cpuName.match(/\(/)) { cpuName = cpuName.split('(')[0]; diff --git a/src/internal-server/app/Controllers/Http/ServiceController.js b/src/internal-server/app/Controllers/Http/ServiceController.js index c76a287f7..dea5a888e 100644 --- a/src/internal-server/app/Controllers/Http/ServiceController.js +++ b/src/internal-server/app/Controllers/Http/ServiceController.js @@ -2,7 +2,7 @@ const Service = use('App/Models/Service'); const { validateAll } = use('Validator'); const Env = use('Env'); -const uuid = require('uuid/v4'); +const { v4: uuid } = require('uuid'); const path = require('path'); const fs = require('fs-extra'); const { LOCAL_HOSTNAME } = require('../../../../config'); @@ -156,9 +156,7 @@ class ServiceController { id, name: service.name, ...newSettings, - iconUrl: `http://${hostname}:${port}/v1/icon/${ - newSettings.iconId - }`, + iconUrl: `http://${hostname}:${port}/v1/icon/${newSettings.iconId}`, userId: 1, }, status: ['updated'], diff --git a/src/internal-server/app/Controllers/Http/UserController.js b/src/internal-server/app/Controllers/Http/UserController.js index a3ad736fa..e387e39c4 100644 --- a/src/internal-server/app/Controllers/Http/UserController.js +++ b/src/internal-server/app/Controllers/Http/UserController.js @@ -1,41 +1,38 @@ const User = use('App/Models/User'); const Service = use('App/Models/Service'); const Workspace = use('App/Models/Workspace'); -const { - validateAll, -} = use('Validator'); +const { validateAll } = use('Validator'); const btoa = require('btoa'); const fetch = require('node-fetch'); -const uuid = require('uuid/v4'); +const { v4: uuid } = require('uuid'); const crypto = require('crypto'); const { DEFAULT_APP_SETTINGS } = require('../../../../environment'); -const apiRequest = (url, route, method, auth) => new Promise((resolve, reject) => { - const base = `${url}/v1/`; - const user = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36'; +const apiRequest = (url, route, method, auth) => + new Promise((resolve, reject) => { + const base = `${url}/v1/`; + const user = + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36'; - try { - fetch(base + route, { - method, - headers: { - Authorization: `Bearer ${auth}`, - 'User-Agent': user, - }, - }) - .then(data => data.json()) - .then(json => resolve(json)); - } catch (e) { - reject(); - } -}); + try { + fetch(base + route, { + method, + headers: { + Authorization: `Bearer ${auth}`, + 'User-Agent': user, + }, + }) + .then(data => data.json()) + .then(json => resolve(json)); + } catch (e) { + reject(); + } + }); class UserController { // Register a new user - async signup({ - request, - response, - }) { + async signup({ request, response }) { // Validate user input const validation = await validateAll(request.all(), { firstname: 'required', @@ -52,15 +49,13 @@ class UserController { return response.send({ message: 'Successfully created account', - token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M', + token: + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M', }); } // Login using an existing user - async login({ - request, - response, - }) { + async login({ request, response }) { if (!request.header('Authorization')) { return response.status(401).send({ message: 'Please provide authorization', @@ -70,17 +65,19 @@ class UserController { return response.send({ message: 'Successfully logged in', - token: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M', + token: + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJGZXJkaSBJbnRlcm5hbCBTZXJ2ZXIiLCJpYXQiOjE1NzEwNDAyMTUsImV4cCI6MjUzMzk1NDE3ODQ0LCJhdWQiOiJnZXRmZXJkaS5jb20iLCJzdWIiOiJmZXJkaUBsb2NhbGhvc3QiLCJ1c2VySWQiOiIxIn0.9_TWFGp6HROv8Yg82Rt6i1-95jqWym40a-HmgrdMC6M', }); } // Return information about the current user - async me({ - response, - }) { + async me({ response }) { const user = await User.find(1); - const settings = typeof user.settings === 'string' ? JSON.parse(user.settings) : user.settings; + const settings = + typeof user.settings === 'string' + ? JSON.parse(user.settings) + : user.settings; return response.send({ accountType: 'individual', @@ -94,14 +91,11 @@ class UserController { isSubscriptionOwner: true, lastname: 'Application', locale: DEFAULT_APP_SETTINGS.fallbackLocale, - ...settings || {}, + ...(settings || {}), }); } - async updateMe({ - request, - response, - }) { + async updateMe({ request, response }) { const user = await User.find(1); let settings = user.settings || {}; @@ -132,16 +126,11 @@ class UserController { locale: DEFAULT_APP_SETTINGS.fallbackLocale, ...newSettings, }, - status: [ - 'data-updated', - ], + status: ['data-updated'], }); } - async import({ - request, - response, - }) { + async import({ request, response }) { // Validate user input const validation = await validateAll(request.all(), { email: 'required|email', @@ -149,7 +138,8 @@ class UserController { server: 'required', }); if (validation.fails()) { - let errorMessage = 'There was an error while trying to import your account:\n'; + let errorMessage = + 'There was an error while trying to import your account:\n'; for (const message of validation.messages()) { if (message.validation === 'required') { errorMessage += `- Please make sure to supply your ${message.field}\n`; @@ -162,16 +152,16 @@ class UserController { return response.status(401).send(errorMessage); } - const { - email, - password, - server, - } = request.all(); + const { email, password, server } = request.all(); - const hashedPassword = crypto.createHash('sha256').update(password).digest('base64'); + const hashedPassword = crypto + .createHash('sha256') + .update(password) + .digest('base64'); const base = `${server}/v1/`; - const userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36'; + const userAgent = + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Ferdi/5.3.0-beta.1 Chrome/69.0.3497.128 Electron/4.2.4 Safari/537.36'; // Try to get an authentication token let token; @@ -188,7 +178,8 @@ class UserController { const content = await rawResponse.json(); if (!content.message || content.message !== 'Successfully logged in') { - const errorMessage = 'Could not login into Franz with your supplied credentials. Please check and try again'; + const errorMessage = + 'Could not login into Franz with your supplied credentials. Please check and try again'; return response.status(401).send(errorMessage); } @@ -210,7 +201,8 @@ class UserController { return response.status(401).send(errorMessage); } if (!userInf) { - const errorMessage = 'Could not get your user info from Franz. Please check your credentials or try again later'; + const errorMessage = + 'Could not get your user info from Franz. Please check your credentials or try again later'; return response.status(401).send(errorMessage); } @@ -225,9 +217,14 @@ class UserController { let serviceId; do { serviceId = uuid(); - } while ((await Service.query().where('serviceId', serviceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop - - await Service.create({ // eslint-disable-line no-await-in-loop + } while ( + // eslint-disable-next-line no-await-in-loop + (await Service.query().where('serviceId', serviceId).fetch()).rows + .length > 0 + ); + + // eslint-disable-next-line no-await-in-loop + await Service.create({ serviceId, name: service.name, recipeId: service.recipeId, @@ -249,11 +246,18 @@ class UserController { let workspaceId; do { workspaceId = uuid(); - } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop - - const services = workspace.services.map(service => serviceIdTranslation[service]); - - await Workspace.create({ // eslint-disable-line no-await-in-loop + } while ( + // eslint-disable-next-line no-await-in-loop + (await Workspace.query().where('workspaceId', workspaceId).fetch()) + .rows.length > 0 + ); + + const services = workspace.services.map( + service => serviceIdTranslation[service], + ); + + // eslint-disable-next-line no-await-in-loop + await Workspace.create({ workspaceId, name: workspace.name, order: workspace.order, @@ -266,7 +270,9 @@ class UserController { return response.status(401).send(errorMessage); } - return response.send('Your account has been imported. You can now use your Franz account in Ferdi.'); + return response.send( + 'Your account has been imported. You can now use your Franz account in Ferdi.', + ); } // Account import/export @@ -291,10 +297,7 @@ class UserController { .send(exportData); } - async importFerdi({ - request, - response, - }) { + async importFerdi({ request, response }) { const validation = await validateAll(request.all(), { file: 'required', }); @@ -306,7 +309,9 @@ class UserController { try { file = JSON.parse(request.input('file')); } catch (e) { - return response.send('Could not import: Invalid file, could not read file'); + return response.send( + 'Could not import: Invalid file, could not read file', + ); } if (!file || !file.services || !file.workspaces) { @@ -322,9 +327,14 @@ class UserController { let serviceId; do { serviceId = uuid(); - } while ((await Service.query().where('serviceId', serviceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop - - await Service.create({ // eslint-disable-line no-await-in-loop + } while ( + // eslint-disable-next-line no-await-in-loop + (await Service.query().where('serviceId', serviceId).fetch()).rows + .length > 0 + ); + + // eslint-disable-next-line no-await-in-loop + await Service.create({ serviceId, name: service.name, recipeId: service.recipeId, @@ -344,13 +354,19 @@ class UserController { let workspaceId; do { workspaceId = uuid(); - } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop - - const services = (workspace.services && typeof (workspace.services) === 'object') ? - workspace.services.map((service) => serviceIdTranslation[service]) : - []; - - await Workspace.create({ // eslint-disable-line no-await-in-loop + } while ( + // eslint-disable-next-line no-await-in-loop + (await Workspace.query().where('workspaceId', workspaceId).fetch()) + .rows.length > 0 + ); + + const services = + workspace.services && typeof workspace.services === 'object' + ? workspace.services.map(service => serviceIdTranslation[service]) + : []; + + // eslint-disable-next-line no-await-in-loop + await Workspace.create({ workspaceId, name: workspace.name, order: workspace.order, diff --git a/src/internal-server/app/Controllers/Http/WorkspaceController.js b/src/internal-server/app/Controllers/Http/WorkspaceController.js index 4189fbcdd..f1a5ddf2b 100644 --- a/src/internal-server/app/Controllers/Http/WorkspaceController.js +++ b/src/internal-server/app/Controllers/Http/WorkspaceController.js @@ -1,16 +1,11 @@ const Workspace = use('App/Models/Workspace'); -const { - validateAll, -} = use('Validator'); +const { validateAll } = use('Validator'); -const uuid = require('uuid/v4'); +const { v4: uuid } = require('uuid'); class WorkspaceController { // Create a new workspace for user - async create({ - request, - response, - }) { + async create({ request, response }) { // Validate user input const validation = await validateAll(request.all(), { name: 'required', @@ -29,7 +24,10 @@ class WorkspaceController { let workspaceId; do { workspaceId = uuid(); - } while ((await Workspace.query().where('workspaceId', workspaceId).fetch()).rows.length > 0); // eslint-disable-line no-await-in-loop + } while ( + (await Workspace.query().where('workspaceId', workspaceId).fetch()).rows + .length > 0 + ); // eslint-disable-line no-await-in-loop const order = (await Workspace.all()).rows.length; @@ -50,11 +48,7 @@ class WorkspaceController { }); } - async edit({ - request, - response, - params, - }) { + async edit({ request, response, params }) { // Validate user input const validation = await validateAll(request.all(), { name: 'required', @@ -69,20 +63,19 @@ class WorkspaceController { } const data = request.all(); - const { - id, - } = params; + const { id } = params; // Update data in database - await (Workspace.query() - .where('workspaceId', id)).update({ - name: data.name, - services: JSON.stringify(data.services), - }); + await Workspace.query() + .where('workspaceId', id) + .update({ + name: data.name, + services: JSON.stringify(data.services), + }); // Get updated row - const workspace = (await Workspace.query() - .where('workspaceId', id).fetch()).rows[0]; + const workspace = (await Workspace.query().where('workspaceId', id).fetch()) + .rows[0]; return response.send({ id: workspace.workspaceId, @@ -111,13 +104,10 @@ class WorkspaceController { }); } - const { - id, - } = params; + const { id } = params; // Update data in database - await (Workspace.query() - .where('workspaceId', id)).delete(); + await Workspace.query().where('workspaceId', id).delete(); return response.send({ message: 'Successfully deleted workspace', @@ -125,9 +115,7 @@ class WorkspaceController { } // List all workspaces a user has created - async list({ - response, - }) { + async list({ response }) { const workspaces = (await Workspace.all()).rows; // Convert to array with all data Franz wants let workspacesArray = []; @@ -136,7 +124,10 @@ class WorkspaceController { id: workspace.workspaceId, name: workspace.name, order: workspace.order, - services: typeof workspace.services === 'string' ? JSON.parse(workspace.services) : workspace.services, + services: + typeof workspace.services === 'string' + ? JSON.parse(workspace.services) + : workspace.services, userId: 1, })); } diff --git a/src/lib/Tray.js b/src/lib/Tray.js index f5970f7e7..c629e212d 100644 --- a/src/lib/Tray.js +++ b/src/lib/Tray.js @@ -1,8 +1,14 @@ import { - app, Menu, nativeImage, nativeTheme, systemPreferences, Tray, ipcMain, + app, + Menu, + nativeImage, + nativeTheme, + systemPreferences, + Tray, + ipcMain, } from 'electron'; import { join } from 'path'; -import macosVersion from 'macos-version'; +import { isMacOSVersionGreaterThanOrEqualTo } from 'macos-version'; import { isMac, isWindows, isLinux } from '../environment'; const FILE_EXTENSION = isWindows ? 'ico' : 'png'; @@ -64,7 +70,9 @@ export default class TrayIcon { if (appSettings.type === 'app') { const { isAppMuted } = appSettings.data; - this.trayMenuTemplate[1].label = isAppMuted ? 'Enable Notifications && Audio' : 'Disable Notifications && Audio'; + this.trayMenuTemplate[1].label = isAppMuted + ? 'Enable Notifications && Audio' + : 'Disable Notifications && Audio'; this.trayMenu = Menu.buildFromTemplate(this.trayMenuTemplate); if (isLinux) { this.trayIcon.setContextMenu(this.trayMenu); @@ -107,9 +115,12 @@ export default class TrayIcon { } if (isMac) { - this.themeChangeSubscriberId = systemPreferences.subscribeNotification('AppleInterfaceThemeChangedNotification', () => { - this._refreshIcon(); - }); + this.themeChangeSubscriberId = systemPreferences.subscribeNotification( + 'AppleInterfaceThemeChangedNotification', + () => { + this._refreshIcon(); + }, + ); } } @@ -149,7 +160,8 @@ export default class TrayIcon { _getAssetFromIndicator(indicator) { if (indicator === '•') { return INDICATOR_TRAY_INDIRECT; - } if (indicator !== 0) { + } + if (indicator !== 0) { return INDICATOR_TRAY_UNREAD; } return INDICATOR_TRAY_PLAIN; @@ -158,11 +170,16 @@ export default class TrayIcon { _refreshIcon() { if (!this.trayIcon) return; - this.trayIcon.setImage(this._getAsset('tray', this._getAssetFromIndicator(this.indicator))); + this.trayIcon.setImage( + this._getAsset('tray', this._getAssetFromIndicator(this.indicator)), + ); if (isMac) { this.trayIcon.setPressedImage( - this._getAsset('tray', `${this._getAssetFromIndicator(this.indicator)}-active`), + this._getAsset( + 'tray', + `${this._getAssetFromIndicator(this.indicator)}-active`, + ), ); } } @@ -170,12 +187,24 @@ export default class TrayIcon { _getAsset(type, asset) { let { platform } = process; - if (isMac && (nativeTheme.shouldUseDarkColors || macosVersion.isGreaterThanOrEqualTo('11'))) { + if ( + isMac && + (nativeTheme.shouldUseDarkColors || + isMacOSVersionGreaterThanOrEqualTo('11')) + ) { platform = `${platform}-dark`; } - return nativeImage.createFromPath(join( - __dirname, '..', 'assets', 'images', type, platform, `${asset}.${FILE_EXTENSION}`, - )); + return nativeImage.createFromPath( + join( + __dirname, + '..', + 'assets', + 'images', + type, + platform, + `${asset}.${FILE_EXTENSION}`, + ), + ); } } diff --git a/src/webview/notifications.js b/src/webview/notifications.js index 205a3220c..73cdb89d4 100644 --- a/src/webview/notifications.js +++ b/src/webview/notifications.js @@ -1,22 +1,25 @@ import { ipcRenderer } from 'electron'; -import uuidV1 from 'uuid/v1'; +import { v1 as uuidV1 } from 'uuid'; const debug = require('debug')('Ferdi:Notifications'); export class NotificationsHandler { - onNotify = (data) => data; + onNotify = data => data; displayNotification(title, options) { - return new Promise((resolve) => { + return new Promise(resolve => { debug('New notification', title, options); const notificationId = uuidV1(); - ipcRenderer.sendToHost('notification', this.onNotify({ - title, - options, - notificationId, - })); + ipcRenderer.sendToHost( + 'notification', + this.onNotify({ + title, + options, + notificationId, + }), + ); ipcRenderer.once(`notification-onclick:${notificationId}`, () => { resolve(); diff --git a/uidev/src/stories/input.stories.tsx b/uidev/src/stories/input.stories.tsx index 889539266..4136cfd4d 100644 --- a/uidev/src/stories/input.stories.tsx +++ b/uidev/src/stories/input.stories.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import uuid from 'uuid/v4'; +import { v4 as uuid } from 'uuid'; import { Input } from '@meetfranz/forms'; import { storiesOf } from '../stores/stories'; @@ -10,7 +10,8 @@ const defaultProps = () => { label: 'Label', id: `test-${id}`, name: `test-${id}`, - onChange: (e: React.ChangeEvent) => console.log('changed event', e), + onChange: (e: React.ChangeEvent) => + console.log('changed event', e), }; }; @@ -21,44 +22,23 @@ const defaultPasswordProps = () => { id: `test-${id}`, name: `test-${id}`, type: 'password', - onChange: (e: React.ChangeEvent) => console.log('changed event', e), + onChange: (e: React.ChangeEvent) => + console.log('changed event', e), }; }; storiesOf('Input') .add('Basic', () => ( - - )) - .add('Without Label', () => ( - - )) - .add('Disabled', () => ( - - )) - .add('With prefix', () => ( - + )) + .add('Without Label', () => ) + .add('Disabled', () => ) + .add('With prefix', () => ) .add('With suffix', () => ( - + )) .add('With pre-suffix', () => ( - + )) .add('With error', () => ( )) .add('Type number with min & max', () => ( - + )); storiesOf('Password') - .add('Basic', () => ( - - )) + .add('Basic', () => ) .add('Show password toggle', () => ( - + )) .add('Score password', () => ( - + )) .add('Score password with error', () => ( { }, actionText: 'Select country', // defaultValue: 'AT', - onChange: (e: React.ChangeEvent) => console.log('changed event', e), + onChange: (e: React.ChangeEvent) => + console.log('changed event', e), }; }; storiesOf('Select') - .add('Basic', () => ( - ) .add('With preselection', () => ( - - )) - .add('Disabled', () => ( - )) + .add('With search', () => ) .add('With error', () => (