redhot
Version:
TypeScript Monorepo Management
110 lines (86 loc) • 3.06 kB
JavaScript
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()
})
})
}