jest-codemods
Version:
Codemods for migrating test files to Jest
269 lines (268 loc) • 8.55 kB
JavaScript
#!/usr/bin/env node
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var chalk_1 = __importDefault(require("chalk"));
var globby_1 = __importDefault(require("globby"));
var inquirer_1 = __importDefault(require("inquirer"));
var meow_1 = __importDefault(require("meow"));
var update_notifier_1 = __importDefault(require("update-notifier"));
var git_status_1 = __importDefault(require("./git-status"));
var transformers_1 = require("./transformers");
var cli = (0, meow_1.default)("\nUsage: npx jest-codemods <path> [options]\n\nExamples: npx jest-codemods src\n npx jest-codemods src/**/*.test.js\n\nOptions:\n -f, --force Bypass Git safety checks and force codemods to run\n -d, --dry Dry run (no changes are made to files)", {
flags: {
force: {
type: 'boolean',
alias: 'f',
},
dry: {
type: 'boolean',
alias: 'd',
},
},
});
function getValidPackage() {
var _a = cli.pkg, name = _a.name, version = _a.version;
if (!name) {
throw new Error('Did not find name in package.json');
}
if (!version) {
throw new Error('Did not find version in package.json');
}
return { name: name, version: version };
}
(0, update_notifier_1.default)({ pkg: getValidPackage() }).notify({ defer: false });
if (!cli.flags.dry) {
(0, git_status_1.default)(cli.flags.force);
}
var TRANSFORMER_AVA = 'ava';
var TRANSFORMER_CHAI_ASSERT = 'chai-assert';
var TRANSFORMER_CHAI_SHOULD = 'chai-should';
var TRANSFORMER_EXPECT_JS = 'expect-js';
var TRANSFORMER_EXPECT_1 = 'expect';
var TRANSFORMER_JASMINE_GLOBALS = 'jasmine-globals';
var TRANSFORMER_JASMINE_THIS = 'jasmine-this';
var TRANSFORMER_MOCHA = 'mocha';
var TRANSFORMER_SHOULD = 'should';
var TRANSFORMER_TAPE = 'tape';
var TRANSFORMER_SINON = 'sinon';
var ALL_TRANSFORMERS = [
// TRANSFORMER_CHAI_SHOULD & TRANSFORMER_SHOULD doesn't have import detection
TRANSFORMER_AVA,
TRANSFORMER_CHAI_ASSERT,
TRANSFORMER_EXPECT_JS,
TRANSFORMER_EXPECT_1,
TRANSFORMER_MOCHA,
TRANSFORMER_TAPE,
TRANSFORMER_JASMINE_THIS,
TRANSFORMER_SINON,
];
var TRANSFORMER_INQUIRER_CHOICES = [
{
name: 'AVA',
value: TRANSFORMER_AVA,
},
{
name: 'Chai: Assert Syntax',
value: TRANSFORMER_CHAI_ASSERT,
},
{
name: 'Chai: Should/Expect BDD Syntax',
value: TRANSFORMER_CHAI_SHOULD,
},
{
name: 'Expect.js (by Automattic)',
value: TRANSFORMER_EXPECT_JS,
},
{
name: 'Expect@1.x (by mjackson)',
value: TRANSFORMER_EXPECT_1,
},
{
name: 'Jasmine: globals',
value: TRANSFORMER_JASMINE_GLOBALS,
},
{
name: 'Jasmine: this usage',
value: TRANSFORMER_JASMINE_THIS,
},
{
name: 'Mocha',
value: TRANSFORMER_MOCHA,
},
{
name: 'Should.js',
value: TRANSFORMER_SHOULD,
},
{
name: 'Tape / Node-Tap',
value: TRANSFORMER_TAPE,
},
{
name: 'Sinon',
value: TRANSFORMER_SINON,
},
{
name: 'All of the above (use with care)!',
value: 'all',
},
{
name: 'Other',
value: 'other',
},
];
var PARSER_INQUIRER_CHOICES = [
{
name: 'Babel',
value: 'babel',
},
{
name: 'Flow',
value: 'flow',
},
{
name: 'TypeScript',
value: 'ts',
},
{
name: 'TypeScript & TSX',
value: 'tsx',
},
];
function supportFailure(supportedItems) {
console.log("\nCurrently, jest-codemods only has support for ".concat(supportedItems, "."));
console.log('Feel free to create an issue on https://github.com/skovhus/jest-codemods to contribute!\n');
}
function expandFilePathsIfNeeded(filesBeforeExpansion) {
var shouldExpandFiles = filesBeforeExpansion.some(function (file) { return file.includes('*'); });
return shouldExpandFiles ? globby_1.default.sync(filesBeforeExpansion) : filesBeforeExpansion;
}
inquirer_1.default
.prompt([
{
type: 'list',
name: 'parser',
message: 'Which parser do you want to use?',
pageSize: PARSER_INQUIRER_CHOICES.length,
choices: PARSER_INQUIRER_CHOICES,
},
{
type: 'list',
name: 'transformer',
message: 'Which test library would you like to migrate from?',
pageSize: TRANSFORMER_INQUIRER_CHOICES.length,
choices: TRANSFORMER_INQUIRER_CHOICES,
},
{
name: 'skipImportDetection',
type: 'list',
message: 'Are you using the global object for assertions (i.e. without requiring them)',
choices: [
{
name: "No, I use import/require statements for my current assertion library",
value: false,
},
{
name: "Yes, and I'm not afraid of false positive transformations",
value: true,
},
],
},
{
name: 'standaloneMode',
type: 'list',
message: 'Will you be using Jest on Node.js as your test runner?',
choices: [
{
name: 'Yes, use the globals provided by Jest (recommended)',
value: false,
},
{
name: 'No, use explicit require() calls instead of globals',
value: true,
},
],
},
{
type: 'list',
name: 'mochaAssertion',
message: 'Would you like to include assertion transformations with Mocha?',
when: function (_a) {
var transformer = _a.transformer;
return TRANSFORMER_MOCHA === transformer;
},
choices: [
{
name: 'Chai: Assert Syntax',
value: TRANSFORMER_CHAI_ASSERT,
},
{
name: 'Chai: Should/Expect BDD Syntax',
value: TRANSFORMER_CHAI_SHOULD,
},
{
name: 'Expect.js (by Automattic)',
value: TRANSFORMER_EXPECT_JS,
},
{
name: 'Expect@1.x (by mjackson)',
value: TRANSFORMER_EXPECT_1,
},
{
name: 'Should.js',
value: TRANSFORMER_SHOULD,
},
{
name: 'None',
value: null,
},
],
},
{
type: 'input',
name: 'files',
message: 'On which files or directory should the codemods be applied?',
when: function () { return !cli.input.length; },
default: '.',
filter: function (files) {
return files
.trim()
.split(/\s+/)
.filter(function (v) { return v; });
},
},
])
.then(function (answers) {
var files = answers.files, transformer = answers.transformer, parser = answers.parser, mochaAssertion = answers.mochaAssertion, skipImportDetection = answers.skipImportDetection, standaloneMode = answers.standaloneMode;
if (transformer === 'other') {
return supportFailure('AVA, Chai, Expect.js, Expect@1.x, Mocha, Should.js and Tape');
}
var transformers = transformer === 'all' ? ALL_TRANSFORMERS : [transformer];
if (mochaAssertion) {
transformers.push(mochaAssertion);
}
var filesBeforeExpansion = cli.input.length ? cli.input : files;
var filesExpanded = expandFilePathsIfNeeded(filesBeforeExpansion);
if (!filesExpanded.length) {
console.log("No files found matching ".concat(filesBeforeExpansion.join(' ')));
return;
}
var transformerArgs = [];
if (standaloneMode) {
transformerArgs.push('--standaloneMode=true');
console.log(chalk_1.default.yellow('\nNOTICE: You need to manually install expect@21+ and jest-mock'));
}
if (skipImportDetection) {
transformerArgs.push('--skipImportDetection=true');
console.log(chalk_1.default.yellow('\nNOTICE: Skipping import detection, you might get false positives'));
}
return (0, transformers_1.executeTransformations)({
files: filesExpanded,
flags: cli.flags,
parser: parser,
transformers: transformers,
transformerArgs: transformerArgs,
});
});