jest-codemods
Version:
Codemods for migrating test files to Jest
51 lines (50 loc) • 2.28 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
var consts_1 = require("../utils/consts");
var imports_1 = require("../utils/imports");
var jestGlobalsImport = function (fileInfo, api) {
var j = api.jscodeshift;
var ast = j(fileInfo.source);
var jestGlobalsUsed = new Set();
var isImplicitlyInScope = function (expression, globalName) {
return Boolean(expression.scope.lookup(globalName) &&
ast.find(j.ImportSpecifier, { imported: { name: globalName } }).size() === 0);
};
consts_1.JEST_GLOBALS.forEach(function (globalName) {
if (ast
.find(j.CallExpression, { callee: { name: globalName } })
.filter(function (callExpression) { return !isImplicitlyInScope(callExpression, globalName); })
.size() > 0 ||
ast
.find(j.MemberExpression, { object: { name: globalName } })
.filter(function (memberExpression) { return !isImplicitlyInScope(memberExpression, globalName); })
.size() > 0) {
jestGlobalsUsed.add(globalName);
}
});
var jestGlobalsImports = (0, imports_1.findImports)(j, ast, '@jest/globals');
var hasJestGlobalsImport = jestGlobalsImports.length > 0;
var needsJestGlobalsImport = jestGlobalsUsed.size > 0;
if (!needsJestGlobalsImport) {
if (!hasJestGlobalsImport)
return null;
(0, imports_1.removeRequireAndImport)(j, ast, '@jest/globals');
}
else {
var jestGlobalsImport_1 = hasJestGlobalsImport
? jestGlobalsImports.get().value
: j.importDeclaration([], j.stringLiteral('@jest/globals'));
var specifiers_1 = jestGlobalsImport_1.specifiers;
var existingNames_1 = new Set(specifiers_1.map(function (s) { return s.imported.name; }));
jestGlobalsUsed.forEach(function (jestGlobal) {
if (!existingNames_1.has(jestGlobal)) {
specifiers_1.push(j.importSpecifier(j.identifier(jestGlobal)));
}
});
if (!hasJestGlobalsImport) {
ast.find(j.Program).get('body', 0).insertBefore(jestGlobalsImport_1);
}
}
return ast.toSource({ quote: 'single' });
};
exports.default = jestGlobalsImport;
;