diff --git a/.eslintrc.js b/.eslintrc.js index ef6c2863..4188b20b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -49,6 +49,7 @@ module.exports = { }, ], 'react/react-in-jsx-scope': 'off', + 'security-node/detect-unhandled-async-errors': 'off', 'unicorn/prefer-node-protocol': 'off', 'unicorn/prefer-module': 'off', '@typescript-eslint/no-empty-function': 'off', @@ -90,6 +91,8 @@ module.exports = { semi: [0], 'no-use-before-define': [0], '@typescript-eslint/no-use-before-define': [1], + 'unused-imports/no-unused-imports': 'error', + 'unused-imports/no-unused-vars': ['warn', { vars: 'all', varsIgnorePattern: '^_', args: 'after-used', argsIgnorePattern: '^_' }], }, extends: [ 'eslint:recommended', @@ -121,6 +124,8 @@ module.exports = { 'react-hooks', 'security', 'security-node', + 'autofix', + 'unused-imports', ], env: { browser: true, diff --git a/features/stepDefinitions/electron.ts b/features/stepDefinitions/electron.ts index c6a2cc6f..4bdaaee2 100644 --- a/features/stepDefinitions/electron.ts +++ b/features/stepDefinitions/electron.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-unused-expressions */ -import { setWorldConstructor, Given, Then, When } from '@cucumber/cucumber'; +import { setWorldConstructor, Given, Then } from '@cucumber/cucumber'; import { delay } from 'bluebird'; import { expect } from 'chai'; import { TidGiWorld } from '../supports/world'; diff --git a/features/supports/world.ts b/features/supports/world.ts index f61e7d5f..32591f89 100644 --- a/features/supports/world.ts +++ b/features/supports/world.ts @@ -1,6 +1,5 @@ import { setDefaultTimeout, World } from '@cucumber/cucumber'; import path from 'path'; -import { delay } from 'bluebird'; import { Application } from 'spectron'; // import { keyboard, Key } from '@nut-tree/nut-js'; diff --git a/package-lock.json b/package-lock.json index b252a5ff..11c2bfad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,6 +112,7 @@ "eslint-config-standard-with-typescript": "21.0.1", "eslint-import-resolver-alias": "1.1.2", "eslint-import-resolver-typescript": "2.5.0", + "eslint-plugin-autofix": "^1.1.0", "eslint-plugin-html": "6.2.0", "eslint-plugin-import": "2.25.4", "eslint-plugin-node": "11.1.0", @@ -123,6 +124,7 @@ "eslint-plugin-security-node": "1.1.1", "eslint-plugin-typescript-sort-keys": "2.1.0", "eslint-plugin-unicorn": "41.0.0", + "eslint-plugin-unused-imports": "^2.0.0", "event-hooks-webpack-plugin": "2.2.0", "fork-ts-checker-webpack-plugin": "7.2.1", "graphql-hooks": "5.7.0", @@ -10309,6 +10311,25 @@ "node": ">=4" } }, + "node_modules/eslint-plugin-autofix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-autofix/-/eslint-plugin-autofix-1.1.0.tgz", + "integrity": "sha512-aKQ7s6CTeJRJgnhSlsGI7kQhnNCa1q3UYBM+9PTEgvdC5b+GjV/SZA233VNqkoBldb7/BkeWBRjorUjxeUfrxA==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0", + "espree": "^9.0.0", + "esutils": "^2.0.2", + "lodash": "^4.17.20", + "string-similarity": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "eslint": ">= 5.12.1" + } + }, "node_modules/eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz", @@ -10683,6 +10704,36 @@ "regexp-tree": "~0.1.1" } }, + "node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz", @@ -20019,6 +20070,12 @@ "node": ">=0.6.19" } }, + "node_modules/string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", + "dev": true + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632420968947&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", @@ -31151,6 +31208,19 @@ } } }, + "eslint-plugin-autofix": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-autofix/-/eslint-plugin-autofix-1.1.0.tgz", + "integrity": "sha512-aKQ7s6CTeJRJgnhSlsGI7kQhnNCa1q3UYBM+9PTEgvdC5b+GjV/SZA233VNqkoBldb7/BkeWBRjorUjxeUfrxA==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0", + "espree": "^9.0.0", + "esutils": "^2.0.2", + "lodash": "^4.17.20", + "string-similarity": "^4.0.3" + } + }, "eslint-plugin-es": { "version": "3.0.1", "resolved": "https://registry.npm.taobao.org/eslint-plugin-es/download/eslint-plugin-es-3.0.1.tgz", @@ -31422,6 +31492,21 @@ } } }, + "eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.nlark.com/eslint-scope/download/eslint-scope-5.1.1.tgz", @@ -38722,6 +38807,12 @@ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== sha1-leL77AQnrhkYSTX4FtdKqkxcGdo=", "dev": true }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmmirror.com/string-width/download/string-width-4.2.3.tgz?cache=0&sync_timestamp=1632420968947&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstring-width%2Fdownload%2Fstring-width-4.2.3.tgz", diff --git a/package.json b/package.json index 5ba61757..7ce4cf83 100755 --- a/package.json +++ b/package.json @@ -129,6 +129,7 @@ "eslint-config-standard-with-typescript": "21.0.1", "eslint-import-resolver-alias": "1.1.2", "eslint-import-resolver-typescript": "2.5.0", + "eslint-plugin-autofix": "^1.1.0", "eslint-plugin-html": "6.2.0", "eslint-plugin-import": "2.25.4", "eslint-plugin-node": "11.1.0", @@ -140,6 +141,7 @@ "eslint-plugin-security-node": "1.1.1", "eslint-plugin-typescript-sort-keys": "2.1.0", "eslint-plugin-unicorn": "41.0.0", + "eslint-plugin-unused-imports": "^2.0.0", "event-hooks-webpack-plugin": "2.2.0", "fork-ts-checker-webpack-plugin": "7.2.1", "graphql-hooks": "5.7.0", diff --git a/src/constants/languages.ts b/src/constants/languages.ts index 28b06862..cff122fb 100644 --- a/src/constants/languages.ts +++ b/src/constants/languages.ts @@ -2,8 +2,8 @@ import fs from 'fs-extra'; import path from 'path'; import { LOCALIZATION_FOLDER } from '@/constants/paths'; -export const supportedLanguagesMap = JSON.parse(fs.readFileSync(path.join(LOCALIZATION_FOLDER, 'supportedLanguages.json'), 'utf-8')) as Record; -export const tiddlywikiLanguagesMap = JSON.parse(fs.readFileSync(path.join(LOCALIZATION_FOLDER, 'tiddlywikiLanguages.json'), 'utf-8')) as Record< +export const supportedLanguagesMap = JSON.parse(fs.readFileSync(path.join(LOCALIZATION_FOLDER, 'supportedLanguages.json'))) as Record; +export const tiddlywikiLanguagesMap = JSON.parse(fs.readFileSync(path.join(LOCALIZATION_FOLDER, 'tiddlywikiLanguages.json'))) as Record< string, string | undefined >; diff --git a/src/main.ts b/src/main.ts index e514b041..825f8e60 100755 --- a/src/main.ts +++ b/src/main.ts @@ -9,7 +9,6 @@ import { ipcMain, protocol, powerMonitor, app } from 'electron'; import settings from 'electron-settings'; import unhandled from 'electron-unhandled'; -import { clearMainBindings } from '@services/libs/i18n/i18nMainBindings'; import { buildLanguageMenu } from '@services/menu/buildLanguageMenu'; import { MainChannel } from '@/constants/channels'; import { isTest } from '@/constants/environment'; diff --git a/src/pages/EditWorkspace/index.tsx b/src/pages/EditWorkspace/index.tsx index bdffa042..da7fede4 100644 --- a/src/pages/EditWorkspace/index.tsx +++ b/src/pages/EditWorkspace/index.tsx @@ -1,7 +1,7 @@ /* eslint-disable unicorn/no-useless-undefined */ /* eslint-disable @typescript-eslint/strict-boolean-expressions */ /* eslint-disable unicorn/no-null */ -import React, { useMemo, useCallback } from 'react'; +import React, { useCallback } from 'react'; import styled, { css } from 'styled-components'; import { useTranslation } from 'react-i18next'; import { Helmet } from 'react-helmet'; diff --git a/src/pages/Main/index.tsx b/src/pages/Main/index.tsx index 05daf660..eb492546 100644 --- a/src/pages/Main/index.tsx +++ b/src/pages/Main/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback } from 'react'; +import React from 'react'; import styled, { css } from 'styled-components'; import { useTranslation } from 'react-i18next'; import { Helmet } from 'react-helmet'; diff --git a/src/renderer.tsx b/src/renderer.tsx index 0237b128..27f989ba 100644 --- a/src/renderer.tsx +++ b/src/renderer.tsx @@ -12,7 +12,6 @@ import CssBaseline from '@material-ui/core/CssBaseline'; import { I18nextProvider } from 'react-i18next'; import 'typeface-roboto/index.css'; -import { WindowNames, IPreferenceWindowMeta } from '@services/windows/WindowProperties'; import { useThemeObservable } from '@services/theme/hooks'; import { darkTheme, lightTheme } from '@services/theme/defaultTheme'; import { initI18N } from './i18n'; diff --git a/src/services/menu/index.ts b/src/services/menu/index.ts index 7417155a..eabd8954 100644 --- a/src/services/menu/index.ts +++ b/src/services/menu/index.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-misused-promises */ /* eslint-disable @typescript-eslint/require-await */ -import { Menu, MenuItemConstructorOptions, shell, ContextMenuParams, WebContents, MenuItem, ipcMain, app } from 'electron'; +import { Menu, MenuItemConstructorOptions, shell, ContextMenuParams, WebContents, MenuItem, app } from 'electron'; import { debounce, take, drop, reverse, remove, compact } from 'lodash'; import { injectable } from 'inversify'; import type { IMenuService, IOnContextMenuInfo } from './interface'; diff --git a/src/services/native/externalApp/win32.ts b/src/services/native/externalApp/win32.ts index f9ea84c0..1d64884f 100644 --- a/src/services/native/externalApp/win32.ts +++ b/src/services/native/externalApp/win32.ts @@ -334,7 +334,7 @@ const gitGUIApp: WindowsExternalEditor[] = [ function getKeyOrEmpty(keys: readonly RegistryValue[], key: string): string { const entry = keys.find((k) => k.name === key); - return entry && entry.type === RegistryValueType.REG_SZ ? entry.data : ''; + return entry !== undefined && entry.type === RegistryValueType.REG_SZ ? entry.data : ''; } function getAppInfo(editor: WindowsExternalEditor, keys: readonly RegistryValue[]): IWindowsAppInformation { diff --git a/src/services/view/index.ts b/src/services/view/index.ts index 54e2cabc..7821a723 100644 --- a/src/services/view/index.ts +++ b/src/services/view/index.ts @@ -5,7 +5,7 @@ import { injectable } from 'inversify'; import serviceIdentifier from '@services/serviceIdentifier'; import type { IPreferenceService } from '@services/preferences/interface'; -import type { IWorkspaceMetaData, IWorkspaceService } from '@services/workspaces/interface'; +import type { IWorkspaceService } from '@services/workspaces/interface'; import type { IWorkspaceViewService } from '@services/workspacesView/interface'; import type { IWindowService } from '@services/windows/interface'; import type { IMenuService } from '@services/menu/interface'; diff --git a/src/services/view/setupViewEventHandlers.ts b/src/services/view/setupViewEventHandlers.ts index 7c83d295..cf119071 100644 --- a/src/services/view/setupViewEventHandlers.ts +++ b/src/services/view/setupViewEventHandlers.ts @@ -21,7 +21,6 @@ import { container } from '@services/container'; import { MetaDataChannel, ViewChannel, WindowChannel } from '@/constants/channels'; import { logger } from '@services/libs/log'; import { getLocalHostUrlWithActualIP } from '@services/libs/url'; -import { LOAD_VIEW_MAX_RETRIES } from '@/constants/parameters'; import { SETTINGS_FOLDER } from '@/constants/appPaths'; import { throttle } from 'lodash'; diff --git a/src/services/wiki/wikiWorker.ts b/src/services/wiki/wikiWorker.ts index e8c665a9..d2b7fda6 100644 --- a/src/services/wiki/wikiWorker.ts +++ b/src/services/wiki/wikiWorker.ts @@ -13,7 +13,7 @@ import { mkdtemp, writeFile } from 'fs-extra'; import { fixPath } from '@services/libs/fixPath'; import { IWikiMessage, WikiControlActions, ZxWorkerControlActions, IZxWorkerMessage } from './interface'; import { defaultServerIP } from '@/constants/urls'; -import { executeScriptInTWContext, extractTWContextScripts, getTWVmContext, TW_SCRIPT_SEPARATOR } from './plugin/zxPlugin'; +import { executeScriptInTWContext, extractTWContextScripts, getTWVmContext } from './plugin/zxPlugin'; fixPath(); let wikiInstance: I$TW | undefined; diff --git a/src/services/windows/index.ts b/src/services/windows/index.ts index ac1d9bb4..2ebb1f55 100644 --- a/src/services/windows/index.ts +++ b/src/services/windows/index.ts @@ -21,7 +21,7 @@ import getViewBounds from '@services/libs/getViewBounds'; import getFromRenderer from '@services/libs/getFromRenderer'; import { lazyInject } from '@services/container'; import { IWindowService } from './interface'; -import { isDevelopmentOrTest, isTest } from '@/constants/environment'; +import { isTest } from '@/constants/environment'; import { MENUBAR_ICON_PATH } from '@/constants/paths'; import { getLocalHostUrlWithActualIP } from '@services/libs/url'; import { SETTINGS_FOLDER } from '@/constants/appPaths'; diff --git a/src/services/workspacesView/interface.ts b/src/services/workspacesView/interface.ts index 8241ea2e..d2082f03 100644 --- a/src/services/workspacesView/interface.ts +++ b/src/services/workspacesView/interface.ts @@ -1,7 +1,7 @@ import { ProxyPropertyType } from 'electron-ipc-cat/common'; import { WorkspaceViewChannel } from '@/constants/channels'; -import { IWorkspace, INewWorkspaceConfig } from '@services/workspaces/interface'; +import { IWorkspace } from '@services/workspaces/interface'; export interface IInitializeWorkspaceOptions { /**