UNPKG

2.33 kBJavaScriptView Raw
1'use strict';
2
3const { getDocsUrl, isTestCase } = require('./util');
4
5module.exports = {
6 meta: {
7 docs: {
8 url: getDocsUrl(__filename),
9 },
10 fixable: 'code',
11 },
12 create(context) {
13 return {
14 CallExpression(node) {
15 if (!isTestCase(node) || node.arguments.length !== 2) {
16 return;
17 }
18
19 const [, callback] = node.arguments;
20
21 if (
22 !/^(Arrow)?FunctionExpression$/.test(callback.type) ||
23 callback.params.length !== 1
24 ) {
25 return;
26 }
27
28 const [argument] = callback.params;
29 context.report({
30 node: argument,
31 message: 'Illegal usage of test callback',
32 fix(fixer) {
33 const sourceCode = context.getSourceCode();
34 const { body } = callback;
35 const firstBodyToken = sourceCode.getFirstToken(body);
36 const lastBodyToken = sourceCode.getLastToken(body);
37 const tokenBeforeArgument = sourceCode.getTokenBefore(argument);
38 const tokenAfterArgument = sourceCode.getTokenAfter(argument);
39 const argumentInParens =
40 tokenBeforeArgument.value === '(' &&
41 tokenAfterArgument.value === ')';
42
43 let argumentFix = fixer.replaceText(argument, '()');
44
45 if (argumentInParens) {
46 argumentFix = fixer.remove(argument);
47 }
48
49 let newCallback = argument.name;
50
51 if (argumentInParens) {
52 newCallback = `(${newCallback})`;
53 }
54
55 let beforeReplacement = `new Promise(${newCallback} => `;
56 let afterReplacement = ')';
57 let replaceBefore = true;
58
59 if (body.type === 'BlockStatement') {
60 const keyword = callback.async ? 'await' : 'return';
61
62 beforeReplacement = `${keyword} ${beforeReplacement}{`;
63 afterReplacement += '}';
64 replaceBefore = false;
65 }
66
67 return [
68 argumentFix,
69 replaceBefore
70 ? fixer.insertTextBefore(firstBodyToken, beforeReplacement)
71 : fixer.insertTextAfter(firstBodyToken, beforeReplacement),
72 fixer.insertTextAfter(lastBodyToken, afterReplacement),
73 ];
74 },
75 });
76 },
77 };
78 },
79};