feat(web): add some eslint rules (#531)

This commit is contained in:
q1anx1 2022-08-07 23:12:22 +08:00 committed by GitHub
parent 2de3f85ead
commit 68ab191685
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
41 changed files with 150 additions and 101 deletions

View File

@ -17,11 +17,15 @@
"version": "detect"
}
},
"plugins": ["unused-imports"],
"extends": ["eslint:recommended", "plugin:react/recommended"],
"rules": {
// "eqeqeq": "error",
"semi": ["error", "always"],
// "indent": ["error", 2],
"indent": ["error", 2, {
"ignoredNodes": ["TemplateLiteral"],
"SwitchCase": 1
}],
// follow antd's style guide
"quotes": ["error", "double"],
"jsx-quotes": ["error", "prefer-double"],
@ -45,13 +49,48 @@
"curly": ["error", "all"],
"brace-style": ["error", "1tbs", { "allowSingleLine": true }],
"no-mixed-spaces-and-tabs": "error",
"sort-imports": [
"error",
{
"ignoreDeclarationSort": true
}
],
"no-multiple-empty-lines": [
"error",
{ "max": 1, "maxBOF": 0, "maxEOF": 0 }
],
"space-unary-ops": ["error", { "words": true, "nonwords": false }],
"space-infix-ops": "error",
"key-spacing": ["error", { "beforeColon": false, "afterColon": true }],
"comma-style": ["error", "last"],
"comma-dangle": [
"error",
{
"arrays": "always-multiline",
"objects": "always-multiline",
"imports": "never",
"exports": "never",
"functions": "never"
}
],
"no-multi-spaces": ["error", { "ignoreEOLComments": true }],
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"error",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "none",
"argsIgnorePattern": "^_"
}
],
"react/prop-types": "off",
"react/display-name": "off",
"react/react-in-jsx-scope": "off",
// don't use strict mod now, otherwise there are a lot of errors in the codebase
"no-unused-vars": "warn",
"no-unused-vars": "off",
"react/no-deprecated": "warn",
"no-case-declarations": "warn",
"react/jsx-key": "warn"

View File

@ -31,6 +31,7 @@
"react-dom": "^17.0.2",
"react-dropzone": "^11.0.2",
"react-github-corner": "^2.3.0",
"react-helmet": "^6.1.0",
"react-i18next": "^11.7.0",
"react-markdown": "^4.3.1",
"react-router-dom": "^5.2.0",
@ -38,8 +39,7 @@
"react-scroll": "^1.7.16",
"react-select2-wrapper": "^1.0.4-beta6",
"react-tagsinput": "^3.19.0",
"react-zmage": "0.8.5-beta.36",
"react-helmet": "^6.1.0"
"react-zmage": "0.8.5-beta.36"
},
"scripts": {
"start": "set PORT=3000 && craco start",
@ -66,11 +66,12 @@
]
},
"devDependencies": {
"eslint": "^7.11.0",
"eslint-plugin-react": "^7.30.1",
"eslint-plugin-unused-imports": "^2.0.0",
"husky": "^4.3.8",
"lint-staged": "^10.5.3",
"prettier": "^2.2.1",
"eslint": "^7.11.0",
"eslint-plugin-react": "^7.30.1"
"prettier": "^2.2.1"
},
"husky": {
"hooks": {

View File

@ -18,7 +18,7 @@ import "./App.less";
import "codemirror/lib/codemirror.css";
import {BackTop} from "antd";
import * as Setting from "./Setting";
import {Switch, Route} from "react-router-dom";
import {Route, Switch} from "react-router-dom";
import TopicPage from "./TopicPage";
import Header from "./Header";
import Footer from "./Footer";

View File

@ -11,7 +11,6 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import * as ConfBackend from "./backend/ConfBackend.js";
export const AuthConfig = {
// serverUrl: "https://door.casbin.com",

View File

@ -17,7 +17,7 @@ import * as AccountBackend from "./backend/AccountBackend";
import * as NodeBackend from "./backend/NodeBackend";
import * as Setting from "./Setting";
import * as Conf from "./Conf";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import i18next from "i18next";
import {ServerUrl} from "./Setting";
@ -168,8 +168,8 @@ class Header extends React.Component {
const isSignedIn = this.props.account !== undefined && this.props.account !== null;
const menuStyle = this.props.showMenu
? {
"--show-dropdown": "block",
}
"--show-dropdown": "block",
}
: null;
if (!isSignedIn) {

View File

@ -17,9 +17,8 @@ import * as Setting from "./Setting";
import * as TopicBackend from "./backend/TopicBackend";
import * as TabBackend from "./backend/TabBackend";
import * as NotificationBackend from "./backend/NotificationBackend";
import Avatar from "./Avatar";
import TopicList from "./main/TopicList";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import moment from "moment";
import i18next from "i18next";
import {scoreConverter} from "./main/Tools";

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import i18next from "i18next";
import * as Conf from "../Conf";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as PlaneBackend from "../backend/PlaneBackend.js";
import * as TabBackend from "../backend/TabBackend.js";
import * as NodeBackend from "../backend/NodeBackend";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as PlaneBackend from "../backend/PlaneBackend.js";
import * as Setting from "../Setting";
import Zmage from "react-zmage";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as PosterBackend from "../backend/PosterBackend";
import * as Setting from "../Setting";
import i18next from "i18next";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as SensitiveBackend from "../backend/SensitiveBackend.js";
import * as Setting from "../Setting";
import i18next from "i18next";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TabBackend from "../backend/TabBackend.js";
import * as Setting from "../Setting";
import Select2 from "react-select2-wrapper";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TopicBackend from "../backend/TopicBackend.js";
import * as Setting from "../Setting";
import PageColumn from "../main/PageColumn";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TranslatorBackend from "../backend/TranslatorBackend";
import * as Setting from "../Setting";
import i18next from "i18next";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as Setting from "../Setting";
import i18next from "i18next";
import * as BasicBackend from "../backend/BasicBackend";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as TopicBackend from "../backend/TopicBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import LatestReplyBox from "./LatestReplyBox";
import PageColumn from "./PageColumn";
import TopicList from "./TopicList";
@ -262,8 +262,8 @@ class AllCreatedTopicsBox extends React.Component {
{!pcBrowser ? <div className="sep10" style={{clear: "both"}} /> : null}
{pcBrowser
? this.state.TAB_LIST.map((tab) => {
return this.renderTab(tab);
})
return this.renderTab(tab);
})
: null}
</div>
<TopicList topics={this.state.topics} showNodeName={true} showAvatar={false} timeStandard={"createdTime"} />

View File

@ -16,7 +16,7 @@ import React from "react";
import * as Setting from "../Setting";
import * as BalanceBackend from "../backend/BalanceBackend";
import PageColumn from "./PageColumn";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import i18next from "i18next";
import {scoreConverter} from "./Tools";
import {Helmet} from "react-helmet";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as BalanceBackend from "../backend/BalanceBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import i18next from "i18next";
class CheckinBonusBox extends React.Component {

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TopicBackend from "../backend/TopicBackend";
import * as ReplyBackend from "../backend/ReplyBackend";
import {Controlled as CodeMirror} from "react-codemirror2";

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as FavoritesBackend from "../backend/FavoritesBackend";
import TopicList from "./TopicList";
import PageColumn from "./PageColumn";

View File

@ -17,7 +17,7 @@ import * as FileBackend from "../backend/FileBackend";
import * as Setting from "../Setting";
import * as Tools from "./Tools";
import PageColumn from "./PageColumn";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import "../deopzone.css";
import Dropzone from "react-dropzone";
import i18next from "i18next";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as Setting from "../Setting";
import * as ConfBackend from "../backend/ConfBackend";
import "./NoMatch.css";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as ReplyBackend from "../backend/ReplyBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import PageColumn from "./PageColumn";
import i18next from "i18next";

View File

@ -16,7 +16,7 @@ import React from "react";
import * as Setting from "../Setting";
import * as MemberBackend from "../backend/MemberBackend";
import * as FavoritesBackend from "../backend/FavoritesBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import Avatar from "../Avatar";
import AllCreatedTopicsBox from "./AllCreatedTopicsBox";
import LatestReplyBox from "./LatestReplyBox";

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as NodeBackend from "../backend/NodeBackend";
import * as TopicBackend from "../backend/TopicBackend";
import Select2 from "react-select2-wrapper";

View File

@ -13,7 +13,6 @@
// limitations under the License.
import React from "react";
import Header from "./Header";
import * as NodeBackend from "../backend/NodeBackend";
import * as MemberBackend from "../backend/MemberBackend";
import * as TopicBackend from "../backend/TopicBackend";

View File

@ -18,7 +18,7 @@ import * as TopicBackend from "../backend/TopicBackend";
import * as MemberBackend from "../backend/MemberBackend";
import * as Setting from "../Setting";
import * as Tools from "./Tools";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import "./node-casbin.css";
import "../codemirrorSize.css";
import i18next from "i18next";

View File

@ -17,7 +17,7 @@ import * as Setting from "../Setting";
import * as MemberBackend from "../backend/MemberBackend";
import * as ReplyBackend from "../backend/ReplyBackend";
import * as FavoritesBackend from "../backend/FavoritesBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import "../Reply.css";
import * as Tools from "./Tools";
import "../codemirrorSize.css";

View File

@ -13,7 +13,7 @@
// limitations under the License.
import React from "react";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as Setting from "../Setting";
import "./NoMatch.css";
import i18next from "i18next";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as NodeBackend from "../backend/NodeBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TopicBackend from "../backend/TopicBackend";
import * as FavoritesBackend from "../backend/FavoritesBackend";
import PageColumn from "./PageColumn";

View File

@ -18,7 +18,7 @@ import * as NotificationBackend from "../backend/NotificationBackend";
import PageColumn from "./PageColumn";
import Avatar from "../Avatar";
import "../Notification.css";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import Zmage from "react-zmage";
import ReactMarkdown from "react-markdown";
import i18next from "i18next";

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import "../Bottom.css";
import "./node-casbin.css";
import i18next from "i18next";

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import React from "react";
import i18next from "i18next";
import * as Setting from "../Setting";
@ -70,36 +70,36 @@ class RankingPlayerBox extends React.Component {
<table cellPadding="10" cellSpacing="0" border="0" width="100%">
{this.state.playerList
? this.state.playerList.map((member, key) => (
<tr>
<td width={Setting.PcBrowser ? "65" : "36"} valign="top" align="center" key={key}>
<Avatar username={member.name} avatar={member.avatar} key={key} />
</td>
<td width="auto" align="left">
<h2 style={{marginBottom: "10px", marginTop: "0px", fontSize: "20px"}}>
<span className="gray">{key + 1}.</span> <a href={`/member/${member.name}`}>{member.name}</a>
</h2>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a>{member.bio}</a>{" "}
</span>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a href={member.homepage}>{member.homepage}</a>{" "}
</span>
<div className="sep5"></div>
<span style={{fontSize: "18px", color: "#bbbbbb"}}>
{i18next.t("member:No.")}&nbsp;{member.ranking}&nbsp;{i18next.t("member:member")}
</span>
<div className="sep5"></div>
</td>
<td width="200px" align="center">
<div className="sep20"></div>
<div>{this.renderPlayerBox(member.karma)}</div>
</td>
</tr>
))
<tr>
<td width={Setting.PcBrowser ? "65" : "36"} valign="top" align="center" key={key}>
<Avatar username={member.name} avatar={member.avatar} key={key} />
</td>
<td width="auto" align="left">
<h2 style={{marginBottom: "10px", marginTop: "0px", fontSize: "20px"}}>
<span className="gray">{key + 1}.</span> <a href={`/member/${member.name}`}>{member.name}</a>
</h2>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a>{member.bio}</a>{" "}
</span>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a href={member.homepage}>{member.homepage}</a>{" "}
</span>
<div className="sep5"></div>
<span style={{fontSize: "18px", color: "#bbbbbb"}}>
{i18next.t("member:No.")}&nbsp;{member.ranking}&nbsp;{i18next.t("member:member")}
</span>
<div className="sep5"></div>
</td>
<td width="200px" align="center">
<div className="sep20"></div>
<div>{this.renderPlayerBox(member.karma)}</div>
</td>
</tr>
))
: null}
</table>
</div>

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import React from "react";
import i18next from "i18next";
import * as Setting from "../Setting";
@ -77,27 +77,27 @@ class RankingRichBox extends React.Component {
<table cellPadding="10" cellSpacing="0" border="0" width="100%">
{this.state.richList
? this.state.richList.map((member, key) => (
<tr>
<td width={Setting.PcBrowser ? "73" : "36"} valign="top" align="center" key={key}>
<Avatar username={member.name} avatar={member.avatar} key={key} />
</td>
<td width="auto" align="left">
<h2 style={{marginBottom: "10px", marginTop: "0px"}}>
<span className="gray">{key + 1}.</span> <a href={`/member/${member.name}`}>{member.name}</a>
</h2>
<span className="gray f12"> {member.tag} </span>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a href={member.homepage}>{member.homepage}</a>{" "}
</span>
<div className="sep5"></div>
</td>
<td width="200" align="center">
<div>{this.renderRichBox(member.score)}</div>
</td>
</tr>
))
<tr>
<td width={Setting.PcBrowser ? "73" : "36"} valign="top" align="center" key={key}>
<Avatar username={member.name} avatar={member.avatar} key={key} />
</td>
<td width="auto" align="left">
<h2 style={{marginBottom: "10px", marginTop: "0px"}}>
<span className="gray">{key + 1}.</span> <a href={`/member/${member.name}`}>{member.name}</a>
</h2>
<span className="gray f12"> {member.tag} </span>
<div className="sep5"></div>
<span className="gray f12">
{" "}
<a href={member.homepage}>{member.homepage}</a>{" "}
</span>
<div className="sep5"></div>
</td>
<td width="200" align="center">
<div>{this.renderRichBox(member.score)}</div>
</td>
</tr>
))
: null}
</table>
</div>

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import * as TopicBackend from "../backend/TopicBackend";
import TopicList from "./TopicList";
import PageColumn from "./PageColumn";

View File

@ -17,7 +17,7 @@ import * as Setting from "../Setting";
import * as Conf from "../Conf";
import * as ReplyBackend from "../backend/ReplyBackend";
import * as BalanceBackend from "../backend/BalanceBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import Avatar from "../Avatar";
import NewReplyBox from "./NewReplyBox";
import PageColumn from "./PageColumn";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as TopicBackend from "../backend/TopicBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import PageColumn from "./PageColumn";
import i18next from "i18next";
import TopicList from "./TopicList";

View File

@ -14,7 +14,7 @@
import React from "react";
import * as Setting from "../Setting";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import i18next from "i18next";
import {Helmet} from "react-helmet";

View File

@ -15,7 +15,7 @@
import React from "react";
import * as Setting from "../Setting";
import * as NodeBackend from "../backend/NodeBackend";
import {withRouter, Link} from "react-router-dom";
import {Link, withRouter} from "react-router-dom";
import "../node.css";
import "./rightNodeRelation.css";
import Collapse, {Panel} from "rc-collapse";

View File

@ -14,7 +14,7 @@
import React from "react";
import i18next from "i18next";
import {loadTheme, THEME_OPTIONS} from "../theme";
import {THEME_OPTIONS, loadTheme} from "../theme";
import "./rightTheme.css";
class RightThemeBox extends React.Component {

View File

@ -5028,6 +5028,18 @@ eslint-plugin-testing-library@^3.9.2:
dependencies:
"@typescript-eslint/experimental-utils" "^3.10.1"
eslint-plugin-unused-imports@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520"
integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==
dependencies:
eslint-rule-composer "^0.3.0"
eslint-rule-composer@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9"
integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==
eslint-scope@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"