UNPKG

redhot

Version:

TypeScript Monorepo Management

110 lines (86 loc) 3.06 kB
const { join } = require('path') const { writeFile } = require('fs') const Khaos = require('khaos') const beautify = require('js-beautify').js_beautify const prompt = require('prompt-for') const { isDirectory, getRelative } = require('../../util') exports.create = create function create (program, config, workingDir) { program .command('create <relativePathToPackage>') .alias('c') .description('Initialize a new package for redhot to manage') .action((packageName, options) => initializePackage(config, workingDir, packageName, options)) } function initializePackage (config, workingDir, packageName, options) { const templateDirectory = join(__dirname, 'template/') const destinationDirectory = join(workingDir, packageName) if (isDirectory(destinationDirectory)) { return console.log('This directory already exists') } const khaos = new Khaos(templateDirectory) readFiles(khaos, function (files) { promptForInformation(function (promptAnswers) { const answers = generateAnswers(packageName, promptAnswers, workingDir) writeFiles(khaos, destinationDirectory, files, answers) .catch(err => console.log(err)) .then(() => addPackageToConfig(packageName, config, workingDir)) }) }) } function generateAnswers (packageName, promptAnswers, workingDir) { const { author, repository: { url: gitUrl }, bugs: { url: bugsUrl }, homepage } = require(join(workingDir, 'package.json')) const relative = getRelative(packageName) const bin = `${relative}/node_modules/.bin` const lintCmd = `${bin}/redhot lint --only ${packageName}` const testUnitCmd = `${bin}/redhot test --only ${packageName}` const nodeReference = `${relative}/../node_modules/@types/node/index.d.ts` const mochaReference = `${relative}/../node_modules/@types/mocha/index.d.ts` return Object.assign({}, promptAnswers, { author, gitUrl, bugsUrl, homepage, lintCmd, testUnitCmd, nodeReference, mochaReference }) } function addPackageToConfig (packageName, config, workingDir) { const packages = config.packages if (packages.indexOf(packageName) !== -1) { return } packages.push(packageName) const newConfig = Object.assign({}, config, { packages: packages.sort() }) let data = beautify(JSON.stringify(newConfig)) console.log('Adding ' + packageName, '...') writeFile(join(workingDir, 'redhot.json'), data, function (err) { if (err) throw err }) } function readFiles (khaos, callback) { khaos.read(function (err, files) { if (err) throw err callback(files) }) } const schemaForPrompt = { 'packageName': 'string', 'description': 'string' } function promptForInformation (callback) { prompt(schemaForPrompt, function (err, answers) { if (err) throw err callback(answers) }) } function writeFiles (khaos, destination, files, answers) { return new Promise(function (resolve, reject) { khaos.write(destination, files, answers, function (err) { if (err) reject(err) resolve() }) }) }