@ornikar/eslint-plugin-ornikar 0.0.1 → 20.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +7 -1
- package/CHANGELOG.md +11 -0
- package/configs/all.js +1 -2
- package/docs/rules/react-function-return-react-node.md +29 -0
- package/loadRules.js +10 -1
- package/package.json +6 -3
- package/rules/{react-function-return-react-node.js → react-function-component-return-react-node.js} +3 -5
- package/rules/{react-function-return-react-node.test.js → react-function-component-return-react-node.test.js} +6 -3
- package/rules/{utils → test-utils}/RuleTester.js +4 -0
- package/.vscode/settings.json +0 -3
- package/rules/forbid-fetch-import.js +0 -40
- package/rules/forbid-fetch-import.test.js +0 -35
package/.eslintrc.json
CHANGED
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Change Log
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
|
+
|
|
6
|
+
## [20.2.0](https://github.com/ornikar/eslint-configs/compare/v20.1.1...v20.2.0) (2023-09-19)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **eslint-plugin-ornikar:** react function return ReactNode [no issue] ([#599](https://github.com/ornikar/eslint-configs/issues/599)) ([2c39241](https://github.com/ornikar/eslint-configs/commit/2c39241f94fa75420c8e0b7885aa47c0dfaa18c4))
|
package/configs/all.js
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Return type of react function component should be ReactNode
|
|
2
|
+
|
|
3
|
+
💼 This rule is enabled in the ✅ `recommended` [config](https://github.com/sindresorhus/eslint-plugin-unicorn#preset-configs).
|
|
4
|
+
|
|
5
|
+
<!-- 🔧 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix). -->
|
|
6
|
+
|
|
7
|
+
## Fail
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
function Component(): ReactElement {
|
|
11
|
+
return <div />;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function Component(): ReactElement | null {
|
|
15
|
+
return <div />;
|
|
16
|
+
}
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Pass
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
function Component(): ReactNode {
|
|
23
|
+
return <div />;
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Options
|
|
28
|
+
|
|
29
|
+
None
|
package/loadRules.js
CHANGED
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
const fs = require('node:fs');
|
|
4
4
|
const path = require('node:path');
|
|
5
|
+
const pkg = require('./package.json');
|
|
6
|
+
|
|
7
|
+
const repoUrl = 'https://github.com/ornikar/eslint-configs';
|
|
8
|
+
const packagePath = '@ornikar/eslint-plugin-ornikar';
|
|
9
|
+
|
|
10
|
+
const getDocumentationUrl = (filename) => {
|
|
11
|
+
const ruleName = path.basename(filename, '.js');
|
|
12
|
+
return `${repoUrl}/blob/v${pkg.version}/${packagePath}/docs/rules/${ruleName}.md`;
|
|
13
|
+
};
|
|
5
14
|
|
|
6
15
|
function loadRule(ruleId) {
|
|
7
16
|
// eslint-disable-next-line import/no-dynamic-require, global-require, security/detect-non-literal-require
|
|
@@ -13,7 +22,7 @@ function loadRule(ruleId) {
|
|
|
13
22
|
...rule.meta,
|
|
14
23
|
docs: {
|
|
15
24
|
...rule.meta.docs,
|
|
16
|
-
|
|
25
|
+
url: getDocumentationUrl(ruleId),
|
|
17
26
|
},
|
|
18
27
|
},
|
|
19
28
|
create: rule.create,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ornikar/eslint-plugin-ornikar",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "20.2.0",
|
|
4
4
|
"description": "eslint plugin for ornikar",
|
|
5
5
|
"repository": {
|
|
6
6
|
"directory": "@ornikar/eslint-plugin-ornikar",
|
|
@@ -32,7 +32,10 @@
|
|
|
32
32
|
"eslint-plugin-react": "^7.33.2"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
+
"@eslint/eslintrc": "2.1.2",
|
|
35
36
|
"@typescript-eslint/rule-tester": "6.7.0",
|
|
36
|
-
"@typescript-eslint/utils": "6.7.0"
|
|
37
|
-
|
|
37
|
+
"@typescript-eslint/utils": "6.7.0",
|
|
38
|
+
"eslint": "8.49.0"
|
|
39
|
+
},
|
|
40
|
+
"gitHead": "84591fd9baf94194eda1ea044933f6f0d52a3231"
|
|
38
41
|
}
|
package/rules/{react-function-return-react-node.js → react-function-component-return-react-node.js}
RENAMED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const { AST_NODE_TYPES } = require('@typescript-eslint/utils');
|
|
4
3
|
const Components = require('eslint-plugin-react/lib/util/Components');
|
|
5
4
|
|
|
6
5
|
exports.meta = {
|
|
@@ -37,7 +36,7 @@ function checkFunctionReturnType(node, onError) {
|
|
|
37
36
|
if (typeName == null) return;
|
|
38
37
|
|
|
39
38
|
if (typeName.name !== 'ReactNode') {
|
|
40
|
-
onError(typeName.name, typeName.range);
|
|
39
|
+
onError(typeName, typeName.name, typeName.range);
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
@@ -46,10 +45,9 @@ exports.create = Components.detect((context, components) => {
|
|
|
46
45
|
FunctionDeclaration(node) {
|
|
47
46
|
if (!components.get(node)) return;
|
|
48
47
|
|
|
49
|
-
checkFunctionReturnType(node, (currentName, range) =>
|
|
48
|
+
checkFunctionReturnType(node, (typeName, currentName, range) =>
|
|
50
49
|
context.report({
|
|
51
|
-
node,
|
|
52
|
-
loc: range,
|
|
50
|
+
node: typeName,
|
|
53
51
|
messageId: 'invalidReturnType',
|
|
54
52
|
data: { value: currentName },
|
|
55
53
|
suggest: [
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const path = require('node:path');
|
|
4
|
-
const rule = require('./react-function-return-react-node');
|
|
5
|
-
const { RuleTester } = require('./utils/RuleTester');
|
|
4
|
+
const rule = require('./react-function-component-return-react-node');
|
|
5
|
+
const { RuleTester } = require('./test-utils/RuleTester');
|
|
6
6
|
|
|
7
7
|
const ruleTester = new RuleTester({
|
|
8
8
|
parser: require.resolve('@typescript-eslint/parser'),
|
|
@@ -15,7 +15,7 @@ const ruleTester = new RuleTester({
|
|
|
15
15
|
},
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
ruleTester.run('react-function-return-react-node', rule, {
|
|
18
|
+
ruleTester.run('react-function-component-return-react-node', rule, {
|
|
19
19
|
valid: [
|
|
20
20
|
{
|
|
21
21
|
code: `
|
|
@@ -37,6 +37,9 @@ export function SomeComponent(): ReactElement {
|
|
|
37
37
|
{
|
|
38
38
|
messageId: 'invalidReturnType',
|
|
39
39
|
data: { value: 'ReactElement' },
|
|
40
|
+
line: 3,
|
|
41
|
+
column: 34,
|
|
42
|
+
endColumn: 46,
|
|
40
43
|
suggestions: [
|
|
41
44
|
{
|
|
42
45
|
messageId: 'replaceReturnType',
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line import/no-unresolved -- waiting for node 18
|
|
1
4
|
const { after, describe, it } = require('node:test');
|
|
5
|
+
// eslint-disable-next-line import/no-unresolved, import/order -- missing main field
|
|
2
6
|
const { RuleTester } = require('@typescript-eslint/rule-tester');
|
|
3
7
|
|
|
4
8
|
RuleTester.afterAll = after;
|
package/.vscode/settings.json
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
exports.meta = {
|
|
4
|
-
type: 'problem',
|
|
5
|
-
|
|
6
|
-
docs: {
|
|
7
|
-
description: 'Forbid node-fetch import now that fetch is available in node and browsers',
|
|
8
|
-
category: 'Best Practices',
|
|
9
|
-
recommended: true,
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
messages: {
|
|
13
|
-
forbidden: 'import from "{{value}}" is forbidden. Fetch is available in browsers and node since 18.0.0.',
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
const fetchLibs = ['node-fetch', 'cross-fetch', 'isomorphic-fetch'];
|
|
18
|
-
|
|
19
|
-
exports.create = (context) => {
|
|
20
|
-
const checkNode = (node) => {
|
|
21
|
-
const importSource = node.source.value.trim();
|
|
22
|
-
|
|
23
|
-
if (fetchLibs.includes(importSource)) {
|
|
24
|
-
context.report({
|
|
25
|
-
node,
|
|
26
|
-
messageId: 'forbidden',
|
|
27
|
-
data: { value: importSource },
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
return {
|
|
32
|
-
ImportDeclaration: checkNode,
|
|
33
|
-
ExportNamedDeclaration(node) {
|
|
34
|
-
if (node.source) {
|
|
35
|
-
checkNode(node);
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
ExportAllDeclaration: checkNode,
|
|
39
|
-
};
|
|
40
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { RuleTester } = require('eslint');
|
|
4
|
-
const rule = require('./forbid-fetch-import');
|
|
5
|
-
|
|
6
|
-
const parserOptions = {
|
|
7
|
-
ecmaVersion: 2018,
|
|
8
|
-
sourceType: 'module',
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
const ruleTester = new RuleTester({ parserOptions });
|
|
12
|
-
|
|
13
|
-
ruleTester.run('forbid-fetch-import', rule, {
|
|
14
|
-
valid: [
|
|
15
|
-
{
|
|
16
|
-
code: `
|
|
17
|
-
fetch('https://example.com');
|
|
18
|
-
`,
|
|
19
|
-
},
|
|
20
|
-
],
|
|
21
|
-
invalid: [
|
|
22
|
-
{
|
|
23
|
-
code: `
|
|
24
|
-
import fetch from 'node-fetch';
|
|
25
|
-
fetch('https://example.com');
|
|
26
|
-
`,
|
|
27
|
-
errors: [
|
|
28
|
-
{
|
|
29
|
-
messageId: 'forbidden',
|
|
30
|
-
data: { value: 'node-fetch' },
|
|
31
|
-
},
|
|
32
|
-
],
|
|
33
|
-
},
|
|
34
|
-
],
|
|
35
|
-
});
|