github-pages-deploy-action/node_modules/eslint-plugin-jest/lib/rules/no-test-callback.js

128 lines
4.0 KiB
JavaScript
Raw Normal View History

2020-03-07 11:45:40 +08:00
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
2020-03-31 20:40:00 +08:00
var _experimentalUtils = require("@typescript-eslint/experimental-utils");
2020-03-07 11:45:40 +08:00
2020-03-31 20:40:00 +08:00
var _utils = require("./utils");
2020-03-07 11:45:40 +08:00
var _default = (0, _utils.createRule)({
name: __filename,
meta: {
docs: {
category: 'Best Practices',
description: 'Avoid using a callback in asynchronous tests',
2020-06-27 02:01:06 +08:00
recommended: false,
suggestion: true
2020-03-07 11:45:40 +08:00
},
messages: {
2020-03-31 20:40:00 +08:00
illegalTestCallback: 'Illegal usage of test callback',
2020-06-27 02:01:06 +08:00
suggestWrappingInPromise: 'Wrap in `new Promise({{ callback }} => ...`',
2020-03-31 20:40:00 +08:00
useAwaitInsteadOfCallback: 'Use await instead of callback in async functions'
2020-03-07 11:45:40 +08:00
},
schema: [],
type: 'suggestion'
},
defaultOptions: [],
create(context) {
return {
CallExpression(node) {
if (!(0, _utils.isTestCase)(node) || node.arguments.length !== 2) {
return;
}
2020-03-31 20:40:00 +08:00
const [, callback] = node.arguments;
2020-03-07 11:45:40 +08:00
if (!(0, _utils.isFunction)(callback) || callback.params.length !== 1) {
return;
}
2020-03-31 20:40:00 +08:00
const [argument] = callback.params;
2020-06-27 02:01:06 +08:00
if (argument.type !== _experimentalUtils.AST_NODE_TYPES.Identifier) {
context.report({
node: argument,
messageId: 'illegalTestCallback'
});
return;
}
2020-03-31 20:40:00 +08:00
if (callback.async) {
context.report({
node: argument,
messageId: 'useAwaitInsteadOfCallback'
});
return;
}
2020-03-07 11:45:40 +08:00
context.report({
node: argument,
messageId: 'illegalTestCallback',
2020-06-27 02:01:06 +08:00
suggest: [{
messageId: 'suggestWrappingInPromise',
data: {
callback: argument.name
},
fix(fixer) {
const {
body
} = callback;
/* istanbul ignore if https://github.com/typescript-eslint/typescript-eslint/issues/734 */
if (!body) {
throw new Error(`Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
}
const sourceCode = context.getSourceCode();
const firstBodyToken = sourceCode.getFirstToken(body);
const lastBodyToken = sourceCode.getLastToken(body);
const tokenBeforeArgument = sourceCode.getTokenBefore(argument);
const tokenAfterArgument = sourceCode.getTokenAfter(argument);
/* istanbul ignore if */
if (!firstBodyToken || !lastBodyToken || !tokenBeforeArgument || !tokenAfterArgument) {
throw new Error(`Unexpected null when attempting to fix ${context.getFilename()} - please file a github issue at https://github.com/jest-community/eslint-plugin-jest`);
}
const argumentInParens = tokenBeforeArgument.value === '(' && tokenAfterArgument.value === ')';
let argumentFix = fixer.replaceText(argument, '()');
if (argumentInParens) {
argumentFix = fixer.remove(argument);
}
let newCallback = argument.name;
if (argumentInParens) {
newCallback = `(${newCallback})`;
}
let beforeReplacement = `new Promise(${newCallback} => `;
let afterReplacement = ')';
let replaceBefore = true;
if (body.type === _experimentalUtils.AST_NODE_TYPES.BlockStatement) {
const keyword = 'return';
beforeReplacement = `${keyword} ${beforeReplacement}{`;
afterReplacement += '}';
replaceBefore = false;
}
return [argumentFix, replaceBefore ? fixer.insertTextBefore(firstBodyToken, beforeReplacement) : fixer.insertTextAfter(firstBodyToken, beforeReplacement), fixer.insertTextAfter(lastBodyToken, afterReplacement)];
2020-03-07 11:45:40 +08:00
}
2020-06-27 02:01:06 +08:00
}]
2020-03-07 11:45:40 +08:00
});
}
};
}
});
exports.default = _default;