UNPKG

eslint-plugin-jest

Version:
61 lines (60 loc) 2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _utils = require("@typescript-eslint/utils"); var _utils2 = require("./utils"); var _default = exports.default = (0, _utils2.createRule)({ name: __filename, meta: { docs: { description: 'Disallow using `jest.mock()` factories without an explicit type parameter' }, messages: { addTypeParameterToModuleMock: 'Add a type parameter to the mock factory such as `typeof import({{ moduleName }})`' }, fixable: 'code', schema: [], type: 'suggestion' }, defaultOptions: [], create(context) { return { CallExpression(node) { const { callee, typeArguments } = node; if (callee.type !== _utils.AST_NODE_TYPES.MemberExpression) { return; } const { property } = callee; if (node.arguments.length === 2 && (0, _utils2.isTypeOfJestFnCall)(node, context, ['jest']) && (0, _utils2.isSupportedAccessor)(property) && ['mock', 'doMock'].includes((0, _utils2.getAccessorValue)(property))) { const [nameNode, factoryNode] = node.arguments; const hasTypeParameter = typeArguments !== undefined && typeArguments.params.length > 0; const hasReturnType = (0, _utils2.isFunction)(factoryNode) && factoryNode.returnType !== undefined; if (hasTypeParameter || hasReturnType) { return; } const moduleName = (0, _utils2.findModuleName)(nameNode); context.report({ messageId: 'addTypeParameterToModuleMock', data: { moduleName: moduleName?.raw ?? './module-name' }, node, fix(fixer) { if (!moduleName) { return []; } return [fixer.insertTextAfter(callee, `<typeof import(${moduleName.raw})>`)]; } }); } } }; } });