@airbnb/nimbus
Version:
Centralized CLI for JavaScript and TypeScript dev tools.
173 lines (172 loc) • 6.35 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const chalk_1 = __importDefault(require("chalk"));
const execa_1 = __importDefault(require("execa"));
const edit_json_file_1 = __importDefault(require("edit-json-file"));
const enquirer_1 = require("enquirer");
const core_1 = require("@beemo/core");
const constants_1 = require("../constants");
const installDeps_1 = __importDefault(require("../helpers/installDeps"));
const pkgPath = core_1.Path.resolve('package.json').path();
function addNimbusToPackage(response) {
const pkg = edit_json_file_1.default(pkgPath);
const nimbus = {
drivers: response.drivers,
settings: {},
};
if (response.libs.includes('graphql')) {
nimbus.settings.graphql = true;
}
if (response.type === 'lib' || response.type === 'monolib') {
nimbus.settings.library = true;
}
if (response.next) {
nimbus.settings.next = true;
}
if (response.node) {
nimbus.settings.node = true;
}
if (response.libs.includes('react')) {
nimbus.settings.react = true;
}
pkg.set('nimbus', nimbus);
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 = 'nimbus create-config --silent';
if (drivers.includes('babel')) {
if (monorepo) {
scripts.build = 'nimbus babel --workspaces=* && nimbus babel --esm --workspaces=*';
}
else {
scripts.build = 'nimbus babel && nimbus babel --esm';
}
}
if (drivers.includes('eslint')) {
scripts.lint = 'nimbus eslint';
scripts.posttest = `${client} run lint`;
}
if (drivers.includes('jest')) {
scripts.jest = 'NODE_ENV=test TZ=UTC nimbus jest';
scripts['jest:coverage'] = `${client} run jest -- --coverage`;
scripts.test = `${client} run jest:coverage`;
}
if (drivers.includes('prettier')) {
scripts.prettier = 'nimbus prettier';
}
if (drivers.includes('typescript')) {
if (monorepo) {
scripts.type = 'nimbus typescript --build --reference-workspaces';
scripts.prebuild = 'yarn run type';
}
else {
scripts.type = 'nimbus typescript --noEmit';
scripts.postbuild = 'nimbus typescript --emitDeclarationOnly';
}
scripts.pretest = `${client} run type`;
}
if (drivers.includes('webpack')) {
scripts.build = 'NODE_ENV=production nimbus webpack';
scripts.start = 'nimbus create-config webpack --silent && nimbus-webpack-server';
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 Nimbus`);
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' },
],
},
{
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: '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');
}
console.log(`${chalk_1.default.cyan('[2/6]')} Updating package settings`);
addNimbusToPackage(response);
console.log(`${chalk_1.default.cyan('[3/6]')} Installing dependencies`);
await installDeps_1.default(['@airbnb/nimbus', ...response.drivers.map((driver) => `@airbnb/config-${driver}`)], 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('nimbus', ['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('nimbus', ['create-config', '--silent'], { preferLocal: true });
}
exports.setup = setup;