UNPKG

jest-codemods

Version:

Codemods for migrating test files to Jest

269 lines (268 loc) 8.55 kB
#!/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, }); });