aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLibravatar MCMXC <16797721+mcmxcdev@users.noreply.github.com>2023-07-30 10:55:59 -0600
committerLibravatar Vijay Aravamudhan <vraravam@users.noreply.github.com>2023-07-30 23:57:51 +0000
commit080d8b05297f3f5afcf33354a40a5201697b1df5 (patch)
tree35180bd3cb9fcd137feca3fe169032cbbb469463 /src
parentrefactor: various improvements (#1296) (diff)
downloadferdium-app-080d8b05297f3f5afcf33354a40a5201697b1df5.tar.gz
ferdium-app-080d8b05297f3f5afcf33354a40a5201697b1df5.tar.zst
ferdium-app-080d8b05297f3f5afcf33354a40a5201697b1df5.zip
refactor: more lint improvements
- set parserOptions.ecmaVersion to latest and env to es2024 in eslint config - install missing types libraries - install eslint-plugin-sonar - enable eslint-plugin-sonar recommended rules and declare jsx-runtime for react in eslint config - clean up disabled lint rules which don't inflict problems anymore - disable various lint issues and fix others
Diffstat (limited to 'src')
-rw-r--r--src/api/UserApi.ts2
-rw-r--r--src/api/server/LocalApi.ts2
-rw-r--r--src/api/server/ServerApi.ts2
-rw-r--r--src/components/auth/Welcome.tsx1
-rw-r--r--src/components/services/content/ServiceView.tsx2
-rw-r--r--src/components/services/content/ServiceWebview.tsx2
-rw-r--r--src/components/settings/settings/EditSettingsForm.tsx4
-rw-r--r--src/components/ui/Tabs/TabItem.tsx4
-rw-r--r--src/components/ui/button/index.tsx1
-rw-r--r--src/components/ui/select/index.tsx38
-rw-r--r--src/electron/exception.ts1
-rw-r--r--src/electron/ipc-api/appIndicator.ts2
-rw-r--r--src/electron/ipc-api/download.ts2
-rw-r--r--src/electron/ipc-api/localServer.ts4
-rw-r--r--src/electron/macOSPermissions.ts2
-rw-r--r--src/environment-remote.ts2
-rw-r--r--src/environment.ts2
-rw-r--r--src/features/appearance/index.ts7
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.tsx1
-rw-r--r--src/features/workspaces/containers/EditWorkspaceScreen.tsx3
-rw-r--r--src/helpers/asar-helpers.ts2
-rw-r--r--src/helpers/password-helpers.ts2
-rw-r--r--src/helpers/recipe-helpers.ts2
-rw-r--r--src/helpers/url-helpers.ts2
-rw-r--r--src/helpers/userAgent-helpers.ts3
-rw-r--r--src/index.ts4
-rw-r--r--src/internal-server/app/Controllers/Http/ImageController.js2
-rw-r--r--src/internal-server/app/Controllers/Http/UserController.js8
-rw-r--r--src/internal-server/app/Controllers/Http/WorkspaceController.js7
-rw-r--r--src/internal-server/app/ImageHelper.js2
-rw-r--r--src/internal-server/database/factory.js1
-rw-r--r--src/internal-server/start.ts2
-rw-r--r--src/internal-server/start/routes.js2
-rw-r--r--src/internal-server/test.ts2
-rw-r--r--src/jsUtils.ts6
-rw-r--r--src/lib/Menu.ts2
-rw-r--r--src/lib/Tray.ts2
-rw-r--r--src/models/Recipe.ts2
-rw-r--r--src/models/Service.ts2
-rw-r--r--src/preload-safe-debug.ts4
-rw-r--r--src/stores/AppStore.ts2
-rw-r--r--src/stores/ServicesStore.ts2
-rw-r--r--src/webview/darkmode.ts2
-rw-r--r--src/webview/recipe.ts4
44 files changed, 77 insertions, 76 deletions
diff --git a/src/api/UserApi.ts b/src/api/UserApi.ts
index 31c8acead..2b319207a 100644
--- a/src/api/UserApi.ts
+++ b/src/api/UserApi.ts
@@ -1,4 +1,4 @@
1import { BinaryLike } from 'crypto'; 1import { BinaryLike } from 'node:crypto';
2import { hash } from '../helpers/password-helpers'; 2import { hash } from '../helpers/password-helpers';
3 3
4export default class UserApi { 4export default class UserApi {
diff --git a/src/api/server/LocalApi.ts b/src/api/server/LocalApi.ts
index a292bc42d..6764816f9 100644
--- a/src/api/server/LocalApi.ts
+++ b/src/api/server/LocalApi.ts
@@ -1,4 +1,4 @@
1import { ExecException } from 'child_process'; 1import { ExecException } from 'node:child_process';
2import { ipcRenderer } from 'electron'; 2import { ipcRenderer } from 'electron';
3import fastFolderSize from 'fast-folder-size'; 3import fastFolderSize from 'fast-folder-size';
4 4
diff --git a/src/api/server/ServerApi.ts b/src/api/server/ServerApi.ts
index de8e0a85c..7b17fcdcd 100644
--- a/src/api/server/ServerApi.ts
+++ b/src/api/server/ServerApi.ts
@@ -1,6 +1,6 @@
1/* eslint-disable import/no-import-module-exports */ 1/* eslint-disable import/no-import-module-exports */
2/* eslint-disable global-require */ 2/* eslint-disable global-require */
3import { join } from 'path'; 3import { join } from 'node:path';
4import tar from 'tar'; 4import tar from 'tar';
5import { 5import {
6 readdirSync, 6 readdirSync,
diff --git a/src/components/auth/Welcome.tsx b/src/components/auth/Welcome.tsx
index 047512ea4..259e3c335 100644
--- a/src/components/auth/Welcome.tsx
+++ b/src/components/auth/Welcome.tsx
@@ -91,6 +91,7 @@ class Welcome extends Component<IProps> {
91 className="settings__hr-sections" 91 className="settings__hr-sections"
92 style={{ marginTop: 24, marginBottom: 24, borderStyle: 'solid' }} 92 style={{ marginTop: 24, marginBottom: 24, borderStyle: 'solid' }}
93 /> 93 />
94 {/* eslint-disable-next-line react/button-has-type */}
94 <button 95 <button
95 className="button" 96 className="button"
96 onClick={this.useLocalServer.bind(this)} 97 onClick={this.useLocalServer.bind(this)}
diff --git a/src/components/services/content/ServiceView.tsx b/src/components/services/content/ServiceView.tsx
index 19dcdd07a..37dcafbe4 100644
--- a/src/components/services/content/ServiceView.tsx
+++ b/src/components/services/content/ServiceView.tsx
@@ -136,6 +136,7 @@ class ServiceView extends Component<IProps, IState> {
136 </> 136 </>
137 )} 137 )}
138 {service.isEnabled ? ( 138 {service.isEnabled ? (
139 // eslint-disable-next-line react/jsx-no-useless-fragment
139 <> 140 <>
140 {service.isHibernating ? ( 141 {service.isHibernating ? (
141 <div 142 <div
@@ -173,6 +174,7 @@ class ServiceView extends Component<IProps, IState> {
173 )} 174 )}
174 </> 175 </>
175 ) : ( 176 ) : (
177 // eslint-disable-next-line react/jsx-no-useless-fragment
176 <> 178 <>
177 {service.isActive && ( 179 {service.isActive && (
178 <ServiceDisabled 180 <ServiceDisabled
diff --git a/src/components/services/content/ServiceWebview.tsx b/src/components/services/content/ServiceWebview.tsx
index 008e1b227..50b5d478f 100644
--- a/src/components/services/content/ServiceWebview.tsx
+++ b/src/components/services/content/ServiceWebview.tsx
@@ -2,7 +2,7 @@ import { Component, ReactElement } from 'react';
2import { observer } from 'mobx-react'; 2import { observer } from 'mobx-react';
3import { action, makeObservable, observable, reaction } from 'mobx'; 3import { action, makeObservable, observable, reaction } from 'mobx';
4import ElectronWebView from 'react-electron-web-view'; 4import ElectronWebView from 'react-electron-web-view';
5import { join } from 'path'; 5import { join } from 'node:path';
6import ServiceModel from '../../../models/Service'; 6import ServiceModel from '../../../models/Service';
7 7
8const debug = require('../../../preload-safe-debug')('Ferdium:Services'); 8const debug = require('../../../preload-safe-debug')('Ferdium:Services');
diff --git a/src/components/settings/settings/EditSettingsForm.tsx b/src/components/settings/settings/EditSettingsForm.tsx
index 099a27ebe..0b5d4374d 100644
--- a/src/components/settings/settings/EditSettingsForm.tsx
+++ b/src/components/settings/settings/EditSettingsForm.tsx
@@ -386,8 +386,8 @@ class EditSettingsForm extends Component<IProps, IState> {
386 const { lockingFeatureEnabled, scheduledDNDEnabled, reloadAfterResume } = 386 const { lockingFeatureEnabled, scheduledDNDEnabled, reloadAfterResume } =
387 window['ferdium'].stores.settings.all.app; 387 window['ferdium'].stores.settings.all.app;
388 388
389 let cacheSize: string; 389 let cacheSize;
390 let notCleared: boolean; 390 let notCleared;
391 391
392 if (this.state.activeSetttingsTab === 'advanced') { 392 if (this.state.activeSetttingsTab === 'advanced') {
393 const cacheSizeBytes = getCacheSize(); 393 const cacheSizeBytes = getCacheSize();
diff --git a/src/components/ui/Tabs/TabItem.tsx b/src/components/ui/Tabs/TabItem.tsx
index 815dced8c..55dee42c6 100644
--- a/src/components/ui/Tabs/TabItem.tsx
+++ b/src/components/ui/Tabs/TabItem.tsx
@@ -12,8 +12,8 @@ export interface IProps {
12 title?: string; // it is used on Tabs.tsx 12 title?: string; // it is used on Tabs.tsx
13} 13}
14 14
15function TabItem({ children, title = '' }: IProps): ReactElement { 15const TabItem = ({ children, title = '' }: IProps): ReactElement => {
16 return <Fragment key={title}>{children}</Fragment>; 16 return <Fragment key={title}>{children}</Fragment>;
17} 17};
18 18
19export default TabItem; 19export default TabItem;
diff --git a/src/components/ui/button/index.tsx b/src/components/ui/button/index.tsx
index 3c31ca952..c37a88afa 100644
--- a/src/components/ui/button/index.tsx
+++ b/src/components/ui/button/index.tsx
@@ -237,6 +237,7 @@ class ButtonComponent extends Component<IProps, IState> {
237 ) : ( 237 ) : (
238 <button 238 <button
239 id={id} 239 id={id}
240 // eslint-disable-next-line react/button-has-type
240 type={type} 241 type={type}
241 onClick={onClick} 242 onClick={onClick}
242 className={classnames({ 243 className={classnames({
diff --git a/src/components/ui/select/index.tsx b/src/components/ui/select/index.tsx
index 902eb7748..650600fb3 100644
--- a/src/components/ui/select/index.tsx
+++ b/src/components/ui/select/index.tsx
@@ -191,12 +191,23 @@ class SelectComponent extends Component<IProps, IState> {
191 this.arrowKeysHandler = this.arrowKeysHandler.bind(this); 191 this.arrowKeysHandler = this.arrowKeysHandler.bind(this);
192 } 192 }
193 193
194 componentDidUpdate(): void { 194 UNSAFE_componentWillMount(): void {
195 const { open } = this.state; 195 const { value } = this.props;
196 196
197 if (this.searchInputRef?.current && open) { 197 if (this.componentRef?.current) {
198 this.searchInputRef.current.focus(); 198 this.componentRef.current.removeEventListener(
199 'keydown',
200 this.keyListener,
201 );
199 } 202 }
203
204 if (value) {
205 this.setState({
206 value,
207 });
208 }
209
210 this.setFilter();
200 } 211 }
201 212
202 componentDidMount(): void { 213 componentDidMount(): void {
@@ -212,23 +223,12 @@ class SelectComponent extends Component<IProps, IState> {
212 window.addEventListener('keydown', this.arrowKeysHandler, false); 223 window.addEventListener('keydown', this.arrowKeysHandler, false);
213 } 224 }
214 225
215 UNSAFE_componentWillMount(): void { 226 componentDidUpdate(): void {
216 const { value } = this.props; 227 const { open } = this.state;
217
218 if (this.componentRef?.current) {
219 this.componentRef.current.removeEventListener(
220 'keydown',
221 this.keyListener,
222 );
223 }
224 228
225 if (value) { 229 if (this.searchInputRef?.current && open) {
226 this.setState({ 230 this.searchInputRef.current.focus();
227 value,
228 });
229 } 231 }
230
231 this.setFilter();
232 } 232 }
233 233
234 componentWillUnmount(): void { 234 componentWillUnmount(): void {
diff --git a/src/electron/exception.ts b/src/electron/exception.ts
index ada98d17b..a445a6475 100644
--- a/src/electron/exception.ts
+++ b/src/electron/exception.ts
@@ -1,3 +1,4 @@
1// eslint-disable-next-line unicorn/no-empty-file
1process.on('uncaughtException', err => { 2process.on('uncaughtException', err => {
2 // handle the error safely 3 // handle the error safely
3 console.error(err); 4 console.error(err);
diff --git a/src/electron/ipc-api/appIndicator.ts b/src/electron/ipc-api/appIndicator.ts
index 766e6937a..c3232d89f 100644
--- a/src/electron/ipc-api/appIndicator.ts
+++ b/src/electron/ipc-api/appIndicator.ts
@@ -1,5 +1,5 @@
1import { app, ipcMain, BrowserWindow } from 'electron'; 1import { app, ipcMain, BrowserWindow } from 'electron';
2import { join } from 'path'; 2import { join } from 'node:path';
3import { autorun } from 'mobx'; 3import { autorun } from 'mobx';
4import { isMac, isWindows, isLinux } from '../../environment'; 4import { isMac, isWindows, isLinux } from '../../environment';
5import TrayIcon from '../../lib/Tray'; 5import TrayIcon from '../../lib/Tray';
diff --git a/src/electron/ipc-api/download.ts b/src/electron/ipc-api/download.ts
index 851bff4c3..0c7e022d4 100644
--- a/src/electron/ipc-api/download.ts
+++ b/src/electron/ipc-api/download.ts
@@ -1,7 +1,7 @@
1import { ipcMain, dialog, BrowserWindow } from 'electron'; 1import { ipcMain, dialog, BrowserWindow } from 'electron';
2import { download } from 'electron-dl'; 2import { download } from 'electron-dl';
3import { writeFileSync } from 'fs-extra'; 3import { writeFileSync } from 'fs-extra';
4import { PathLike } from 'fs'; 4import { PathLike } from 'node:fs';
5 5
6const debug = require('../../preload-safe-debug')('Ferdium:ipcApi:download'); 6const debug = require('../../preload-safe-debug')('Ferdium:ipcApi:download');
7 7
diff --git a/src/electron/ipc-api/localServer.ts b/src/electron/ipc-api/localServer.ts
index 6264e719d..5fdfad32c 100644
--- a/src/electron/ipc-api/localServer.ts
+++ b/src/electron/ipc-api/localServer.ts
@@ -1,6 +1,6 @@
1import { randomBytes } from 'crypto'; 1import { randomBytes } from 'node:crypto';
2import { ipcMain, BrowserWindow } from 'electron'; 2import { ipcMain, BrowserWindow } from 'electron';
3import { createServer } from 'net'; 3import { createServer } from 'node:net';
4import { LOCAL_HOSTNAME, LOCAL_PORT } from '../../config'; 4import { LOCAL_HOSTNAME, LOCAL_PORT } from '../../config';
5import { userDataPath } from '../../environment-remote'; 5import { userDataPath } from '../../environment-remote';
6import { server } from '../../internal-server/start'; 6import { server } from '../../internal-server/start';
diff --git a/src/electron/macOSPermissions.ts b/src/electron/macOSPermissions.ts
index 88706dd23..90056f59c 100644
--- a/src/electron/macOSPermissions.ts
+++ b/src/electron/macOSPermissions.ts
@@ -1,7 +1,7 @@
1import { systemPreferences, BrowserWindow, dialog } from 'electron'; 1import { systemPreferences, BrowserWindow, dialog } from 'electron';
2import { pathExistsSync, mkdirSync, writeFileSync } from 'fs-extra'; 2import { pathExistsSync, mkdirSync, writeFileSync } from 'fs-extra';
3import macosVersion from 'macos-version'; 3import macosVersion from 'macos-version';
4import { dirname } from 'path'; 4import { dirname } from 'node:path';
5// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error 5// eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
6// @ts-ignore 6// @ts-ignore
7import { askForScreenCaptureAccess } from 'node-mac-permissions'; 7import { askForScreenCaptureAccess } from 'node-mac-permissions';
diff --git a/src/environment-remote.ts b/src/environment-remote.ts
index 5f2b68dab..691e19ef4 100644
--- a/src/environment-remote.ts
+++ b/src/environment-remote.ts
@@ -1,4 +1,4 @@
1import { join } from 'path'; 1import { join } from 'node:path';
2import { api as electronApi } from './electron-util'; 2import { api as electronApi } from './electron-util';
3import { 3import {
4 LIVE_FERDIUM_API, 4 LIVE_FERDIUM_API,
diff --git a/src/environment.ts b/src/environment.ts
index e17be0b7f..c3b9e7e58 100644
--- a/src/environment.ts
+++ b/src/environment.ts
@@ -1,6 +1,6 @@
1// Note: This file has now become devoid of all references to values deduced from the remote process - all those now live in the `environment-remote.js` file 1// Note: This file has now become devoid of all references to values deduced from the remote process - all those now live in the `environment-remote.js` file
2 2
3import { arch, release } from 'os'; 3import { arch, release } from 'node:os';
4 4
5export const isMac = process.platform === 'darwin'; 5export const isMac = process.platform === 'darwin';
6export const isWindows = process.platform === 'win32'; 6export const isWindows = process.platform === 'win32';
diff --git a/src/features/appearance/index.ts b/src/features/appearance/index.ts
index da75bf57b..46403275e 100644
--- a/src/features/appearance/index.ts
+++ b/src/features/appearance/index.ts
@@ -146,12 +146,13 @@ function generateServiceRibbonWidthStyle(
146) { 146) {
147 const width = Number(widthStr); 147 const width = Number(widthStr);
148 const iconSize = Number(iconSizeStr) - iconSizeBias; 148 const iconSize = Number(iconSizeStr) - iconSizeBias;
149 let fontSize = 11;
150 let tabItemHeightBias = -5;
151 let sidebarSizeBias = 22;
152 const tabItemWidthBias = 3; 149 const tabItemWidthBias = 3;
153 const verticalStyleOffset = 29; 150 const verticalStyleOffset = 29;
154 151
152 let fontSize: number;
153 let tabItemHeightBias: number;
154 let sidebarSizeBias: number;
155
155 switch (width) { 156 switch (width) {
156 case 35: { 157 case 35: {
157 fontSize = 9; 158 fontSize = 9;
diff --git a/src/features/workspaces/components/WorkspacesDashboard.tsx b/src/features/workspaces/components/WorkspacesDashboard.tsx
index a823132c5..ba06730a0 100644
--- a/src/features/workspaces/components/WorkspacesDashboard.tsx
+++ b/src/features/workspaces/components/WorkspacesDashboard.tsx
@@ -152,6 +152,7 @@ class WorkspacesDashboard extends Component<IProps> {
152 {intl.formatMessage(messages.workspacesRequestFailed)} 152 {intl.formatMessage(messages.workspacesRequestFailed)}
153 </Infobox> 153 </Infobox>
154 ) : ( 154 ) : (
155 // eslint-disable-next-line react/jsx-no-useless-fragment
155 <> 156 <>
156 {workspaces.length === 0 ? ( 157 {workspaces.length === 0 ? (
157 <div className="align-middle settings__empty-state"> 158 <div className="align-middle settings__empty-state">
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.tsx b/src/features/workspaces/containers/EditWorkspaceScreen.tsx
index 0b66db0d0..abc747c33 100644
--- a/src/features/workspaces/containers/EditWorkspaceScreen.tsx
+++ b/src/features/workspaces/containers/EditWorkspaceScreen.tsx
@@ -9,11 +9,10 @@ import { workspaceStore } from '../index';
9import { deleteWorkspaceRequest, updateWorkspaceRequest } from '../api'; 9import { deleteWorkspaceRequest, updateWorkspaceRequest } from '../api';
10 10
11class EditWorkspaceScreen extends Component<StoresProps> { 11class EditWorkspaceScreen extends Component<StoresProps> {
12 // @ts-expect-error Not all code paths return a value.
13 onDelete = () => { 12 onDelete = () => {
14 const { workspaceBeingEdited } = workspaceStore; 13 const { workspaceBeingEdited } = workspaceStore;
15 const { actions } = this.props; 14 const { actions } = this.props;
16 if (!workspaceBeingEdited) return null; 15 if (!workspaceBeingEdited) return;
17 actions.workspaces.delete({ workspace: workspaceBeingEdited }); 16 actions.workspaces.delete({ workspace: workspaceBeingEdited });
18 }; 17 };
19 18
diff --git a/src/helpers/asar-helpers.ts b/src/helpers/asar-helpers.ts
index 9d975c193..77dd50bb1 100644
--- a/src/helpers/asar-helpers.ts
+++ b/src/helpers/asar-helpers.ts
@@ -1,4 +1,4 @@
1import { join } from 'path'; 1import { join } from 'node:path';
2 2
3export function asarPath(dir: string = '') { 3export function asarPath(dir: string = '') {
4 return dir.replace('app.asar', 'app.asar.unpacked'); 4 return dir.replace('app.asar', 'app.asar.unpacked');
diff --git a/src/helpers/password-helpers.ts b/src/helpers/password-helpers.ts
index d5f2d0c49..75ef5606a 100644
--- a/src/helpers/password-helpers.ts
+++ b/src/helpers/password-helpers.ts
@@ -1,4 +1,4 @@
1import { createHash, BinaryLike } from 'crypto'; 1import { createHash, BinaryLike } from 'node:crypto';
2 2
3export function hash(password: BinaryLike): string { 3export function hash(password: BinaryLike): string {
4 return createHash('sha256').update(password).digest('base64'); 4 return createHash('sha256').update(password).digest('base64');
diff --git a/src/helpers/recipe-helpers.ts b/src/helpers/recipe-helpers.ts
index 68a1578e3..500be0cfc 100644
--- a/src/helpers/recipe-helpers.ts
+++ b/src/helpers/recipe-helpers.ts
@@ -1,6 +1,6 @@
1/* eslint-disable import/no-import-module-exports */ 1/* eslint-disable import/no-import-module-exports */
2/* eslint-disable global-require */ 2/* eslint-disable global-require */
3import { parse } from 'path'; 3import { parse } from 'node:path';
4import { userDataRecipesPath } from '../environment-remote'; 4import { userDataRecipesPath } from '../environment-remote';
5 5
6export function getRecipeDirectory(id: string = ''): string { 6export function getRecipeDirectory(id: string = ''): string {
diff --git a/src/helpers/url-helpers.ts b/src/helpers/url-helpers.ts
index 795d3f2cb..fe637bb08 100644
--- a/src/helpers/url-helpers.ts
+++ b/src/helpers/url-helpers.ts
@@ -1,5 +1,5 @@
1// This is taken from: https://benjamin-altpeter.de/shell-openexternal-dangers/ 1// This is taken from: https://benjamin-altpeter.de/shell-openexternal-dangers/
2import { URL } from 'url'; 2import { URL } from 'node:url';
3import { ensureDirSync, existsSync } from 'fs-extra'; 3import { ensureDirSync, existsSync } from 'fs-extra';
4import { shell } from 'electron'; 4import { shell } from 'electron';
5import normalizeUrl from 'normalize-url'; 5import normalizeUrl from 'normalize-url';
diff --git a/src/helpers/userAgent-helpers.ts b/src/helpers/userAgent-helpers.ts
index a89207326..bc99fbc52 100644
--- a/src/helpers/userAgent-helpers.ts
+++ b/src/helpers/userAgent-helpers.ts
@@ -1,4 +1,4 @@
1import { cpus } from 'os'; 1import { cpus } from 'node:os';
2import macosVersion from 'macos-version'; 2import macosVersion from 'macos-version';
3import { chrome } from 'useragent-generator'; 3import { chrome } from 'useragent-generator';
4import { 4import {
@@ -14,6 +14,7 @@ function macOS() {
14 const version = macosVersion() ?? ''; 14 const version = macosVersion() ?? '';
15 let cpuName = cpus()[0].model.split(' ')[0]; 15 let cpuName = cpus()[0].model.split(' ')[0];
16 if (cpuName && /\(/.test(cpuName)) { 16 if (cpuName && /\(/.test(cpuName)) {
17 // eslint-disable-next-line prefer-destructuring
17 cpuName = cpuName.split('(')[0]; 18 cpuName = cpuName.split('(')[0];
18 } 19 }
19 return `Macintosh; ${cpuName} Mac OS X ${version.replaceAll('.', '_')}`; 20 return `Macintosh; ${cpuName} Mac OS X ${version.replaceAll('.', '_')}`;
diff --git a/src/index.ts b/src/index.ts
index 1c616b499..5507a9ac4 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -11,11 +11,11 @@ import {
11} from 'electron'; 11} from 'electron';
12 12
13import { emptyDirSync, ensureFileSync } from 'fs-extra'; 13import { emptyDirSync, ensureFileSync } from 'fs-extra';
14import { join } from 'path'; 14import { join } from 'node:path';
15import windowStateKeeper from 'electron-window-state'; 15import windowStateKeeper from 'electron-window-state';
16import minimist from 'minimist'; 16import minimist from 'minimist';
17import ms from 'ms'; 17import ms from 'ms';
18import { EventEmitter } from 'events'; 18import { EventEmitter } from 'node:events';
19import { enableWebContents, initializeRemote } from './electron-util'; 19import { enableWebContents, initializeRemote } from './electron-util';
20import enforceMacOSAppLocation from './enforce-macos-app-location'; 20import enforceMacOSAppLocation from './enforce-macos-app-location';
21 21
diff --git a/src/internal-server/app/Controllers/Http/ImageController.js b/src/internal-server/app/Controllers/Http/ImageController.js
index 5b8337c49..3ce6fb22d 100644
--- a/src/internal-server/app/Controllers/Http/ImageController.js
+++ b/src/internal-server/app/Controllers/Http/ImageController.js
@@ -1,6 +1,6 @@
1const Env = use('Env'); 1const Env = use('Env');
2 2
3const path = require('path'); 3const path = require('node:path');
4const fs = require('fs-extra'); 4const fs = require('fs-extra');
5const sanitize = require('sanitize-filename'); 5const sanitize = require('sanitize-filename');
6 6
diff --git a/src/internal-server/app/Controllers/Http/UserController.js b/src/internal-server/app/Controllers/Http/UserController.js
index 43d925119..943d7705e 100644
--- a/src/internal-server/app/Controllers/Http/UserController.js
+++ b/src/internal-server/app/Controllers/Http/UserController.js
@@ -6,7 +6,7 @@ const { validateAll } = use('Validator');
6 6
7const fetch = require('node-fetch'); 7const fetch = require('node-fetch');
8const { v4: uuid } = require('uuid'); 8const { v4: uuid } = require('uuid');
9const crypto = require('crypto'); 9const crypto = require('node:crypto');
10const { DEFAULT_APP_SETTINGS } = require('../../../../config'); 10const { DEFAULT_APP_SETTINGS } = require('../../../../config');
11const { convertToJSON } = require('../../../../jsUtils'); 11const { convertToJSON } = require('../../../../jsUtils');
12const { API_VERSION } = require('../../../../environment-remote'); 12const { API_VERSION } = require('../../../../environment-remote');
@@ -224,11 +224,7 @@ class UserController {
224 } 224 }
225 225
226 // Account import/export 226 // Account import/export
227 async export({ 227 async export({ _auth, response }) {
228 // eslint-disable-next-line no-unused-vars
229 auth,
230 response,
231 }) {
232 const allServices = await Service.all(); 228 const allServices = await Service.all();
233 const services = allServices.toJSON(); 229 const services = allServices.toJSON();
234 const allWorkspaces = await Workspace.all(); 230 const allWorkspaces = await Workspace.all();
diff --git a/src/internal-server/app/Controllers/Http/WorkspaceController.js b/src/internal-server/app/Controllers/Http/WorkspaceController.js
index 352589567..d271dac12 100644
--- a/src/internal-server/app/Controllers/Http/WorkspaceController.js
+++ b/src/internal-server/app/Controllers/Http/WorkspaceController.js
@@ -92,12 +92,7 @@ class WorkspaceController {
92 }); 92 });
93 } 93 }
94 94
95 async delete({ 95 async delete({ response, params }) {
96 // eslint-disable-next-line no-unused-vars
97 request,
98 response,
99 params,
100 }) {
101 // Validate user input 96 // Validate user input
102 const validation = await validateAll(params, { 97 const validation = await validateAll(params, {
103 id: 'required', 98 id: 'required',
diff --git a/src/internal-server/app/ImageHelper.js b/src/internal-server/app/ImageHelper.js
index fba610069..b24a97836 100644
--- a/src/internal-server/app/ImageHelper.js
+++ b/src/internal-server/app/ImageHelper.js
@@ -2,7 +2,7 @@ const Env = use('Env');
2 2
3const { v4: uuid } = require('uuid'); 3const { v4: uuid } = require('uuid');
4 4
5const path = require('path'); 5const path = require('node:path');
6const fs = require('fs-extra'); 6const fs = require('fs-extra');
7const { API_VERSION } = require('../../environment-remote'); 7const { API_VERSION } = require('../../environment-remote');
8 8
diff --git a/src/internal-server/database/factory.js b/src/internal-server/database/factory.js
index 8534fc20a..8cd45a80d 100644
--- a/src/internal-server/database/factory.js
+++ b/src/internal-server/database/factory.js
@@ -1,3 +1,4 @@
1/* eslint-disable unicorn/no-empty-file */
1/* 2/*
2|-------------------------------------------------------------------------- 3|--------------------------------------------------------------------------
3| Factory 4| Factory
diff --git a/src/internal-server/start.ts b/src/internal-server/start.ts
index f5e1953e7..b6ee65986 100644
--- a/src/internal-server/start.ts
+++ b/src/internal-server/start.ts
@@ -18,7 +18,7 @@
18import fold from '@adonisjs/fold'; 18import fold from '@adonisjs/fold';
19import { Ignitor, hooks } from '@adonisjs/ignitor'; 19import { Ignitor, hooks } from '@adonisjs/ignitor';
20import { readFile, stat, chmod, writeFile } from 'fs-extra'; 20import { readFile, stat, chmod, writeFile } from 'fs-extra';
21import { join } from 'path'; 21import { join } from 'node:path';
22import { LOCAL_HOSTNAME } from '../config'; 22import { LOCAL_HOSTNAME } from '../config';
23import { isWindows } from '../environment'; 23import { isWindows } from '../environment';
24 24
diff --git a/src/internal-server/start/routes.js b/src/internal-server/start/routes.js
index 8aca39347..2dbd0713e 100644
--- a/src/internal-server/start/routes.js
+++ b/src/internal-server/start/routes.js
@@ -5,7 +5,7 @@
5| 5|
6*/ 6*/
7 7
8const { timingSafeEqual } = require('crypto'); 8const { timingSafeEqual } = require('node:crypto');
9 9
10/** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */ 10/** @type {typeof import('@adonisjs/framework/src/Route/Manager')} */
11const Route = use('Route'); 11const Route = use('Route');
diff --git a/src/internal-server/test.ts b/src/internal-server/test.ts
index 6949df79e..c163656fb 100644
--- a/src/internal-server/test.ts
+++ b/src/internal-server/test.ts
@@ -1,4 +1,4 @@
1import { join } from 'path'; 1import { join } from 'node:path';
2import { ensureDirSync } from 'fs-extra'; 2import { ensureDirSync } from 'fs-extra';
3import { server } from './start'; 3import { server } from './start';
4 4
diff --git a/src/jsUtils.ts b/src/jsUtils.ts
index f6a1df2fe..0095028ef 100644
--- a/src/jsUtils.ts
+++ b/src/jsUtils.ts
@@ -3,15 +3,15 @@ export const ifUndefined = <T>(
3 defaultValue: T, 3 defaultValue: T,
4): T => source ?? defaultValue; 4): T => source ?? defaultValue;
5 5
6export const convertToJSON = (data: string | any | undefined | null) => 6export const convertToJSON = (data?: string | any | null) =>
7 data && typeof data === 'string' && data.length > 0 ? JSON.parse(data) : data; 7 data && typeof data === 'string' && data.length > 0 ? JSON.parse(data) : data;
8 8
9export const cleanseJSObject = (data: any | undefined | null) => 9export const cleanseJSObject = (data?: any | null) =>
10 JSON.parse(JSON.stringify(data)); 10 JSON.parse(JSON.stringify(data));
11 11
12export const isEscKeyPress = (keyCode: number) => keyCode === 27; 12export const isEscKeyPress = (keyCode: number) => keyCode === 27;
13 13
14export const safeParseInt = (text: string | number | undefined | null) => { 14export const safeParseInt = (text?: string | number | null) => {
15 if (text === undefined || text === null) { 15 if (text === undefined || text === null) {
16 return 0; 16 return 0;
17 } 17 }
diff --git a/src/lib/Menu.ts b/src/lib/Menu.ts
index f587f8df9..08ad9dabe 100644
--- a/src/lib/Menu.ts
+++ b/src/lib/Menu.ts
@@ -12,7 +12,7 @@ import { defineMessages, IntlShape } from 'react-intl';
12import osName from 'os-name'; 12import osName from 'os-name';
13import { fromJS } from 'immutable'; 13import { fromJS } from 'immutable';
14import semver from 'semver'; 14import semver from 'semver';
15import os from 'os'; 15import os from 'node:os';
16import { 16import {
17 isWindows, 17 isWindows,
18 cmdOrCtrlShortcutKey, 18 cmdOrCtrlShortcutKey,
diff --git a/src/lib/Tray.ts b/src/lib/Tray.ts
index dafbb68aa..0d567fc13 100644
--- a/src/lib/Tray.ts
+++ b/src/lib/Tray.ts
@@ -9,7 +9,7 @@ import {
9 BrowserWindow, 9 BrowserWindow,
10 NativeImage, 10 NativeImage,
11} from 'electron'; 11} from 'electron';
12import { join } from 'path'; 12import { join } from 'node:path';
13import macosVersion from 'macos-version'; 13import macosVersion from 'macos-version';
14import { isMac, isWindows, isLinux } from '../environment'; 14import { isMac, isWindows, isLinux } from '../environment';
15 15
diff --git a/src/models/Recipe.ts b/src/models/Recipe.ts
index 35e8d4979..a6d2fd86d 100644
--- a/src/models/Recipe.ts
+++ b/src/models/Recipe.ts
@@ -1,6 +1,6 @@
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 'node:path';
4import { DEFAULT_SERVICE_SETTINGS } from '../config'; 4import { DEFAULT_SERVICE_SETTINGS } from '../config';
5import { ifUndefined } from '../jsUtils'; 5import { ifUndefined } from '../jsUtils';
6 6
diff --git a/src/models/Service.ts b/src/models/Service.ts
index af0085185..4a9fcf4fb 100644
--- a/src/models/Service.ts
+++ b/src/models/Service.ts
@@ -1,7 +1,7 @@
1import { autorun, action, computed, makeObservable, observable } from 'mobx'; 1import { autorun, action, computed, makeObservable, observable } from 'mobx';
2import { ipcRenderer } from 'electron'; 2import { ipcRenderer } from 'electron';
3import { webContents } from '@electron/remote'; 3import { webContents } from '@electron/remote';
4import { join } from 'path'; 4import { join } from 'node:path';
5import ElectronWebView from 'react-electron-web-view'; 5import ElectronWebView from 'react-electron-web-view';
6 6
7import { todosStore } from '../features/todos'; 7import { todosStore } from '../features/todos';
diff --git a/src/preload-safe-debug.ts b/src/preload-safe-debug.ts
index d18dd8639..471ae1a1f 100644
--- a/src/preload-safe-debug.ts
+++ b/src/preload-safe-debug.ts
@@ -8,6 +8,7 @@
8 * We disable the `debug` package in context isolated renderers, 8 * We disable the `debug` package in context isolated renderers,
9 * because they correspond to preload scripts. 9 * because they correspond to preload scripts.
10 */ 10 */
11// eslint-disable-next-line unicorn/no-empty-file
11module.exports = function debug(namespace: string): (...params: any[]) => void { 12module.exports = function debug(namespace: string): (...params: any[]) => void {
12 if ( 13 if (
13 typeof process === 'object' && 14 typeof process === 'object' &&
@@ -18,13 +19,14 @@ module.exports = function debug(namespace: string): (...params: any[]) => void {
18 // We don't reimplement the matching algorithm from `debug` and just dump all 19 // We don't reimplement the matching algorithm from `debug` and just dump all
19 // messages to the console if some form of `Ferdium` debugging is enabled. 20 // messages to the console if some form of `Ferdium` debugging is enabled.
20 if (process.env.DEBUG?.startsWith('Ferdium:')) { 21 if (process.env.DEBUG?.startsWith('Ferdium:')) {
22 // eslint-disable-next-line no-console
21 return (...params) => console.debug(`[${namespace}]`, ...params); 23 return (...params) => console.debug(`[${namespace}]`, ...params);
22 } 24 }
23 return () => {}; 25 return () => {};
24 } 26 }
25 /* 27 /*
26 eslint-disable-next-line global-require --
27 This file contains a workaround for situations were global require is problematic. 28 This file contains a workaround for situations were global require is problematic.
28 */ 29 */
30 // eslint-disable-next-line global-require
29 return require('debug')(namespace); 31 return require('debug')(namespace);
30}; 32};
diff --git a/src/stores/AppStore.ts b/src/stores/AppStore.ts
index 412c52ecf..0bf845e4d 100644
--- a/src/stores/AppStore.ts
+++ b/src/stores/AppStore.ts
@@ -11,7 +11,7 @@ import { action, computed, makeObservable, observable } from 'mobx';
11import moment from 'moment'; 11import moment from 'moment';
12import AutoLaunch from 'auto-launch'; 12import AutoLaunch from 'auto-launch';
13import ms from 'ms'; 13import ms from 'ms';
14import { URL } from 'url'; 14import { URL } from 'node:url';
15import { readJsonSync } from 'fs-extra'; 15import { readJsonSync } from 'fs-extra';
16 16
17import { Stores } from '../@types/stores.types'; 17import { Stores } from '../@types/stores.types';
diff --git a/src/stores/ServicesStore.ts b/src/stores/ServicesStore.ts
index 82f3b95ce..1cee0c57f 100644
--- a/src/stores/ServicesStore.ts
+++ b/src/stores/ServicesStore.ts
@@ -3,7 +3,7 @@ import { action, reaction, computed, observable, makeObservable } from 'mobx';
3import { debounce, remove } from 'lodash'; 3import { debounce, remove } from 'lodash';
4import ms from 'ms'; 4import ms from 'ms';
5import { ensureFileSync, pathExistsSync, writeFileSync } from 'fs-extra'; 5import { ensureFileSync, pathExistsSync, writeFileSync } from 'fs-extra';
6import { join } from 'path'; 6import { join } from 'node:path';
7 7
8import { Stores } from '../@types/stores.types'; 8import { Stores } from '../@types/stores.types';
9import { ApiInterface } from '../api'; 9import { ApiInterface } from '../api';
diff --git a/src/webview/darkmode.ts b/src/webview/darkmode.ts
index f5e8700e0..88d39f19f 100644
--- a/src/webview/darkmode.ts
+++ b/src/webview/darkmode.ts
@@ -1,4 +1,4 @@
1import { join } from 'path'; 1import { join } from 'node:path';
2import { pathExistsSync, readFileSync } from 'fs-extra'; 2import { pathExistsSync, readFileSync } from 'fs-extra';
3 3
4const debug = require('../preload-safe-debug')('Ferdium:DarkMode'); 4const debug = require('../preload-safe-debug')('Ferdium:DarkMode');
diff --git a/src/webview/recipe.ts b/src/webview/recipe.ts
index 76615d234..ee7fa26d2 100644
--- a/src/webview/recipe.ts
+++ b/src/webview/recipe.ts
@@ -3,7 +3,7 @@
3 3
4import { noop, debounce } from 'lodash'; 4import { noop, debounce } from 'lodash';
5import { contextBridge, ipcRenderer } from 'electron'; 5import { contextBridge, ipcRenderer } from 'electron';
6import { join } from 'path'; 6import { join } from 'node:path';
7import { autorun, computed, makeObservable, observable } from 'mobx'; 7import { autorun, computed, makeObservable, observable } from 'mobx';
8import { pathExistsSync, readFileSync } from 'fs-extra'; 8import { pathExistsSync, readFileSync } from 'fs-extra';
9import { 9import {
@@ -11,7 +11,7 @@ import {
11 enable as enableDarkMode, 11 enable as enableDarkMode,
12} from 'darkreader'; 12} from 'darkreader';
13 13
14import { existsSync } from 'fs'; 14import { existsSync } from 'node:fs';
15import ignoreList from './darkmode/ignore'; 15import ignoreList from './darkmode/ignore';
16import customDarkModeCss from './darkmode/custom'; 16import customDarkModeCss from './darkmode/custom';
17 17