UNPKG

@rajzik/lumos

Version:

Centralized CLI for JavaScript and TypeScript dev tools.

180 lines (179 loc) 7.75 kB
"use strict"; /* eslint-disable no-restricted-syntax, no-await-in-loop, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.eject = void 0; const core_1 = require("@beemo/core"); const chalk_1 = __importDefault(require("chalk")); const edit_json_file_1 = __importDefault(require("edit-json-file")); const enquirer_1 = require("enquirer"); const execa_1 = __importDefault(require("execa")); const fs_1 = __importDefault(require("fs")); const constants_1 = require("../constants"); const installDeps_1 = require("../helpers/installDeps"); const removeDeps_1 = require("../helpers/removeDeps"); const pkgPath = core_1.Path.resolve('package.json').path(); function writeJsFile(configPath, config) { fs_1.default.writeFileSync(configPath, `module.exports = ${JSON.stringify(config, null, 2)}`, 'utf8'); } async function copyAndInstallDepsFromModule(moduleName, isYarn, isMonorepo) { const pkg = require(`${moduleName}/package.json`); const deps = Object.keys(pkg.dependencies).filter(dep => !dep.includes('@beemo') && !dep.includes('@rajzik/lumos')); await installDeps_1.installDeps(deps, isYarn, isMonorepo); await removeDeps_1.removeDeps([moduleName], isYarn, isMonorepo); } function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } function migrateDotfiles() { const toRemove = [ '# Configs', '# Configs (provided by Lumos)', '.babelrc', '.eslintignore', '.eslintrc.js', '.flowconfig', '.prettierignore', 'babel.config.js', 'jest.config.js', 'prettier.config.js', 'tsconfig.json', 'tsconfig.eslint.json', 'tsconfig.options.json', '*.tsbuildinfo', ]; try { const dotPath = core_1.Path.resolve('.gitignore').path(); let data = fs_1.default.readFileSync(dotPath, 'utf8'); toRemove.forEach(value => { data = data.replace(new RegExp(`${escapeRegExp(value)}\n?`, 'g'), ''); }); fs_1.default.writeFileSync(dotPath, data.trim(), 'utf8'); } catch (error) { // Ignore } } function migratePackageScripts(lumos) { var _a, _b; const pkg = edit_json_file_1.default(pkgPath); const scripts = pkg.get('scripts') || {}; const srcFolder = lumos.settings.srcFolder || 'src'; const testFolder = lumos.settings.testsFolder || 'tests'; if ((_a = scripts.prepare) === null || _a === void 0 ? void 0 : _a.includes('create-config')) { delete scripts.prepare; } if ((_b = scripts.release) === null || _b === void 0 ? void 0 : _b.includes('auto-release')) { delete scripts.release; } Object.keys(scripts).forEach(key => { const value = scripts[key]; const esm = value.includes('--esm'); scripts[key] = value .replace('lumos babel', `${esm ? 'ESM=true ' : ''}babel ./${srcFolder} --out-dir ./${esm ? 'esm' : 'lib'}`) .replace('--esm', '') .replace('lumos eslint', `eslint --color --report-unused-disable-directives ./${srcFolder} ./${testFolder}`) .replace('lumos jest', 'jest --colors') .replace('--coverage', '--coverage --logHeapUsage --detectOpenHandles') .replace('lumos prettier', `prettier --write ./${srcFolder} ./${testFolder}`) .replace('lumos typescript', 'tsc') .replace('lumos webpack', 'webpack --colors --progress --bail') .replace('lumos-webpack-server', 'webpack-dev-server') .trim(); }); pkg.set('scripts', scripts); pkg.save(); } function migrateEslint() { const configPath = core_1.Path.resolve('.eslintrc.js').path(); const { extends: extendPaths, ...rootConfig } = require(configPath); let config = { extends: [] }; extendPaths.forEach(extendPath => { if (extendPath.startsWith('.')) { config = { ...config, ...require(extendPath), }; } else { config.extends.push(extendPath); } }); config = { ...config, ...rootConfig, }; delete config.parserOptions; writeJsFile(configPath, config); } function migrateJest() { const configPath = core_1.Path.resolve('jest.config.js').path(); const config = require(configPath); delete config.moduleNameMapper; delete config.setupFiles; delete config.setupFilesAfterEnv; delete config.testEnvironment; console.log(`${chalk_1.default.gray('[jest]')} ${chalk_1.default.yellow('Jest config has been migrated but the following settings were removed: moduleNameMapper, setupFiles, setupFilesAfterEnv, testEnvironment')}`); console.log(`${chalk_1.default.gray('[jest]')} ${chalk_1.default.yellow('This included custom serializers, transformers, mocks, setup files, and more provided by Lumos. These will need to be manually configured now.')}`); writeJsFile(configPath, config); } function migrateWebpack() { const configPath = core_1.Path.resolve('webpack.config.js').path(); const url = 'https://github.com/rajzik/lumos/blob/master/packages/config-webpack/index.js'; console.log(`${chalk_1.default.gray('[webpack]')} ${chalk_1.default.yellow('Webpack config could not be migrated.')}`); console.log(`${chalk_1.default.gray('[webpack]')} ${chalk_1.default.yellow(`Please copy portions of this config manually: ${url}`)}`); writeJsFile(configPath, {}); } async function eject() { console.log(constants_1.BANNER); console.log(`${chalk_1.default.cyan('[1/5]')} Ejecting Lumos`); const lumos = edit_json_file_1.default(pkgPath).get('lumos'); if (!lumos) { throw new Error("Project isn't Lumos enabled."); } const response = await enquirer_1.prompt([ { type: 'confirm', name: 'monorepo', message: 'Is this a monorepo?', }, { type: 'confirm', name: 'yarn', message: 'Are you using Yarn?', }, ]); await execa_1.default('lumos', ['create-config', '--silent'], { preferLocal: true }); console.log(`${chalk_1.default.cyan('[2/5]')} Updating package scripts`); migratePackageScripts(lumos); console.log(`${chalk_1.default.cyan('[3/5]')} Migrating drivers`); for (const driver of lumos.drivers) { console.log(`${chalk_1.default.gray(`[${driver}]`)} Migrating config`); if (driver === 'eslint') { migrateEslint(); } else if (driver === 'jest') { migrateJest(); } else if (driver === 'webpack') { migrateWebpack(); } console.log(`${chalk_1.default.gray(`[${driver}]`)} Updating dependencies`); await copyAndInstallDepsFromModule(`@rajzik/config-${driver}`, response.yarn, response.monorepo); // Remove the driver from the package in case the eject script fails later on. // This allows us to pickup where we left off. const pkg = edit_json_file_1.default(pkgPath); pkg.set('lumos.drivers', pkg.get('lumos.drivers').filter(d => d !== driver)); pkg.save(); } console.log(`${chalk_1.default.cyan('[4/5]')} Removing config`); await removeDeps_1.removeDeps(['@rajzik/lumos'], response.yarn, response.monorepo); const pkg = edit_json_file_1.default(pkgPath); pkg.unset('lumos'); pkg.save(); console.log(`${chalk_1.default.cyan('[5/5]')} Updating dotfiles`); migrateDotfiles(); } exports.eject = eject;