UNPKG

@ou-imdt/create

Version:

Command line tool to create team boilerplate.

107 lines (97 loc) 2.62 kB
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 }