UNPKG

eslint-plugin-jest

Version:
115 lines (94 loc) 3.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _experimentalUtils = require("@typescript-eslint/experimental-utils"); var _utils = require("./utils"); const trimFXprefix = word => ['f', 'x'].includes(word.charAt(0)) ? word.substr(1) : word; var _default = (0, _utils.createRule)({ name: __filename, meta: { docs: { category: 'Best Practices', description: 'Enforce valid titles', recommended: false }, messages: { titleMustBeString: 'Title must be a string', emptyTitle: '{{ jestFunctionName }} should not have an empty title', duplicatePrefix: 'should not have duplicate prefix', accidentalSpace: 'should not have leading or trailing spaces' }, type: 'suggestion', schema: [{ type: 'object', properties: { ignoreTypeOfDescribeName: { type: 'boolean', default: false } }, additionalProperties: false }], fixable: 'code' }, defaultOptions: [{ ignoreTypeOfDescribeName: false }], create(context, [{ ignoreTypeOfDescribeName }]) { return { CallExpression(node) { if (!((0, _utils.isDescribe)(node) || (0, _utils.isTestCase)(node)) || !node.arguments.length) { return; } const [argument] = node.arguments; if (!(0, _utils.isStringNode)(argument)) { if (argument.type !== _experimentalUtils.AST_NODE_TYPES.TemplateLiteral && !(ignoreTypeOfDescribeName && (0, _utils.isDescribe)(node))) { context.report({ messageId: 'titleMustBeString', loc: argument.loc }); } return; } const title = (0, _utils.getStringValue)(argument); if (!title) { context.report({ messageId: 'emptyTitle', data: { jestFunctionName: (0, _utils.isDescribe)(node) ? _utils.DescribeAlias.describe : _utils.TestCaseName.test }, node }); return; } if (title.trim().length !== title.length) { context.report({ messageId: 'accidentalSpace', node: argument, fix(fixer) { const stringValue = argument.type === _experimentalUtils.AST_NODE_TYPES.TemplateLiteral ? `\`${argument.quasis[0].value.raw}\`` : argument.raw; return [fixer.replaceTextRange(argument.range, stringValue.replace(/^([`'"]) +?/, '$1').replace(/ +?([`'"])$/, '$1'))]; } }); } const nodeName = trimFXprefix((0, _utils.getNodeName)(node.callee)); const [firstWord] = title.split(' '); if (firstWord.toLowerCase() === nodeName) { context.report({ messageId: 'duplicatePrefix', node: argument, fix(fixer) { const stringValue = argument.type === _experimentalUtils.AST_NODE_TYPES.TemplateLiteral ? `\`${argument.quasis[0].value.raw}\`` : argument.raw; return [fixer.replaceTextRange(argument.range, stringValue.replace(/^([`'"]).+? /, '$1'))]; } }); } } }; } }); exports.default = _default;