const { italic, bold } = require('chalk') const error = require('../../lib/utils/output/error') const wait = require('../../lib/utils/output/wait') const cmd = require('../../lib/utils/output/cmd') const param = require('../../lib/utils/output/param') const info = require('../../lib/utils/output/info') const uid = require('../../lib/utils/output/uid') const success = require('../../lib/utils/output/success') const stamp = require('../../lib/utils/output/stamp') const promptBool = require('../../lib/utils/input/prompt-bool') const eraseLines = require('../../lib/utils/output/erase-lines') const treatBuyError = require('../../lib/utils/domains/treat-buy-error') module.exports = async function({ domains, args, currentTeam, user }) { const name = args[0] let elapsed if (!name) { return error(`Missing domain name. Run ${cmd('now domains help')}`) } const nameParam = param(name) elapsed = stamp() let stopSpinner = wait(`Checking availability for ${nameParam}`) const price = await domains.price(name) const available = await domains.status(name) stopSpinner() if (!available) { return error(`The domain ${nameParam} is ${italic('unavailable')}! ${elapsed()}`) } info(`The domain ${nameParam} is ${italic('available')}! ${elapsed()}`) const confirmation = await promptBool(`Buy now for ${bold(`$${price}`)} (${bold((currentTeam && currentTeam.slug) || user.username || user.email)})?`) eraseLines(1) if (!confirmation) { return info('Aborted') } stopSpinner = wait('Purchasing') elapsed = stamp() let domain try { domain = await domains.buy(name) } catch (err) { stopSpinner() return treatBuyError(err) } stopSpinner() success(`Domain purchased and created ${uid(domain.uid)} ${elapsed()}`) info(`You may now use your domain as an alias to your deployments. Run ${cmd('now alias help')}`) }