infra-cli
Version:
68 lines (58 loc) • 1.83 kB
JavaScript
const fs = require('fs-extra')
const chalk = require('chalk')
const execSync = require('child_process').execSync
const validateProjectName = require('validate-npm-package-name')
const isSafeToCreateProjectIn = function (root, name) {
const conflicts = fs.readdirSync(root)
if (conflicts.length > 0) {
console.error(`The directory ${chalk.green(name)} contains files.`)
console.error('Either try using a new directory name, or remove the files listed above.')
return false
}
return true
}
const checkAppName = function (appName) {
const validationResult = validateProjectName(appName)
if (!validationResult.validForNewPackages) {
console.error(
chalk.red(`Cannot create a project named ${chalk.green(`"${appName}"`)} because of npm naming restrictions:\n`)
)
;[...(validationResult.errors || []), ...(validationResult.warnings || [])].forEach((error) => {
console.error(chalk.red(` * ${error}`))
})
console.error(chalk.red('\nPlease choose a different project name.'))
process.exit(1)
}
}
const shouldUseYarn = function () {
try {
execSync('yarn --version', { stdio: 'ignore' })
return true
} catch (e) {
return false
}
}
async function editPackageJson (targetDir, replaceInfo) {
const packageDir = `${targetDir}/package.json`
try {
const packageObj = await fs.readJson(packageDir)
await fs.writeJson(packageDir, { ...packageObj, ...replaceInfo }, { spaces: 2 })
} catch (err) {
// Ignore editing errors
console.error(chalk.redBright('Failed to edit package.json'))
}
}
function getUserName () {
try {
return execSync('git config user.name').toString() || ''
} catch (error) {
return ''
}
}
module.exports = {
shouldUseYarn,
checkAppName,
isSafeToCreateProjectIn,
editPackageJson,
getUserName
}