@ou-imdt/create
Version:
Command line tool to create team boilerplate.
107 lines (97 loc) • 2.62 kB
JavaScript
const os = require('os')
const fs = require('fs')
const path = require('path')
const { Input, Select, Toggle } = require('enquirer')
const to = require('await-to-js').default
const handleError = require('cli-handle-error')
const shouldCancel = require('cli-should-cancel')
const { Store } = require('data-store')
const nameRegex = /^[a-z0-9\-_.]+$/
const descriptionRegex = /^[^"]+$/
async function textInput ({ name, message, hint, initial }) {
let history = false
if (!initial && name !== `name` && name !== `description`) {
history = {
autosave: true,
store: new Store({
path: path.join(os.homedir(), `.cache/imdt/${name}.json`)
})
}
}
const [err, response] = await to(
new Input({
name,
message,
hint,
initial,
history,
validate (value, state) {
if (!value) {
if (state.name === 'name' || state.name === 'description')
return `Please add a ${state.name}.`
}
if (state.name === 'name') {
if (!nameRegex.test(value)) {
return 'The name can include only lower-case letters (a-z), numbers (0-9), hyphens, underscores, and dots.'
}
if (fs.existsSync(value)) {
return `Directory already exists: ./${value}`
}
} else if (state.name === 'description') {
if (!descriptionRegex.test(value)) {
return 'The description cannot include double quotes ("). If needed, you can edit the description later in README.'
}
}
return true
},
result (value) {
if (this.name === 'name') {
return value.replace(/[.\s]+$/, '')
}
return value
}
})
.on(`cancel`, () => shouldCancel())
.run()
)
handleError(`INPUT`, err)
return response
}
async function selectInput ({ name, message, choices, initial }) {
const [err, response] = await to(
new Select({
name,
message,
choices,
initial,
validate (value) {
return value ? true : `Select a value.`
},
result () {
return this.focused.value
}
})
.on(`cancel`, () => shouldCancel())
.run()
)
handleError(`SELECT`, err)
return response
}
async function toggleInput ({ message, enabled, disabled }) {
const [err, response] = await to(
new Toggle({
message,
enabled,
disabled
})
.on(`cancel`, () => shouldCancel())
.run()
)
handleError(`Toggle`, err)
return response
}
module.exports = {
textInput,
selectInput,
toggleInput
}