From 7df772cda53b7aa3aa386dc10b4d9ddbeedd6086 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Wed, 6 Apr 2022 16:25:10 +0200 Subject: [PATCH] Made ESLint lint all TypeScript files and fix a few linter errors (#273) * Remove unused import of preact/h * Remove unused imports * Create 273.misc * Lint all TypeScript files * Re-add preact/h import * Fix a few ESLint errors * Update 273.misc * Readd eslint:recommended * Update .eslintrc.js Co-authored-by: Will Hunt --- .eslintrc.js | 46 +- changelog.d/273.misc | 1 + package.json | 3 +- src/Connections/FigmaFileConnection.ts | 2 +- src/Jira/AdminCommands.ts | 1 - src/Jira/Client.ts | 2 +- src/Jira/Router.ts | 2 - src/Jira/client/OnPremClient.ts | 5 +- web/App.tsx | 8 +- web/BridgeAPI.ts | 2 +- web/components/AdminSettings.tsx | 6 +- web/components/GitHubState.tsx | 2 +- yarn.lock | 787 ++++++++++++++++++++++++- 13 files changed, 832 insertions(+), 35 deletions(-) create mode 100644 changelog.d/273.misc diff --git a/.eslintrc.js b/.eslintrc.js index 4d3234c6..d5a9e34d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -2,20 +2,56 @@ module.exports = { root: true, parser: '@typescript-eslint/parser', plugins: [ - '@typescript-eslint', - 'mocha' + '@typescript-eslint' ], extends: [ 'eslint:recommended', 'plugin:@typescript-eslint/recommended', ], + // eslint-config-preact needs a Jest version to be happy, even if Jest isn't used. + // See https://github.com/preactjs/eslint-config-preact/issues/19#issuecomment-997924892 + settings: { + jest: { "version": 27 }, + }, rules: { "@typescript-eslint/explicit-module-boundary-types": "off", "camelcase": ["error", { "properties": "never", "ignoreDestructuring": true }], "no-console": "error" }, - "env": { - "node": true, - "es6": true, + env: { + node: true, + es6: true, }, + overrides: [ + { + files: ["test/**/*.ts"], + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + 'mocha', + ], + }, + { + files: ["web/**/*.ts", "web/**/*.tsx"], + parser: '@typescript-eslint/parser', + env: { + browser: true, + node: false, + }, + extends: [ + 'plugin:@typescript-eslint/recommended', + 'preact', + ], + plugins: [ + '@typescript-eslint', + ], + rules: { + "no-console": "off", + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["error"], + "no-useless-constructor": "off", + "@typescript-eslint/no-useless-constructor": ["error"], + }, + } + ] }; \ No newline at end of file diff --git a/changelog.d/273.misc b/changelog.d/273.misc new file mode 100644 index 00000000..fdbc530f --- /dev/null +++ b/changelog.d/273.misc @@ -0,0 +1 @@ +Made ESLint lint all TypeScript files and fix a few linter errors. diff --git a/package.json b/package.json index 5e2dc9c8..13bdf62f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "start:matrixsender": "node --require source-map-support/register lib/App/MatrixSenderApp.js", "test": "mocha -r ts-node/register tests/init.ts tests/*.ts tests/**/*.ts", "lint": "yarn run lint:js && yarn run lint:rs", - "lint:js": "eslint -c .eslintrc.js src/**/*.ts", + "lint:js": "eslint -c .eslintrc.js 'src/**/*.ts' 'tests/**/*.ts' 'web/**/*.ts' 'web/**/*.tsx'", "lint:rs": "cargo fmt --all -- --check", "generate-default-config": "ts-node src/Config/Defaults.ts --config > config.sample.yml", "validate-config": "ts-node src/Config/Config.ts" @@ -81,6 +81,7 @@ "@typescript-eslint/parser": "^5.4.0", "chai": "^4.3.4", "eslint": "^8.3.0", + "eslint-config-preact": "^1.3.0", "eslint-plugin-mocha": "^9.0.0", "mini.css": "^3.0.1", "mocha": "^8.2.1", diff --git a/src/Connections/FigmaFileConnection.ts b/src/Connections/FigmaFileConnection.ts index 2e91fa0e..b7ffac61 100644 --- a/src/Connections/FigmaFileConnection.ts +++ b/src/Connections/FigmaFileConnection.ts @@ -1,4 +1,4 @@ -import { Appservice, MatrixClient, RichReply } from "matrix-bot-sdk"; +import { Appservice, MatrixClient } from "matrix-bot-sdk"; import markdownit from "markdown-it"; import { FigmaPayload } from "../figma/types"; import { BaseConnection } from "./BaseConnection"; diff --git a/src/Jira/AdminCommands.ts b/src/Jira/AdminCommands.ts index 7ff2a427..a4318709 100644 --- a/src/Jira/AdminCommands.ts +++ b/src/Jira/AdminCommands.ts @@ -2,7 +2,6 @@ import { AdminRoomCommandHandler } from "../AdminRoomCommandHandler"; import { botCommand } from "../BotCommands"; import { JiraAPIAccessibleResource } from "./Types"; import LogWrapper from "../LogWrapper"; -import { CommandError } from "../errors"; import { CLOUD_INSTANCE } from "./Client"; const log = new LogWrapper('JiraBotCommands'); diff --git a/src/Jira/Client.ts b/src/Jira/Client.ts index d02d0537..bba2fd95 100644 --- a/src/Jira/Client.ts +++ b/src/Jira/Client.ts @@ -1,5 +1,5 @@ import axios, { Method } from 'axios'; -import JiraApi, { SearchUserOptions } from 'jira-client'; +import JiraApi from 'jira-client'; import { JiraAccount, JiraAPIAccessibleResource, JiraProject } from './Types'; export function isJiraCloudInstance(host: string) { diff --git a/src/Jira/Router.ts b/src/Jira/Router.ts index 4b192cd2..afbed434 100644 --- a/src/Jira/Router.ts +++ b/src/Jira/Router.ts @@ -6,8 +6,6 @@ import LogWrapper from "../LogWrapper"; import { ApiError, ErrCode } from "../provisioning/api"; import { JiraOAuthRequestCloud, JiraOAuthRequestOnPrem, JiraOAuthRequestResult } from "./OAuth"; import { HookshotJiraApi } from "./Client"; -import { createPublicKey } from "crypto"; -import { readFileSync } from "fs"; const log = new LogWrapper("JiraRouter"); diff --git a/src/Jira/client/OnPremClient.ts b/src/Jira/client/OnPremClient.ts index 797fb4ff..61f29ca9 100644 --- a/src/Jira/client/OnPremClient.ts +++ b/src/Jira/client/OnPremClient.ts @@ -1,14 +1,11 @@ -import { JiraAPIAccessibleResource, JiraProject, JiraCloudProjectSearchResponse, JiraStoredToken, JiraOnPremProjectSearchResponse } from '../Types'; +import { JiraAPIAccessibleResource, JiraProject, JiraStoredToken, JiraOnPremProjectSearchResponse } from '../Types'; import { BridgeConfigJiraOnPremOAuth } from '../../Config/Config'; -import LogWrapper from '../../LogWrapper'; import { decodeJiraToken } from '../OAuth'; import { KeyObject } from 'crypto'; import { HookshotJiraApi, JiraClient } from '../Client'; import JiraApi from 'jira-client'; -const log = new LogWrapper("JiraOnPremClient"); - export class HookshotOnPremJiraApi extends HookshotJiraApi { constructor(options: JiraApi.JiraApiOptions, res: JiraAPIAccessibleResource) { diff --git a/web/App.tsx b/web/App.tsx index e8b97d3e..59369073 100644 --- a/web/App.tsx +++ b/web/App.tsx @@ -58,6 +58,8 @@ export default class App extends Component { this.widgetApi.start(); const roomState = await this.bridgeApi.state(); console.log('Got state', roomState); + // Calling setState is ok because we've awaited a network request. + // eslint-disable-next-line react/no-did-mount-set-state this.setState({ roomState, roomId, @@ -65,6 +67,8 @@ export default class App extends Component { }); } catch (ex) { console.error(`Bridge verifiation failed:`, ex); + // Calling setState is ok because we've awaited a network request. + // eslint-disable-next-line react/no-did-mount-set-state this.setState({ error: ex.message, busy: false, @@ -78,9 +82,9 @@ export default class App extends Component { if (this.state.error) { content = {this.state.error}; } else if (this.state.roomState) { - content = ; + content = ; } else if (this.state.busy) { - content =
; + content =
; } else { content = Invalid state; } diff --git a/web/BridgeAPI.ts b/web/BridgeAPI.ts index ea7571a9..92b91227 100644 --- a/web/BridgeAPI.ts +++ b/web/BridgeAPI.ts @@ -17,7 +17,7 @@ export default class BridgeAPI { method, body: body ? JSON.stringify(body) : undefined, headers: { - 'Authorization': `Bearer ${this.accessToken}`, + Authorization: `Bearer ${this.accessToken}`, // Only set Content-Type if we send a body ...(!!body && { 'Content-Type': 'application/json', diff --git a/web/components/AdminSettings.tsx b/web/components/AdminSettings.tsx index 9174d485..55f0e753 100644 --- a/web/components/AdminSettings.tsx +++ b/web/components/AdminSettings.tsx @@ -8,10 +8,6 @@ interface IProps{ } export default class AdminSettings extends Component { - constructor(props) { - super(props) - } - renderGitHub() { const githubConfig = this.props.roomState.github; if (!githubConfig.enabled) { @@ -29,7 +25,7 @@ export default class AdminSettings extends Component { Your token does not appear to work ; } - return ; + return ; } render() { diff --git a/web/components/GitHubState.tsx b/web/components/GitHubState.tsx index c773015a..1f06a071 100644 --- a/web/components/GitHubState.tsx +++ b/web/components/GitHubState.tsx @@ -6,7 +6,7 @@ const GitHubState: FunctionComponent<{config: BridgeRoomStateGitHub}> = ({ confi return