eslint-plugin-jest-formatting 1.0.0 → 2.0.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.
Files changed (33) hide show
  1. package/.circleci/config.yml +2 -2
  2. package/.eslintrc +15 -4
  3. package/CHANGELOG.md +28 -6
  4. package/README.md +21 -13
  5. package/docs/rules/padding-around-all.md +13 -0
  6. package/lib/ast-utils.js +41 -0
  7. package/lib/index.js +159 -76
  8. package/lib/rules/padding.js +131 -158
  9. package/package.json +20 -19
  10. package/src/ast-utils.ts +80 -0
  11. package/src/index.ts +166 -81
  12. package/src/rules/padding.ts +263 -252
  13. package/tests/catfood.js +41 -0
  14. package/tests/dogfood.spec.js +2 -0
  15. package/tests/lib/ast-utils.spec.ts +94 -0
  16. package/tests/lib/rules/padding-around-after-all-blocks.spec.js +3 -8
  17. package/tests/lib/rules/padding-around-after-each-blocks.spec.js +3 -8
  18. package/tests/lib/rules/padding-around-before-all-blocks.spec.js +3 -8
  19. package/tests/lib/rules/padding-around-before-each-blocks.spec.js +3 -8
  20. package/tests/lib/rules/padding-around-describe-blocks.spec.js +7 -12
  21. package/tests/lib/rules/padding-around-expect-groups.spec.js +3 -8
  22. package/tests/lib/rules/padding-around-test-blocks.spec.js +15 -12
  23. package/tsconfig.json +1 -1
  24. package/lib/utils.js +0 -15
  25. package/src/utils.ts +0 -40
  26. package/tests/lib/rules/padding-before-after-all-blocks.spec.js +0 -104
  27. package/tests/lib/rules/padding-before-after-each-blocks.spec.js +0 -104
  28. package/tests/lib/rules/padding-before-before-all-blocks.spec.js +0 -104
  29. package/tests/lib/rules/padding-before-before-each-blocks.spec.js +0 -104
  30. package/tests/lib/rules/padding-before-describe-blocks.spec.js +0 -150
  31. package/tests/lib/rules/padding-before-expect-statements.spec.js +0 -144
  32. package/tests/lib/rules/padding-before-test-blocks.spec.js +0 -159
  33. 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/CHANGELOG.md CHANGED
@@ -1,20 +1,42 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.1.0 - August 14, 2019
4
+
5
+ ### Changed
6
+
7
+ - Removed `padding-around-expect-groups` from the "recommended" set of rules.
8
+
9
+ ### Added
10
+
11
+ - Exposes "strict" rules for eslint `extends`. This preset is equivalent to version `1.0.0`'s "recommended" preset.
12
+
13
+ ## v1.0.0 - August 12, 2019
14
+
15
+ ### Added
16
+
17
+ - Exposes "recommended" rules for eslint `extends`
18
+
19
+ - Improve documentation
20
+
21
+ ### Deprecated
22
+
23
+ - The `padding-before-all` rule has been deprecated
24
+
3
25
  ## v0.1.0 - July 20, 2019
4
26
 
5
27
  ### Rules Added
6
28
 
7
- - padding-before-all
29
+ - `padding-before-all`
8
30
 
9
- - padding-before-after-all-blocks
31
+ - `padding-before-after-all-blocks`
10
32
 
11
- - padding-before-after-each-blocks
33
+ - `padding-before-after-each-blocks`
12
34
 
13
- - padding-before-before-all-blocks
35
+ - `padding-before-before-all-blocks`
14
36
 
15
- - padding-before-before-each-blocks
37
+ - `padding-before-before-each-blocks`
16
38
 
17
- - padding-before-expect-statements
39
+ - `padding-before-expect-statements`
18
40
 
19
41
  ### Other
20
42
 
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`:
@@ -48,7 +50,7 @@ Then configure the rules you want to use under the rules section.
48
50
 
49
51
  _or_
50
52
 
51
- You can use our recommeneded settings which enables all of the rules for you
53
+ You can use our "recommended" settings which enables most of the rules for you
52
54
 
53
55
  ```json
54
56
  {
@@ -56,6 +58,14 @@ You can use our recommeneded settings which enables all of the rules for you
56
58
  }
57
59
  ```
58
60
 
61
+ We also support a "strict" settings which enabled all of the rules for you
62
+
63
+ ```json
64
+ {
65
+ "extends": ["plugin:jest-formatting/strict"]
66
+ }
67
+ ```
68
+
59
69
  ## Rule Documentation
60
70
 
61
71
  - [padding-around-after-all-blocks](docs/rules/padding-around-after-all-blocks.md)
@@ -65,14 +75,12 @@ You can use our recommeneded settings which enables all of the rules for you
65
75
  - [padding-around-expect-groups](docs/rules/padding-around-expect-groups.md)
66
76
  - [padding-around-describe-blocks](docs/rules/padding-around-describe-blocks.md)
67
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
68
83
 
69
- ### Deprecated
84
+ This provides an extensive set of jest eslint rules
70
85
 
71
- - [padding-before-all](docs/rules/padding-before-all.md)
72
- - [padding-before-before-each-blocks](docs/rules/padding-before-before-each-blocks.md)
73
- - [padding-before-after-each-blocks](docs/rules/padding-before-after-each-blocks.md)
74
- - [padding-before-before-all-blocks](docs/rules/padding-before-before-all-blocks.md)
75
- - [padding-before-after-all-blocks](docs/rules/padding-before-after-all-blocks.md)
76
- - [padding-before-describe-blocks](docs/rules/padding-before-describe-blocks.md)
77
- - [padding-before-expect-statements](docs/rules/padding-before-expect-statements.md)
78
- - [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,87 +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: [
57
19
  {
58
- blankLine: 'always',
59
- prev: '*',
60
- next: [
61
- 'afterAll',
62
- 'afterEach',
63
- 'beforeAll',
64
- 'beforeEach',
65
- 'describe',
66
- 'expect',
67
- 'it',
68
- 'test',
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,
69
62
  ],
70
63
  },
71
- { blankLine: 'any', prev: 'expect', next: 'expect' },
72
- ]),
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
+ },
85
+ {
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,
111
+ ],
112
+ nextStatementType: 0,
113
+ },
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-expect-groups': 2,
83
- 'jest-formatting/padding-around-describe-blocks': 2,
84
- 'jest-formatting/padding-around-test-blocks': 2,
85
- },
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
+ ],
150
+ },
151
+ strict: {
152
+ plugins: ['jest-formatting'],
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
+ ],
86
169
  },
87
170
  };