eslint-plugin-jest-formatting 0.1.0 → 1.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.
Files changed (39) hide show
  1. package/.eslintrc +5 -5
  2. package/CHANGELOG.md +28 -6
  3. package/README.md +29 -9
  4. package/docs/rules/padding-around-after-all-blocks.md +25 -0
  5. package/docs/rules/padding-around-after-each-blocks.md +29 -0
  6. package/docs/rules/padding-around-all.md +13 -0
  7. package/docs/rules/padding-around-before-all-blocks.md +29 -0
  8. package/docs/rules/padding-around-before-each-blocks.md +29 -0
  9. package/docs/rules/padding-around-describe-blocks.md +33 -0
  10. package/docs/rules/padding-around-expect-groups.md +35 -0
  11. package/docs/rules/padding-around-test-blocks.md +39 -0
  12. package/lib/ast-utils.js +40 -0
  13. package/lib/index.js +238 -38
  14. package/lib/rules/padding.js +130 -158
  15. package/package.json +4 -2
  16. package/src/ast-utils.ts +78 -0
  17. package/src/index.ts +282 -43
  18. package/src/rules/padding.ts +261 -252
  19. package/tests/catfood.js +39 -0
  20. package/tests/dogfood.spec.js +16 -1
  21. package/tests/lib/ast-utils.spec.ts +94 -0
  22. package/tests/lib/rules/padding-around-after-all-blocks.spec.js +114 -0
  23. package/tests/lib/rules/padding-around-after-each-blocks.spec.js +112 -0
  24. package/tests/lib/rules/padding-around-before-all-blocks.spec.js +114 -0
  25. package/tests/lib/rules/padding-around-before-each-blocks.spec.js +114 -0
  26. package/tests/lib/rules/padding-around-describe-blocks.spec.js +152 -0
  27. package/tests/lib/rules/padding-around-expect-groups.spec.js +154 -0
  28. package/tests/lib/rules/padding-around-test-blocks.spec.js +161 -0
  29. package/tests/lib/rules/padding-before-after-all-blocks.spec.js +1 -7
  30. package/tests/lib/rules/padding-before-after-each-blocks.spec.js +1 -7
  31. package/tests/lib/rules/padding-before-before-all-blocks.spec.js +1 -7
  32. package/tests/lib/rules/padding-before-before-each-blocks.spec.js +1 -7
  33. package/tests/lib/rules/padding-before-describe-blocks.spec.js +1 -7
  34. package/tests/lib/rules/padding-before-expect-statements.spec.js +1 -7
  35. package/tests/lib/rules/padding-before-test-blocks.spec.js +1 -7
  36. package/tsconfig.json +1 -1
  37. package/yarn.lock +12 -10
  38. package/lib/utils.js +0 -15
  39. package/src/utils.ts +0 -40
package/lib/index.js CHANGED
@@ -1,44 +1,244 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const utils_1 = require("./utils");
3
+ const padding_1 = require("./rules/padding");
4
+ const paddingConfigs = {
5
+ afterAll: [
6
+ {
7
+ paddingType: 1,
8
+ prevStatementType: 0,
9
+ nextStatementType: 1,
10
+ },
11
+ {
12
+ paddingType: 1,
13
+ prevStatementType: 1,
14
+ nextStatementType: 0,
15
+ },
16
+ ],
17
+ afterEach: [
18
+ {
19
+ paddingType: 1,
20
+ prevStatementType: 0,
21
+ nextStatementType: 2,
22
+ },
23
+ {
24
+ paddingType: 1,
25
+ prevStatementType: 2,
26
+ nextStatementType: 0,
27
+ },
28
+ ],
29
+ beforeAll: [
30
+ {
31
+ paddingType: 1,
32
+ prevStatementType: 0,
33
+ nextStatementType: 3,
34
+ },
35
+ {
36
+ paddingType: 1,
37
+ prevStatementType: 3,
38
+ nextStatementType: 0,
39
+ },
40
+ ],
41
+ beforeEach: [
42
+ {
43
+ paddingType: 1,
44
+ prevStatementType: 0,
45
+ nextStatementType: 4,
46
+ },
47
+ {
48
+ paddingType: 1,
49
+ prevStatementType: 4,
50
+ nextStatementType: 0,
51
+ },
52
+ ],
53
+ describe: [
54
+ {
55
+ paddingType: 1,
56
+ prevStatementType: 0,
57
+ nextStatementType: [
58
+ 5,
59
+ 7,
60
+ 11,
61
+ ],
62
+ },
63
+ {
64
+ paddingType: 1,
65
+ prevStatementType: [
66
+ 5,
67
+ 7,
68
+ 11,
69
+ ],
70
+ nextStatementType: 0,
71
+ },
72
+ ],
73
+ expect: [
74
+ {
75
+ paddingType: 1,
76
+ prevStatementType: 0,
77
+ nextStatementType: 6,
78
+ },
79
+ {
80
+ paddingType: 1,
81
+ prevStatementType: 6,
82
+ nextStatementType: 0,
83
+ },
84
+ {
85
+ paddingType: 0,
86
+ prevStatementType: 6,
87
+ nextStatementType: 6,
88
+ },
89
+ ],
90
+ test: [
91
+ {
92
+ paddingType: 1,
93
+ prevStatementType: 0,
94
+ nextStatementType: [
95
+ 10,
96
+ 9,
97
+ 8,
98
+ 12,
99
+ 13,
100
+ ],
101
+ },
102
+ {
103
+ paddingType: 1,
104
+ prevStatementType: [
105
+ 10,
106
+ 9,
107
+ 8,
108
+ 12,
109
+ 13,
110
+ ],
111
+ nextStatementType: 0,
112
+ },
113
+ ],
114
+ };
4
115
  exports.rules = {
5
- 'padding-before-after-all-blocks': utils_1.makeRule([
6
- { blankLine: 'always', prev: '*', next: 'afterAll' },
7
- ]),
8
- 'padding-before-after-each-blocks': utils_1.makeRule([
9
- { blankLine: 'always', prev: '*', next: 'afterEach' },
10
- ]),
11
- 'padding-before-before-all-blocks': utils_1.makeRule([
12
- { blankLine: 'always', prev: '*', next: 'beforeAll' },
13
- ]),
14
- 'padding-before-before-each-blocks': utils_1.makeRule([
15
- { blankLine: 'always', prev: '*', next: 'beforeEach' },
16
- ]),
17
- 'padding-before-describe-blocks': utils_1.makeRule([
18
- { blankLine: 'always', prev: '*', next: 'describe' },
19
- ]),
20
- 'padding-before-expect-statements': utils_1.makeRule([
21
- { blankLine: 'always', prev: '*', next: 'expect' },
22
- { blankLine: 'any', prev: 'expect', next: 'expect' },
23
- ]),
24
- 'padding-before-test-blocks': utils_1.makeRule([
25
- { blankLine: 'always', prev: '*', next: ['test', 'it'] },
26
- ]),
27
- 'padding-before-all': utils_1.makeRule([
28
- {
29
- blankLine: 'always',
30
- prev: '*',
31
- next: [
32
- 'afterAll',
33
- 'afterEach',
34
- 'beforeAll',
35
- 'beforeEach',
36
- 'describe',
37
- 'expect',
38
- 'it',
39
- 'test',
116
+ 'padding-around-after-all-blocks': padding_1.createRule(paddingConfigs.afterAll),
117
+ 'padding-around-after-each-blocks': padding_1.createRule(paddingConfigs.afterEach),
118
+ 'padding-around-before-all-blocks': padding_1.createRule(paddingConfigs.beforeAll),
119
+ 'padding-around-before-each-blocks': padding_1.createRule(paddingConfigs.beforeEach),
120
+ 'padding-around-describe-blocks': padding_1.createRule(paddingConfigs.describe),
121
+ 'padding-around-expect-groups': padding_1.createRule(paddingConfigs.expect),
122
+ 'padding-around-test-blocks': padding_1.createRule(paddingConfigs.test),
123
+ 'padding-around-all': padding_1.createRule([].concat(...Object.keys(paddingConfigs).map(k => paddingConfigs[k]))),
124
+ 'padding-before-after-all-blocks': padding_1.createRule([
125
+ {
126
+ paddingType: 1,
127
+ prevStatementType: 0,
128
+ nextStatementType: 1,
129
+ },
130
+ ], true),
131
+ 'padding-before-after-each-blocks': padding_1.createRule([
132
+ {
133
+ paddingType: 1,
134
+ prevStatementType: 0,
135
+ nextStatementType: 2,
136
+ },
137
+ ], true),
138
+ 'padding-before-before-all-blocks': padding_1.createRule([
139
+ {
140
+ paddingType: 1,
141
+ prevStatementType: 0,
142
+ nextStatementType: 3,
143
+ },
144
+ ], true),
145
+ 'padding-before-before-each-blocks': padding_1.createRule([
146
+ {
147
+ paddingType: 1,
148
+ prevStatementType: 0,
149
+ nextStatementType: 4,
150
+ },
151
+ ], true),
152
+ 'padding-before-describe-blocks': padding_1.createRule([
153
+ {
154
+ paddingType: 1,
155
+ prevStatementType: 0,
156
+ nextStatementType: 5,
157
+ },
158
+ ], true),
159
+ 'padding-before-expect-statements': padding_1.createRule([
160
+ {
161
+ paddingType: 1,
162
+ prevStatementType: 0,
163
+ nextStatementType: 6,
164
+ },
165
+ {
166
+ paddingType: 0,
167
+ prevStatementType: 6,
168
+ nextStatementType: 6,
169
+ },
170
+ ], true),
171
+ 'padding-before-test-blocks': padding_1.createRule([
172
+ {
173
+ paddingType: 1,
174
+ prevStatementType: 0,
175
+ nextStatementType: [10, 9],
176
+ },
177
+ ], true),
178
+ 'padding-before-all': padding_1.createRule([
179
+ {
180
+ paddingType: 1,
181
+ prevStatementType: 0,
182
+ nextStatementType: [
183
+ 1,
184
+ 2,
185
+ 3,
186
+ 4,
187
+ 5,
188
+ 6,
189
+ 9,
190
+ 10,
40
191
  ],
41
192
  },
42
- { blankLine: 'any', prev: 'expect', next: 'expect' },
43
- ]),
193
+ {
194
+ paddingType: 0,
195
+ prevStatementType: 6,
196
+ nextStatementType: 6,
197
+ },
198
+ ], true),
199
+ };
200
+ exports.configs = {
201
+ recommended: {
202
+ plugins: ['jest-formatting'],
203
+ overrides: [
204
+ {
205
+ files: [
206
+ '**/*.test.*',
207
+ '**/*_test.*',
208
+ '**/*Test.*',
209
+ '**/*.spec.*',
210
+ '**/*_spec.*',
211
+ '**/*Spec.*',
212
+ '**/__tests__/*',
213
+ ],
214
+ rules: {
215
+ 'jest-formatting/padding-around-after-all-blocks': 2,
216
+ 'jest-formatting/padding-around-after-each-blocks': 2,
217
+ 'jest-formatting/padding-around-before-all-blocks': 2,
218
+ 'jest-formatting/padding-around-before-each-blocks': 2,
219
+ 'jest-formatting/padding-around-describe-blocks': 2,
220
+ 'jest-formatting/padding-around-test-blocks': 2,
221
+ },
222
+ },
223
+ ],
224
+ },
225
+ strict: {
226
+ plugins: ['jest-formatting'],
227
+ overrides: [
228
+ {
229
+ files: [
230
+ '**/*.test.*',
231
+ '**/*_test.*',
232
+ '**/*Test.*',
233
+ '**/*.spec.*',
234
+ '**/*_spec.*',
235
+ '**/*Spec.*',
236
+ '**/__tests__/*',
237
+ ],
238
+ rules: {
239
+ 'jest-formatting/padding-around-all': 2,
240
+ },
241
+ },
242
+ ],
243
+ },
44
244
  };
@@ -1,190 +1,162 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const STATEMENT_LIST_PARENTS = new Set([
4
- 'Program',
5
- 'BlockStatement',
6
- 'SwitchCase',
7
- 'SwitchStatement',
8
- ]);
9
- const isTokenOnSameLine = (left, right) => left.loc.end.line === right.loc.start.line;
10
- const isSemicolonToken = (token) => token.value === ';' && token.type === 'Punctuator';
11
- const isTestFile = (filename) => filename.includes('test') || filename.includes('spec');
12
- function newJestTokenTester(name) {
13
- return {
14
- test: (node, sourceCode) => {
15
- const token = sourceCode.getFirstToken(node);
16
- return (node.type === 'ExpressionStatement' &&
17
- token.type === 'Identifier' &&
18
- token.value === name);
19
- },
3
+ const astUtils = require("../ast-utils");
4
+ var StatementType;
5
+ (function (StatementType) {
6
+ StatementType[StatementType["Any"] = 0] = "Any";
7
+ StatementType[StatementType["AfterAllToken"] = 1] = "AfterAllToken";
8
+ StatementType[StatementType["AfterEachToken"] = 2] = "AfterEachToken";
9
+ StatementType[StatementType["BeforeAllToken"] = 3] = "BeforeAllToken";
10
+ StatementType[StatementType["BeforeEachToken"] = 4] = "BeforeEachToken";
11
+ StatementType[StatementType["DescribeToken"] = 5] = "DescribeToken";
12
+ StatementType[StatementType["ExpectToken"] = 6] = "ExpectToken";
13
+ StatementType[StatementType["FdescribeToken"] = 7] = "FdescribeToken";
14
+ StatementType[StatementType["FitToken"] = 8] = "FitToken";
15
+ StatementType[StatementType["ItToken"] = 9] = "ItToken";
16
+ StatementType[StatementType["TestToken"] = 10] = "TestToken";
17
+ StatementType[StatementType["XdescribeToken"] = 11] = "XdescribeToken";
18
+ StatementType[StatementType["XitToken"] = 12] = "XitToken";
19
+ StatementType[StatementType["XtestToken"] = 13] = "XtestToken";
20
+ })(StatementType = exports.StatementType || (exports.StatementType = {}));
21
+ var PaddingType;
22
+ (function (PaddingType) {
23
+ PaddingType[PaddingType["Any"] = 0] = "Any";
24
+ PaddingType[PaddingType["Always"] = 1] = "Always";
25
+ })(PaddingType = exports.PaddingType || (exports.PaddingType = {}));
26
+ const createTokenTester = (tokenName) => {
27
+ return (node, sourceCode) => {
28
+ const token = sourceCode.getFirstToken(node);
29
+ return (node.type === 'ExpressionStatement' &&
30
+ token.type === 'Identifier' &&
31
+ token.value === tokenName);
20
32
  };
21
- }
22
- function getActualLastToken(sourceCode, node) {
23
- const semiToken = sourceCode.getLastToken(node);
24
- const prevToken = sourceCode.getTokenBefore(semiToken);
25
- const nextToken = sourceCode.getTokenAfter(semiToken);
26
- const isSemicolonLessStyle = Boolean(prevToken &&
27
- nextToken &&
28
- prevToken.range[0] >= node.range[0] &&
29
- isSemicolonToken(semiToken) &&
30
- semiToken.loc.start.line !== prevToken.loc.end.line &&
31
- semiToken.loc.end.line === nextToken.loc.start.line);
32
- return isSemicolonLessStyle ? prevToken : semiToken;
33
- }
34
- function verifyForAlways(context, prevNode, nextNode, paddingLines) {
33
+ };
34
+ const statementTesters = {
35
+ [0]: () => true,
36
+ [1]: createTokenTester('afterAll'),
37
+ [2]: createTokenTester('afterEach'),
38
+ [3]: createTokenTester('beforeAll'),
39
+ [4]: createTokenTester('beforeEach'),
40
+ [5]: createTokenTester('describe'),
41
+ [6]: createTokenTester('expect'),
42
+ [7]: createTokenTester('fdescribe'),
43
+ [8]: createTokenTester('fit'),
44
+ [9]: createTokenTester('it'),
45
+ [10]: createTokenTester('test'),
46
+ [11]: createTokenTester('xdescribe'),
47
+ [12]: createTokenTester('xit'),
48
+ [13]: createTokenTester('xtest'),
49
+ };
50
+ const paddingAlwaysTester = (prevNode, nextNode, paddingContext) => {
51
+ const { sourceCode, ruleContext } = paddingContext;
52
+ const paddingLines = astUtils.getPaddingLineSequences(prevNode, nextNode, sourceCode);
35
53
  if (paddingLines.length > 0) {
36
54
  return;
37
55
  }
38
- context.report({
56
+ ruleContext.report({
39
57
  node: nextNode,
40
58
  message: 'Expected blank line before this statement.',
41
59
  fix(fixer) {
42
- const sourceCode = context.getSourceCode();
43
- let prevToken = getActualLastToken(sourceCode, prevNode);
60
+ let prevToken = astUtils.getActualLastToken(sourceCode, prevNode);
44
61
  const nextToken = sourceCode.getFirstTokenBetween(prevToken, nextNode, {
45
62
  includeComments: true,
46
63
  filter(token) {
47
- if (isTokenOnSameLine(prevToken, token)) {
64
+ if (astUtils.areTokensOnSameLine(prevToken, token)) {
48
65
  prevToken = token;
49
66
  return false;
50
67
  }
51
68
  return true;
52
69
  },
53
70
  }) || nextNode;
54
- const insertText = isTokenOnSameLine(prevToken, nextToken)
71
+ const insertText = astUtils.areTokensOnSameLine(prevToken, nextToken)
55
72
  ? '\n\n'
56
73
  : '\n';
57
74
  return fixer.insertTextAfter(prevToken, insertText);
58
75
  },
59
76
  });
60
- }
61
- const PaddingTypes = {
62
- any: { verify: () => { } },
63
- always: { verify: verifyForAlways },
64
77
  };
65
- const StatementTypes = {
66
- '*': { test: () => true },
67
- afterAll: newJestTokenTester('afterAll'),
68
- afterEach: newJestTokenTester('afterEach'),
69
- beforeAll: newJestTokenTester('beforeAll'),
70
- beforeEach: newJestTokenTester('beforeEach'),
71
- describe: newJestTokenTester('describe'),
72
- expect: newJestTokenTester('expect'),
73
- it: newJestTokenTester('it'),
74
- test: newJestTokenTester('test'),
78
+ const paddingTesters = {
79
+ [0]: () => true,
80
+ [1]: paddingAlwaysTester,
75
81
  };
76
- exports.default = {
77
- meta: {
78
- fixable: 'whitespace',
79
- schema: {
80
- definitions: {
81
- paddingType: {
82
- enum: Object.keys(PaddingTypes),
83
- },
84
- statementType: {
85
- anyOf: [
86
- { enum: Object.keys(StatementTypes) },
87
- {
88
- type: 'array',
89
- items: { enum: Object.keys(StatementTypes) },
90
- minItems: 1,
91
- uniqueItems: true,
92
- additionalItems: false,
93
- },
94
- ],
95
- },
82
+ const createScopeInfo = () => {
83
+ return (() => {
84
+ let scope = null;
85
+ return {
86
+ get prevNode() {
87
+ return scope.prevNode;
96
88
  },
97
- type: 'array',
98
- items: {
99
- type: 'object',
100
- properties: {
101
- blankLine: { $ref: '#/definitions/paddingType' },
102
- prev: { $ref: '#/definitions/statementType' },
103
- next: { $ref: '#/definitions/statementType' },
104
- },
105
- additionalProperties: false,
106
- required: ['blankLine', 'prev', 'next'],
89
+ set prevNode(node) {
90
+ scope.prevNode = node;
107
91
  },
108
- additionalItems: false,
109
- },
92
+ enter() {
93
+ scope = { upper: scope, prevNode: null };
94
+ },
95
+ exit() {
96
+ scope = scope.upper;
97
+ },
98
+ };
99
+ })();
100
+ };
101
+ const nodeMatchesType = (node, statementType, paddingContext) => {
102
+ let innerStatementNode = node;
103
+ const { sourceCode } = paddingContext;
104
+ while (innerStatementNode.type === 'LabeledStatement') {
105
+ innerStatementNode = innerStatementNode.body;
106
+ }
107
+ if (Array.isArray(statementType)) {
108
+ return statementType.some(type => nodeMatchesType(innerStatementNode, type, paddingContext));
109
+ }
110
+ return statementTesters[statementType](innerStatementNode, sourceCode);
111
+ };
112
+ const testPadding = (prevNode, nextNode, paddingContext) => {
113
+ const { configs } = paddingContext;
114
+ const testType = (type) => paddingTesters[type](prevNode, nextNode, paddingContext);
115
+ for (let i = configs.length - 1; i >= 0; --i) {
116
+ const { prevStatementType: prevType, nextStatementType: nextType, paddingType, } = configs[i];
117
+ if (nodeMatchesType(prevNode, prevType, paddingContext) &&
118
+ nodeMatchesType(nextNode, nextType, paddingContext)) {
119
+ return testType(paddingType);
120
+ }
121
+ }
122
+ return testType(0);
123
+ };
124
+ const verifyNode = (node, paddingContext) => {
125
+ const { scopeInfo } = paddingContext;
126
+ if (!astUtils.isValidParent(node.parent.type)) {
127
+ return;
128
+ }
129
+ if (scopeInfo.prevNode) {
130
+ testPadding(scopeInfo.prevNode, node, paddingContext);
131
+ }
132
+ scopeInfo.prevNode = node;
133
+ };
134
+ exports.createRule = (configs, deprecated = false) => ({
135
+ meta: {
136
+ fixable: 'whitespace',
137
+ deprecated,
110
138
  },
111
139
  create(context) {
112
- const filename = context.getFilename();
113
- if (!isTestFile(filename)) {
114
- return {};
115
- }
116
- const sourceCode = context.getSourceCode();
117
- const configureList = context.options || [];
118
- let scopeInfo = null;
119
- function enterScope() {
120
- scopeInfo = { upper: scopeInfo, prevNode: null };
121
- }
122
- function exitScope() {
123
- scopeInfo = scopeInfo.upper;
124
- }
125
- function match(node, type) {
126
- let innerStatementNode = node;
127
- while (innerStatementNode.type === 'LabeledStatement') {
128
- innerStatementNode = innerStatementNode.body;
129
- }
130
- if (Array.isArray(type)) {
131
- return type.some(match.bind(null, innerStatementNode));
132
- }
133
- return StatementTypes[type].test(innerStatementNode, sourceCode);
134
- }
135
- function getPaddingType(prevNode, nextNode) {
136
- for (let i = configureList.length - 1; i >= 0; --i) {
137
- const { prev, next, blankLine } = configureList[i];
138
- if (match(prevNode, prev) && match(nextNode, next)) {
139
- return PaddingTypes[blankLine];
140
- }
141
- }
142
- return PaddingTypes.any;
143
- }
144
- function getPaddingLineSequences(prevNode, nextNode) {
145
- const pairs = [];
146
- let prevToken = getActualLastToken(sourceCode, prevNode);
147
- if (nextNode.loc.start.line - prevToken.loc.end.line >= 2) {
148
- do {
149
- const token = sourceCode.getTokenAfter(prevToken, {
150
- includeComments: true,
151
- });
152
- if (token.loc.start.line - prevToken.loc.end.line >= 2) {
153
- pairs.push([prevToken, token]);
154
- }
155
- prevToken = token;
156
- } while (prevToken.range[0] < nextNode.range[0]);
157
- }
158
- return pairs;
159
- }
160
- function verify(node) {
161
- const parentType = node.parent.type;
162
- const validParent = STATEMENT_LIST_PARENTS.has(parentType);
163
- if (!validParent) {
164
- return;
165
- }
166
- const { prevNode } = scopeInfo;
167
- if (prevNode) {
168
- const type = getPaddingType(prevNode, node);
169
- const paddingLines = getPaddingLineSequences(prevNode, node);
170
- type.verify(context, prevNode, node, paddingLines);
171
- }
172
- scopeInfo.prevNode = node;
173
- }
174
- function verifyThenEnterScope(node) {
175
- verify(node);
176
- enterScope();
177
- }
140
+ const paddingContext = {
141
+ ruleContext: context,
142
+ sourceCode: context.getSourceCode(),
143
+ scopeInfo: createScopeInfo(),
144
+ configs,
145
+ };
146
+ const { scopeInfo } = paddingContext;
178
147
  return {
179
- Program: enterScope,
180
- BlockStatement: enterScope,
181
- SwitchStatement: enterScope,
182
- 'Program:exit': exitScope,
183
- 'BlockStatement:exit': exitScope,
184
- 'SwitchStatement:exit': exitScope,
185
- ':statement': verify,
186
- SwitchCase: verifyThenEnterScope,
187
- 'SwitchCase:exit': exitScope,
148
+ Program: scopeInfo.enter,
149
+ 'Program:exit': scopeInfo.enter,
150
+ BlockStatement: scopeInfo.enter,
151
+ 'BlockStatement:exit': scopeInfo.exit,
152
+ SwitchStatement: scopeInfo.enter,
153
+ 'SwitchStatement:exit': scopeInfo.exit,
154
+ ':statement': (node) => verifyNode(node, paddingContext),
155
+ SwitchCase: (node) => {
156
+ verifyNode(node, paddingContext);
157
+ scopeInfo.enter();
158
+ },
159
+ 'SwitchCase:exit': scopeInfo.exit,
188
160
  };
189
161
  },
190
- };
162
+ });
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "eslint-plugin-jest-formatting",
3
- "version": "0.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Formatting rules for jest tests",
5
5
  "keywords": [
6
6
  "eslint",
7
7
  "eslintplugin",
8
8
  "eslint-plugin",
9
9
  "jest",
10
- "format"
10
+ "format",
11
+ "formatting",
12
+ "padding"
11
13
  ],
12
14
  "author": "Dan Green-Leipciger",
13
15
  "repository": {