@rajzik/lumos
Version:
Centralized CLI for JavaScript and TypeScript dev tools.
206 lines (205 loc) • 7.55 kB
JavaScript
"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;