Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new rule #5

Merged
merged 4 commits into from
Oct 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 6 additions & 13 deletions README-ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,16 @@

## 安装

你首先需要安装 [ESLint](https://eslint.org/):
你首先需要安装 [ESLint](https://eslint.org/) 和约定的第三方插件包:

```sh
yarn add eslint

or

npm i eslint --save-dev
yarn add eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-import eslint-plugin-prettier eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-simple-import-sort eslint-plugin-unicorn prettier typescript eslint-plugin-eslint-plugin --dev
```

接下来,安装 `@sj-distributor/eslint-plugin-react-native`:

```sh

yarn add @sj-distributor/eslint-plugin-react-native

or

npm install @sj-distributor/eslint-plugin-react-native --save-dev
yarn add @sj-distributor/eslint-plugin-react-native --dev
```

## 使用
Expand All @@ -36,7 +27,7 @@ Add `eslint-plugin-react-native` to the extends section of your `.eslintrc` conf

```json
{
"extends": ["plugin:@sj-distributor/eslint-plugin-react-native/recommended"]
"extends": ["plugin:@sj-distributor/react-native/recommended"]
}
```

Expand All @@ -52,3 +43,5 @@ Add `eslint-plugin-react-native` to the extends section of your `.eslintrc` conf
- [eslint-plugin-react-hooks](https://www.npmjs.com/package/eslint-plugin-react-hooks)
- [eslint-plugin-react-native](https://github.com/intellicode/eslint-plugin-react-native)
- [eslint-plugin-simple-import-sort](https://github.com/lydell/eslint-plugin-simple-import-sort#readme)
- [@typescript-eslint](https://typescript-eslint.io/)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
19 changes: 6 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,16 @@ ESLint presets for react native

## Installation

You'll first need to install [ESLint](https://eslint.org/):
You'll first need to install [ESLint](https://eslint.org/) and the agreed third-party plug-in package:

```sh
yarn add eslint

or

npm i eslint --save-dev
yarn add eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint-config-prettier eslint-plugin-import eslint-plugin-prettier eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-simple-import-sort eslint-plugin-unicorn prettier typescript eslint-plugin-eslint-plugin --dev
```

Next, install `@sj-distributor/eslint-plugin-react-native`:

```sh

yarn add @sj-distributor/eslint-plugin-react-native

or

npm install @sj-distributor/eslint-plugin-react-native --save-dev
yarn add @sj-distributor/eslint-plugin-react-native --dev
```

## Usage
Expand All @@ -38,7 +29,7 @@ Add `eslint-plugin-react-native` to the extends section of your `.eslintrc` conf

```json
{
"extends": ["plugin:@sj-distributor/eslint-plugin-react-native/recommended"]
"extends": ["plugin:@sj-distributor/react-native/recommended"]
}
```

Expand All @@ -54,3 +45,5 @@ Add `eslint-plugin-react-native` to the extends section of your `.eslintrc` conf
- [eslint-plugin-react-hooks](https://www.npmjs.com/package/eslint-plugin-react-hooks)
- [eslint-plugin-react-native](https://github.com/intellicode/eslint-plugin-react-native)
- [eslint-plugin-simple-import-sort](https://github.com/lydell/eslint-plugin-simple-import-sort#readme)
- [@typescript-eslint](https://typescript-eslint.io/)
- [eslint-plugin-unicorn](https://github.com/sindresorhus/eslint-plugin-unicorn)
23 changes: 18 additions & 5 deletions configs/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,20 @@ module.exports = {
"eslint:recommended",
"plugin:prettier/recommended",
"plugin:react-hooks/recommended",
"plugin:eslint-plugin/recommended",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
plugins: ["react", "react-native", "simple-import-sort", "unicorn", "import"],
plugins: [
"react",
"react-native",
"simple-import-sort",
"unicorn",
"import",
"@sj-distributor/react-native",
],
env: {
node: true,
es2022: true,
browser: true,
"react-native/react-native": true,
Expand All @@ -34,10 +43,10 @@ module.exports = {
"error",
{
cases: {
kebabCase: true, // 是否支持横杠 (-) 命名
camelCase: false, // 是否支持小驼峰命名
snakeCase: false, // 是否支持 (_) 下划线命名
pascalCase: false, // 是否支持大坨峰命名
kebabCase: true, // 支持横杠 (-) 命名
camelCase: false, // 支持小驼峰命名
snakeCase: false, // 支持 (_) 下划线命名
pascalCase: false, // 支持大坨峰命名
},
},
],
Expand All @@ -54,6 +63,10 @@ module.exports = {
next: "*",
},
],
"@typescript-eslint/no-var-requires": 0, // (关闭) 禁止使用 require 语句
"@sj-distributor/react-native/interface-name-prefix": ["error", "I"], // 默认强制 interface 大写 I 前缀
"react/display-name": 0, // (关闭) 不允许在 React 组件定义中缺少 displayName
"react/self-closing-comp": 2, // 检测 JSX 中的所有组件和 HTML 元素,如果元素没有子元素,就会自动转换为自闭合形式
},
// 共享配置,提供给每一个将被执行的规则
settings: {
Expand Down
3 changes: 2 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
// Requirements
//------------------------------------------------------------------------------

const path = require("path");
const requireIndex = require("requireindex");
const eslintrc = require("../configs/.eslintrc");

Expand All @@ -15,7 +16,7 @@ const eslintrc = require("../configs/.eslintrc");
//------------------------------------------------------------------------------
module.exports = {
// 引入所有的自定义的规则
rules: requireIndex(__dirname + "/rules"),
rules: requireIndex(path.join(__dirname + "/rules")),
configs: {
recommended: eslintrc,
},
Expand Down
64 changes: 64 additions & 0 deletions lib/rules/interface-name-prefix.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/**
* @fileoverview Require interface names to begin with a specified prefix
*/
"use strict";

//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------

/** @type {import('eslint').Rule.RuleModule} */
module.exports = {
meta: {
type: "suggestion",
docs: {
category: "Naming",
recommended: false,
description: "Require interface names to begin with a specified prefix",
},
fixable: "code",
schema: [
{
type: "string",
},
],
messages: {
missingPrefix:
"Interface name '{{ name }}' should start with '{{ prefix }}'",
},
},

create(context) {
const [prefix = "I"] = context.options;

function checkPrefix(node) {
const name = node.id.name;

if (
typeof name !== "string" ||
name.startsWith(prefix) ||
node.parent.type === "TSModuleDeclaration"
) {
return;
}

context.report({
node,
messageId: "missingPrefix",
data: {
name,
prefix,
},
fix: (fixer) => {
const newName = `${prefix}${name}`;

return fixer.replaceText(node.id, newName);
},
});
}

return {
TSInterfaceDeclaration: checkPrefix,
};
},
};
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@sj-distributor/eslint-plugin-react-native",
"version": "0.2.1",
"version": "0.2.2",
"description": "ESLint presets for react native",
"keywords": [
"eslint",
Expand All @@ -11,7 +11,7 @@
"exports": "./lib/index.js",
"scripts": {
"lint": "eslint .",
"release": "release-it",
"release": "release-it --no-increment",
"test": "mocha tests --recursive"
},
"dependencies": {
Expand Down
Loading