eslint-plugin-jest-formatting 1.1.0 → 2.0.1

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.
Files changed (32) hide show
  1. package/.circleci/config.yml +2 -2
  2. package/.eslintrc +15 -4
  3. package/README.md +12 -12
  4. package/docs/rules/padding-around-all.md +13 -0
  5. package/lib/ast-utils.js +41 -0
  6. package/lib/index.js +156 -84
  7. package/lib/rules/padding.js +131 -158
  8. package/package.json +21 -20
  9. package/src/ast-utils.ts +80 -0
  10. package/src/index.ts +163 -89
  11. package/src/rules/padding.ts +263 -252
  12. package/tests/catfood.js +41 -0
  13. package/tests/dogfood.spec.js +2 -0
  14. package/tests/lib/ast-utils.spec.ts +94 -0
  15. package/tests/lib/rules/padding-around-after-all-blocks.spec.js +3 -8
  16. package/tests/lib/rules/padding-around-after-each-blocks.spec.js +3 -8
  17. package/tests/lib/rules/padding-around-before-all-blocks.spec.js +3 -8
  18. package/tests/lib/rules/padding-around-before-each-blocks.spec.js +3 -8
  19. package/tests/lib/rules/padding-around-describe-blocks.spec.js +7 -12
  20. package/tests/lib/rules/padding-around-expect-groups.spec.js +3 -8
  21. package/tests/lib/rules/padding-around-test-blocks.spec.js +15 -12
  22. package/tsconfig.json +1 -1
  23. package/lib/utils.js +0 -15
  24. package/src/utils.ts +0 -40
  25. package/tests/lib/rules/padding-before-after-all-blocks.spec.js +0 -104
  26. package/tests/lib/rules/padding-before-after-each-blocks.spec.js +0 -104
  27. package/tests/lib/rules/padding-before-before-all-blocks.spec.js +0 -104
  28. package/tests/lib/rules/padding-before-before-each-blocks.spec.js +0 -104
  29. package/tests/lib/rules/padding-before-describe-blocks.spec.js +0 -150
  30. package/tests/lib/rules/padding-before-expect-statements.spec.js +0 -144
  31. package/tests/lib/rules/padding-before-test-blocks.spec.js +0 -159
  32. package/yarn.lock +0 -4232
@@ -7,7 +7,7 @@ version: 2
7
7
  defaults: &defaults
8
8
  working_directory: ~/repo
9
9
  docker:
10
- - image: circleci/node:8.10.0
10
+ - image: circleci/node:10
11
11
 
12
12
  jobs:
13
13
  test:
@@ -28,7 +28,7 @@ jobs:
28
28
  command: yarn test
29
29
 
30
30
  - run: yarn lint
31
-
31
+
32
32
  - save_cache:
33
33
  paths:
34
34
  - node_modules
package/.eslintrc CHANGED
@@ -3,21 +3,32 @@
3
3
  "parserOptions": {
4
4
  "sourceType": "module"
5
5
  },
6
- "plugins": ["jest-formatting", "jest"],
6
+ "plugins": ["jest-formatting", "jest", "@typescript-eslint/eslint-plugin"],
7
7
  "env": {
8
8
  "jest/globals": true
9
9
  },
10
10
  "extends": [
11
11
  "airbnb-base",
12
+ "plugin:@typescript-eslint/recommended",
12
13
  "plugin:prettier/recommended",
13
- "plugin:jest-formatting/recommended"
14
+ "plugin:jest-formatting/recommended",
15
+ "plugin:import/typescript"
14
16
  ],
15
17
  "overrides": [
16
18
  {
17
19
  "files": ["**.*"],
18
20
  "rules": {
19
- "camelcase": "off"
21
+ "camelcase": "off",
22
+ "no-plusplus": "off",
23
+ "import/extensions": "off"
20
24
  }
21
25
  }
22
- ]
26
+ ],
27
+ "settings": {
28
+ "import/resolver": {
29
+ "typescript": {
30
+ "alwaysTryTypes": true // Without this `@types/estree` `estree` isn't actually in our node_modules.
31
+ }
32
+ }
33
+ }
23
34
  }
package/README.md CHANGED
@@ -1,20 +1,22 @@
1
1
  [![CircleCI](https://circleci.com/gh/dangreenisrael/eslint-plugin-jest-formatting/tree/master.svg?style=svg)](https://circleci.com/gh/dangreenisrael/eslint-plugin-jest-formatting/tree/master)
2
2
  ![npm monthly downloads](https://img.shields.io/npm/dm/eslint-plugin-jest-formatting.svg)
3
3
 
4
- **_Note: The master version may not be the version deployed to npm. Please treat https://www.npmjs.com/package/eslint-plugin-jest-formatting as the cannonical source for docs._**
5
-
6
4
  # eslint-plugin-jest-formatting
7
5
 
6
+ This package provides ESLint rules for jest test suites.
7
+
8
8
  This project aims to provide formatting rules (auto-fixable where possible) to ensure consistency and readability in jest test suites.
9
9
 
10
10
  Like this plugin? [Say thanks with a ⭐️](https://github.com/dangreenisrael/eslint-plugin-jest-formatting/stargazers)
11
11
 
12
+ **_Note: The master version may not be the version deployed to npm. Please treat https://www.npmjs.com/package/eslint-plugin-jest-formatting as the cannonical source for docs._**
13
+
12
14
  ## Installation
13
15
 
14
16
  You'll first need to install [ESLint](http://eslint.org):
15
17
 
16
18
  ```
17
- $ yarn add eslint -dev
19
+ $ yarn add eslint --dev
18
20
  ```
19
21
 
20
22
  Next, install `eslint-plugin-jest-formatting`:
@@ -73,14 +75,12 @@ We also support a "strict" settings which enabled all of the rules for you
73
75
  - [padding-around-expect-groups](docs/rules/padding-around-expect-groups.md)
74
76
  - [padding-around-describe-blocks](docs/rules/padding-around-describe-blocks.md)
75
77
  - [padding-around-test-blocks](docs/rules/padding-around-test-blocks.md)
78
+ - [padding-around-all](docs/rules/padding-around-all.md)
79
+
80
+ ## Related Projects
81
+
82
+ ### eslint-plugin-jest
76
83
 
77
- ### Deprecated
84
+ This provides an extensive set of jest eslint rules
78
85
 
79
- - [padding-before-all](docs/rules/padding-before-all.md)
80
- - [padding-before-before-each-blocks](docs/rules/padding-before-before-each-blocks.md)
81
- - [padding-before-after-each-blocks](docs/rules/padding-before-after-each-blocks.md)
82
- - [padding-before-before-all-blocks](docs/rules/padding-before-before-all-blocks.md)
83
- - [padding-before-after-all-blocks](docs/rules/padding-before-after-all-blocks.md)
84
- - [padding-before-describe-blocks](docs/rules/padding-before-describe-blocks.md)
85
- - [padding-before-expect-statements](docs/rules/padding-before-expect-statements.md)
86
- - [padding-before-test-blocks](docs/rules/padding-before-test-blocks.md)
86
+ https://github.com/jest-community/eslint-plugin-jest
@@ -0,0 +1,13 @@
1
+ # padding-around-all
2
+
3
+ ## Rule Details
4
+
5
+ This is a meta rule that simply enables all of the following rules:
6
+
7
+ - [padding-around-after-all-blocks](padding-around-after-all-blocks.md)
8
+ - [padding-around-after-each-blocks](padding-around-after-each-blocks.md)
9
+ - [padding-around-before-all-blocks](padding-around-before-all-blocks.md)
10
+ - [padding-around-before-each-blocks](padding-around-before-each-blocks.md)
11
+ - [padding-around-expect-groups](padding-around-expect-groups.md)
12
+ - [padding-around-describe-blocks](padding-around-describe-blocks.md)
13
+ - [padding-around-test-blocks](padding-around-test-blocks.md)
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPaddingLineSequences = exports.getActualLastToken = exports.isValidParent = exports.areTokensOnSameLine = exports.isTokenASemicolon = void 0;
4
+ exports.isTokenASemicolon = (token) => token.value === ';' && token.type === 'Punctuator';
5
+ exports.areTokensOnSameLine = (left, right) => left.loc.end.line === right.loc.start.line;
6
+ const STATEMENT_LIST_PARENTS = new Set([
7
+ 'Program',
8
+ 'BlockStatement',
9
+ 'SwitchCase',
10
+ 'SwitchStatement',
11
+ ]);
12
+ exports.isValidParent = (parentType) => {
13
+ return STATEMENT_LIST_PARENTS.has(parentType);
14
+ };
15
+ exports.getActualLastToken = (sourceCode, node) => {
16
+ const semiToken = sourceCode.getLastToken(node);
17
+ const prevToken = sourceCode.getTokenBefore(semiToken);
18
+ const nextToken = sourceCode.getTokenAfter(semiToken);
19
+ const isSemicolonLessStyle = Boolean(prevToken &&
20
+ nextToken &&
21
+ prevToken.range[0] >= node.range[0] &&
22
+ exports.isTokenASemicolon(semiToken) &&
23
+ semiToken.loc.start.line !== prevToken.loc.end.line &&
24
+ semiToken.loc.end.line === nextToken.loc.start.line);
25
+ return isSemicolonLessStyle ? prevToken : semiToken;
26
+ };
27
+ exports.getPaddingLineSequences = (prevNode, nextNode, sourceCode) => {
28
+ const pairs = [];
29
+ const includeComments = true;
30
+ let prevToken = exports.getActualLastToken(sourceCode, prevNode);
31
+ if (nextNode.loc.start.line - prevToken.loc.end.line >= 2) {
32
+ do {
33
+ const token = sourceCode.getTokenAfter(prevToken, { includeComments });
34
+ if (token.loc.start.line - prevToken.loc.end.line >= 2) {
35
+ pairs.push([prevToken, token]);
36
+ }
37
+ prevToken = token;
38
+ } while (prevToken.range[0] < nextNode.range[0]);
39
+ }
40
+ return pairs;
41
+ };
package/lib/index.js CHANGED
@@ -1,98 +1,170 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_1 = require("./utils");
4
- exports.rules = {
5
- 'padding-around-after-all-blocks': utils_1.makeRule([
6
- { blankLine: 'always', prev: '*', next: 'afterAll' },
7
- { blankLine: 'always', prev: 'afterAll', next: '*' },
8
- ]),
9
- 'padding-around-after-each-blocks': utils_1.makeRule([
10
- { blankLine: 'always', prev: '*', next: 'afterEach' },
11
- { blankLine: 'always', prev: 'afterEach', next: '*' },
12
- ]),
13
- 'padding-around-before-all-blocks': utils_1.makeRule([
14
- { blankLine: 'always', prev: '*', next: 'beforeAll' },
15
- { blankLine: 'always', prev: 'beforeAll', next: '*' },
16
- ]),
17
- 'padding-around-before-each-blocks': utils_1.makeRule([
18
- { blankLine: 'always', prev: '*', next: 'beforeEach' },
19
- { blankLine: 'always', prev: 'beforeEach', next: '*' },
20
- ]),
21
- 'padding-around-describe-blocks': utils_1.makeRule([
22
- { blankLine: 'always', prev: '*', next: 'describe' },
23
- { blankLine: 'always', prev: 'describe', next: '*' },
24
- ]),
25
- 'padding-around-test-blocks': utils_1.makeRule([
26
- { blankLine: 'always', prev: '*', next: ['test', 'it'] },
27
- { blankLine: 'always', prev: ['test', 'it'], next: '*' },
28
- ]),
29
- 'padding-before-after-all-blocks': utils_1.makeRule([
30
- { blankLine: 'always', prev: '*', next: 'afterAll' },
31
- ]),
32
- 'padding-before-after-each-blocks': utils_1.makeRule([
33
- { blankLine: 'always', prev: '*', next: 'afterEach' },
34
- ]),
35
- 'padding-before-before-all-blocks': utils_1.makeRule([
36
- { blankLine: 'always', prev: '*', next: 'beforeAll' },
37
- ]),
38
- 'padding-before-before-each-blocks': utils_1.makeRule([
39
- { blankLine: 'always', prev: '*', next: 'beforeEach' },
40
- ]),
41
- 'padding-before-describe-blocks': utils_1.makeRule([
42
- { blankLine: 'always', prev: '*', next: 'describe' },
43
- ]),
44
- 'padding-before-expect-statements': utils_1.makeRule([
45
- { blankLine: 'always', prev: '*', next: 'expect' },
46
- { blankLine: 'any', prev: 'expect', next: 'expect' },
47
- ]),
48
- 'padding-around-expect-groups': utils_1.makeRule([
49
- { blankLine: 'always', prev: '*', next: 'expect' },
50
- { blankLine: 'always', prev: 'expect', next: '*' },
51
- { blankLine: 'any', prev: 'expect', next: 'expect' },
52
- ]),
53
- 'padding-before-test-blocks': utils_1.makeRule([
54
- { blankLine: 'always', prev: '*', next: ['test', 'it'] },
55
- ]),
56
- 'padding-before-all': utils_1.makeRule([
3
+ exports.configs = exports.rules = void 0;
4
+ const padding_1 = require("./rules/padding");
5
+ const paddingConfigs = {
6
+ afterAll: [
7
+ {
8
+ paddingType: 1,
9
+ prevStatementType: 0,
10
+ nextStatementType: 1,
11
+ },
12
+ {
13
+ paddingType: 1,
14
+ prevStatementType: 1,
15
+ nextStatementType: 0,
16
+ },
17
+ ],
18
+ afterEach: [
19
+ {
20
+ paddingType: 1,
21
+ prevStatementType: 0,
22
+ nextStatementType: 2,
23
+ },
24
+ {
25
+ paddingType: 1,
26
+ prevStatementType: 2,
27
+ nextStatementType: 0,
28
+ },
29
+ ],
30
+ beforeAll: [
31
+ {
32
+ paddingType: 1,
33
+ prevStatementType: 0,
34
+ nextStatementType: 3,
35
+ },
36
+ {
37
+ paddingType: 1,
38
+ prevStatementType: 3,
39
+ nextStatementType: 0,
40
+ },
41
+ ],
42
+ beforeEach: [
43
+ {
44
+ paddingType: 1,
45
+ prevStatementType: 0,
46
+ nextStatementType: 4,
47
+ },
48
+ {
49
+ paddingType: 1,
50
+ prevStatementType: 4,
51
+ nextStatementType: 0,
52
+ },
53
+ ],
54
+ describe: [
55
+ {
56
+ paddingType: 1,
57
+ prevStatementType: 0,
58
+ nextStatementType: [
59
+ 5,
60
+ 7,
61
+ 11,
62
+ ],
63
+ },
64
+ {
65
+ paddingType: 1,
66
+ prevStatementType: [
67
+ 5,
68
+ 7,
69
+ 11,
70
+ ],
71
+ nextStatementType: 0,
72
+ },
73
+ ],
74
+ expect: [
75
+ {
76
+ paddingType: 1,
77
+ prevStatementType: 0,
78
+ nextStatementType: 6,
79
+ },
80
+ {
81
+ paddingType: 1,
82
+ prevStatementType: 6,
83
+ nextStatementType: 0,
84
+ },
57
85
  {
58
- blankLine: 'always',
59
- prev: '*',
60
- next: [
61
- 'afterAll',
62
- 'afterEach',
63
- 'beforeAll',
64
- 'beforeEach',
65
- 'describe',
66
- 'expect',
67
- 'it',
68
- 'test',
86
+ paddingType: 0,
87
+ prevStatementType: 6,
88
+ nextStatementType: 6,
89
+ },
90
+ ],
91
+ test: [
92
+ {
93
+ paddingType: 1,
94
+ prevStatementType: 0,
95
+ nextStatementType: [
96
+ 10,
97
+ 9,
98
+ 8,
99
+ 12,
100
+ 13,
101
+ ],
102
+ },
103
+ {
104
+ paddingType: 1,
105
+ prevStatementType: [
106
+ 10,
107
+ 9,
108
+ 8,
109
+ 12,
110
+ 13,
69
111
  ],
112
+ nextStatementType: 0,
70
113
  },
71
- { blankLine: 'any', prev: 'expect', next: 'expect' },
72
- ]),
114
+ ],
115
+ };
116
+ exports.rules = {
117
+ 'padding-around-after-all-blocks': padding_1.createRule(paddingConfigs.afterAll),
118
+ 'padding-around-after-each-blocks': padding_1.createRule(paddingConfigs.afterEach),
119
+ 'padding-around-before-all-blocks': padding_1.createRule(paddingConfigs.beforeAll),
120
+ 'padding-around-before-each-blocks': padding_1.createRule(paddingConfigs.beforeEach),
121
+ 'padding-around-describe-blocks': padding_1.createRule(paddingConfigs.describe),
122
+ 'padding-around-expect-groups': padding_1.createRule(paddingConfigs.expect),
123
+ 'padding-around-test-blocks': padding_1.createRule(paddingConfigs.test),
124
+ 'padding-around-all': padding_1.createRule([].concat(...Object.keys(paddingConfigs).map((k) => paddingConfigs[k]))),
73
125
  };
74
126
  exports.configs = {
75
127
  recommended: {
76
128
  plugins: ['jest-formatting'],
77
- rules: {
78
- 'jest-formatting/padding-around-after-all-blocks': 2,
79
- 'jest-formatting/padding-around-after-each-blocks': 2,
80
- 'jest-formatting/padding-around-before-all-blocks': 2,
81
- 'jest-formatting/padding-around-before-each-blocks': 2,
82
- 'jest-formatting/padding-around-describe-blocks': 2,
83
- 'jest-formatting/padding-around-test-blocks': 2,
84
- },
129
+ overrides: [
130
+ {
131
+ files: [
132
+ '**/*.test.*',
133
+ '**/*_test.*',
134
+ '**/*Test.*',
135
+ '**/*.spec.*',
136
+ '**/*_spec.*',
137
+ '**/*Spec.*',
138
+ '**/__tests__/*',
139
+ ],
140
+ rules: {
141
+ 'jest-formatting/padding-around-after-all-blocks': 2,
142
+ 'jest-formatting/padding-around-after-each-blocks': 2,
143
+ 'jest-formatting/padding-around-before-all-blocks': 2,
144
+ 'jest-formatting/padding-around-before-each-blocks': 2,
145
+ 'jest-formatting/padding-around-describe-blocks': 2,
146
+ 'jest-formatting/padding-around-test-blocks': 2,
147
+ },
148
+ },
149
+ ],
85
150
  },
86
151
  strict: {
87
152
  plugins: ['jest-formatting'],
88
- rules: {
89
- 'jest-formatting/padding-around-after-all-blocks': 2,
90
- 'jest-formatting/padding-around-after-each-blocks': 2,
91
- 'jest-formatting/padding-around-before-all-blocks': 2,
92
- 'jest-formatting/padding-around-before-each-blocks': 2,
93
- 'jest-formatting/padding-around-expect-groups': 2,
94
- 'jest-formatting/padding-around-describe-blocks': 2,
95
- 'jest-formatting/padding-around-test-blocks': 2,
96
- },
153
+ overrides: [
154
+ {
155
+ files: [
156
+ '**/*.test.*',
157
+ '**/*_test.*',
158
+ '**/*Test.*',
159
+ '**/*.spec.*',
160
+ '**/*_spec.*',
161
+ '**/*Spec.*',
162
+ '**/__tests__/*',
163
+ ],
164
+ rules: {
165
+ 'jest-formatting/padding-around-all': 2,
166
+ },
167
+ },
168
+ ],
97
169
  },
98
170
  };