Skip to content

Commit 3439a29

Browse files
feat: migrate plugin to typescript-eslint (#121)
* refactor: rewrite to @typescript-eslint * style: configure and fix linting errors * build: compile code * fix: get it to work * fix: something went wrong while merging * chore: 100% coverage * fix: TS helper function
1 parent 4d85337 commit 3439a29

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+5769
-3130
lines changed

.eslintrc.json

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,23 @@
66
"jest/globals": true
77
},
88
"extends": [
9-
"standard",
10-
"prettier",
9+
"plugin:@typescript-eslint/eslint-recommended",
10+
"plugin:@typescript-eslint/recommended",
11+
"prettier/@typescript-eslint",
1112
"plugin:jest/recommended",
1213
"plugin:jest-formatting/recommended"
1314
],
14-
"plugins": [
15-
"prettier",
16-
"jest",
17-
"jest-formatting"
18-
],
15+
"plugins": ["@typescript-eslint", "jest", "jest-formatting"],
1916
"globals": {
2017
"Atomics": "readonly",
2118
"SharedArrayBuffer": "readonly"
2219
},
20+
"parser": "@typescript-eslint/parser",
2321
"parserOptions": {
24-
"ecmaVersion": 2018
22+
"project": "./tsconfig.eslint.json"
2523
},
2624
"rules": {
27-
"prettier/prettier": "error",
28-
"no-var": "error"
25+
"no-var": "error",
26+
"@typescript-eslint/explicit-function-return-type": "off"
2927
}
3028
}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Output
2+
dist
3+
14
# Logs
25
logs
36
*.log

.travis.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ node_js:
1010

1111
jobs:
1212
include:
13+
- stage: build
14+
node_js: lts/*
15+
script: npm run build
16+
- stage: test
17+
node_js: lts/*
18+
script: npm run test
1319
- stage: release
1420
if: branch = master AND type != pull_request
1521
node_js: lts/*

jest.config.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
module.exports = {
2-
testMatch: ['**/tests/**/*.js'],
2+
testMatch: ['**/tests/**/*.test.ts'],
3+
transform: {
4+
'^.+\\.tsx?$': 'ts-jest',
5+
},
36
coverageThreshold: {
47
global: {
58
branches: 100,

lib/index.js

Lines changed: 0 additions & 58 deletions
This file was deleted.

lib/index.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import awaitAsyncQuery from './rules/await-async-query';
2+
import awaitAsyncUtils from './rules/await-async-utils';
3+
import awaitFireEvent from './rules/await-fire-event';
4+
import consistentDataTestid from './rules/consistent-data-testid';
5+
import noAwaitSyncQuery from './rules/no-await-sync-query';
6+
import noDebug from './rules/no-debug';
7+
import noDomImport from './rules/no-dom-import';
8+
import noManualCleanup from './rules/no-manual-cleanup';
9+
import noWaitForEmptyCallback from './rules/no-wait-for-empty-callback';
10+
import preferExplicitAssert from './rules/prefer-explicit-assert';
11+
import preferPresenceQueries from './rules/prefer-presence-queries';
12+
import preferScreenQueries from './rules/prefer-screen-queries';
13+
import preferWaitFor from './rules/prefer-wait-for';
14+
15+
const rules = {
16+
'await-async-query': awaitAsyncQuery,
17+
'await-async-utils': awaitAsyncUtils,
18+
'await-fire-event': awaitFireEvent,
19+
'consistent-data-testid': consistentDataTestid,
20+
'no-await-sync-query': noAwaitSyncQuery,
21+
'no-debug': noDebug,
22+
'no-dom-import': noDomImport,
23+
'no-manual-cleanup': noManualCleanup,
24+
'no-wait-for-empty-callback': noWaitForEmptyCallback,
25+
'prefer-explicit-assert': preferExplicitAssert,
26+
'prefer-presence-queries': preferPresenceQueries,
27+
'prefer-screen-queries': preferScreenQueries,
28+
'prefer-wait-for': preferWaitFor,
29+
};
30+
31+
const recommendedRules = {
32+
'testing-library/await-async-query': 'error',
33+
'testing-library/await-async-utils': 'error',
34+
'testing-library/no-await-sync-query': 'error',
35+
};
36+
37+
export = {
38+
rules,
39+
configs: {
40+
recommended: {
41+
plugins: ['testing-library'],
42+
rules: recommendedRules,
43+
},
44+
angular: {
45+
plugins: ['testing-library'],
46+
rules: {
47+
...recommendedRules,
48+
'testing-library/no-debug': 'warn',
49+
'testing-library/no-dom-import': ['error', 'angular'],
50+
},
51+
},
52+
react: {
53+
plugins: ['testing-library'],
54+
rules: {
55+
...recommendedRules,
56+
'testing-library/no-debug': 'warn',
57+
'testing-library/no-dom-import': ['error', 'react'],
58+
},
59+
},
60+
vue: {
61+
plugins: ['testing-library'],
62+
rules: {
63+
...recommendedRules,
64+
'testing-library/await-fire-event': 'error',
65+
'testing-library/no-debug': 'warn',
66+
'testing-library/no-dom-import': ['error', 'vue'],
67+
},
68+
},
69+
},
70+
};

lib/node-utils.ts

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import { TSESTree } from '@typescript-eslint/experimental-utils';
2+
3+
export function isCallExpression(
4+
node: TSESTree.Node
5+
): node is TSESTree.CallExpression {
6+
return node && node.type === 'CallExpression';
7+
}
8+
9+
export function isAwaitExpression(
10+
node: TSESTree.Node
11+
): node is TSESTree.AwaitExpression {
12+
return node && node.type === 'AwaitExpression';
13+
}
14+
15+
export function isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier {
16+
return node && node.type === 'Identifier';
17+
}
18+
19+
export function isMemberExpression(
20+
node: TSESTree.Node
21+
): node is TSESTree.MemberExpression {
22+
return node && node.type === 'MemberExpression';
23+
}
24+
25+
export function isLiteral(node: TSESTree.Node): node is TSESTree.Literal {
26+
return node && node.type === 'Literal';
27+
}
28+
29+
export function isImportSpecifier(
30+
node: TSESTree.Node
31+
): node is TSESTree.ImportSpecifier {
32+
return node && node.type === 'ImportSpecifier';
33+
}
34+
35+
export function isImportDefaultSpecifier(
36+
node: TSESTree.Node
37+
): node is TSESTree.ImportDefaultSpecifier {
38+
return node && node.type === 'ImportDefaultSpecifier';
39+
}
40+
41+
export function isBlockStatement(
42+
node: TSESTree.Node
43+
): node is TSESTree.BlockStatement {
44+
return node && node.type === 'BlockStatement';
45+
}
46+
47+
export function isVariableDeclarator(
48+
node: TSESTree.Node
49+
): node is TSESTree.VariableDeclarator {
50+
return node && node.type === 'VariableDeclarator';
51+
}
52+
53+
export function isObjectPattern(
54+
node: TSESTree.Node
55+
): node is TSESTree.ObjectPattern {
56+
return node && node.type === 'ObjectPattern';
57+
}
58+
59+
export function isProperty(node: TSESTree.Node): node is TSESTree.Property {
60+
return node && node.type === 'Property';
61+
}
62+
63+
export function isJSXAttribute(
64+
node: TSESTree.Node
65+
): node is TSESTree.JSXAttribute {
66+
return node && node.type === 'JSXAttribute';
67+
}
68+
69+
export function findClosestCallExpressionNode(
70+
node: TSESTree.Node
71+
): TSESTree.CallExpression {
72+
if (isCallExpression(node)) {
73+
return node;
74+
}
75+
76+
return findClosestCallExpressionNode(node.parent);
77+
}
78+
79+
export function findClosestCallNode(
80+
node: TSESTree.Node,
81+
name: string
82+
): TSESTree.CallExpression {
83+
if (!node.parent) {
84+
return null;
85+
}
86+
87+
if (
88+
isCallExpression(node) &&
89+
isIdentifier(node.callee) &&
90+
node.callee.name === name
91+
) {
92+
return node;
93+
} else {
94+
return findClosestCallNode(node.parent, name);
95+
}
96+
}
97+
98+
export function hasThenProperty(node: TSESTree.Node) {
99+
return (
100+
isMemberExpression(node) &&
101+
isIdentifier(node.property) &&
102+
node.property.name === 'then'
103+
);
104+
}

0 commit comments

Comments
 (0)