UNPKG

@rajzik/lumos

Version:

Centralized CLI for JavaScript and TypeScript dev tools.

206 lines (205 loc) 7.55 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setup = void 0; const core_1 = require("@beemo/core"); const lumos_common_1 = require("@rajzik/lumos-common"); 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 constants_1 = require("../constants"); const installDeps_1 = require("../helpers/installDeps"); const pkgPath = core_1.Path.resolve('package.json').path(); function addLumosToPackage(response) { const pkg = edit_json_file_1.default(pkgPath); const lumos = { drivers: response.drivers, settings: {}, }; if (response.libs.includes('react')) { lumos.settings.react = true; } if (response.libs.includes('graphql')) { lumos.settings.graphql = true; } if (response.type === 'lib' || response.type === 'monolib') { lumos.settings.library = true; } if (response.type === 'app') { lumos.settings.entryPoint = 'app-loader.tsx'; } if (response.type === 'ssr-app') { lumos.settings.buildFolder = '.next'; lumos.settings.nextTarget = 'server'; } if (response.next) { lumos.settings.next = true; } if (response.node) { lumos.settings.node = true; } pkg.set('lumos', lumos); pkg.save(); } function addScriptsToPackage(response) { var _a; const { drivers } = response; const pkg = edit_json_file_1.default(pkgPath); const client = response.yarn ? 'yarn' : 'npm'; const monorepo = response.type === 'monolib'; const scripts = (_a = pkg.get('scripts')) !== null && _a !== void 0 ? _a : {}; scripts.prepare = 'lumos create-config --silent'; if (drivers.includes('babel')) { if (monorepo) { scripts.build = 'lumos babel --workspaces=* && lumos babel --esm --workspaces=*'; } else { scripts.build = 'lumos babel && lumos babel --esm'; } } if (drivers.includes('eslint')) { scripts.lint = 'lumos eslint'; scripts.posttest = `${client} run lint`; } if (drivers.includes('jest')) { scripts.jest = 'cross-env NODE_ENV=test TZ=UTC lumos jest'; scripts['jest:coverage'] = `${client} run jest ${response.yarn ? '' : '--'} --coverage`; scripts.test = `${client} run jest:coverage`; } if (drivers.includes('prettier')) { scripts.prettier = 'lumos prettier'; } if (drivers.includes('typescript')) { if (monorepo) { scripts.type = 'lumos typescript --build --reference-workspaces'; scripts.prebuild = 'yarn run type'; } else { scripts.type = 'lumos typescript --noEmit'; scripts.postbuild = 'lumos typescript --emitDeclarationOnly'; } scripts.pretest = `${client} run type`; } if (drivers.includes('webpack')) { scripts.build = 'cross-env NODE_ENV=production lumos webpack'; scripts.start = 'lumos create-config webpack --silent && lumos-webpack-server'; delete scripts.prebuild; delete scripts.postbuild; } if (drivers.includes('next')) { scripts.build = 'lumos next build'; scripts.start = 'lumos create-config next --silent && next dev -p 3000'; scripts['start-next'] = 'lumos create-config next --silent && next start'; delete scripts.prebuild; delete scripts.postbuild; } pkg.set('scripts', scripts); pkg.save(); } async function setup() { console.log(constants_1.BANNER); console.log(`${chalk_1.default.cyan('[1/6]')} Setting up Lumos`); const response = await enquirer_1.prompt([ { type: 'multiselect', name: 'drivers', message: 'Which developer tools are you going to use?', choices: [ { message: 'Babel', name: 'babel' }, { message: 'ESLint', name: 'eslint' }, { message: 'Jest', name: 'jest' }, { message: 'Prettier', name: 'prettier' }, { message: 'TypeScript', name: 'typescript' }, { message: 'Webpack', name: 'webpack' }, { message: 'Next', name: 'next' }, ], }, { type: 'multiselect', name: 'libs', message: 'Which libraries are you going to use?', choices: [ { message: 'React', name: 'react' }, { message: 'GraphQL', name: 'graphql' }, ], }, { type: 'select', name: 'type', message: 'Which type of project is this?', choices: [ { message: 'Application', name: 'app' }, { message: 'Next App(SSR)', name: 'ssr-app' }, { message: 'Library', name: 'lib' }, { message: 'Library (monorepo)', name: 'monolib' }, ], }, { type: 'confirm', name: 'node', message: 'Is this a Node.js only project?', }, { type: 'confirm', name: 'next', message: 'Do you want to enable experimental features?', }, { type: 'confirm', name: 'scaffold', message: 'Do you want to scaffold dotfiles?', }, { type: 'confirm', name: 'scripts', message: 'Do you want to define package scripts?', }, { type: 'confirm', name: 'yarn', message: 'Are you using Yarn?', }, ]); if (response.drivers.includes('jest') && !response.drivers.includes('babel')) { response.drivers.push('babel'); } if (response.drivers.includes('next') && !response.drivers.includes('typescript')) { response.drivers.push('typescript'); } if (response.type === 'ssr-app' && !response.drivers.includes('next')) { response.drivers.push('next'); } console.log(`${chalk_1.default.cyan('[2/6]')} Updating package settings`); addLumosToPackage(response); console.log(`${chalk_1.default.cyan('[3/6]')} Installing dependencies`); let dependencies = [ '@rajzik/lumos', ...response.drivers.map(driver => `@rajzik/config-${driver}`), ]; if (response.scaffold) { dependencies = [...dependencies, ...lumos_common_1.SCAFFOLD_DEPS]; } await installDeps_1.installDeps(dependencies, response.yarn, response.type === 'monolib'); console.log(`${chalk_1.default.cyan('[4/6]')} Adding package scripts`); if (response.scripts) { addScriptsToPackage(response); } else { console.log(chalk_1.default.gray('Not chosen, skipping')); } console.log(`${chalk_1.default.cyan('[5/6]')} Scaffolding dotfiles`); if (response.scaffold) { await execa_1.default('lumos', ['scaffold', 'project', 'dotfiles'], { preferLocal: true, }); } else { console.log(chalk_1.default.gray('Not chosen, skipping')); } console.log(`${chalk_1.default.cyan('[6/6]')} Generating config files`); await execa_1.default('lumos', ['create-config', '--silent'], { preferLocal: true }); } exports.setup = setup;