netlify-cli
Version:
Netlify command line tool
110 lines (95 loc) • 3.22 kB
JavaScript
const chalk = require('chalk')
const ADDON_VALIDATION = {
EXISTS: 'EXISTS',
NOT_EXISTS: 'NOT_EXISTS',
}
const validateExists = ({ addon, addonName, siteData, log, exit }) => {
if (!addon || !addon.id) {
log(`Add-on ${addonName} doesn't exist for ${siteData.name}`)
log(`> Run \`netlify addons:create ${addonName}\` to create an instance for this site`)
exit(1)
}
}
const validateNotExists = ({ addon, addonName, siteData, log, exit }) => {
if (addon && addon.id) {
log(`The "${addonName} add-on" already exists for ${siteData.name}`)
log()
const cmd = chalk.cyan(`\`netlify addons:config ${addonName}\``)
log(`- To update this add-on run: ${cmd}`)
const deleteCmd = chalk.cyan(`\`netlify addons:delete ${addonName}\``)
log(`- To remove this add-on run: ${deleteCmd}`)
log()
exit(1)
}
}
const getCurrentAddon = ({ addons, addonName }) => {
return addons.find((addon) => addon.service_slug === addonName)
}
const validateCurrentAddon = ({ addon, validation, addonName, siteData, log, warn, exit }) => {
switch (validation) {
case ADDON_VALIDATION.EXISTS: {
validateExists({ addon, addonName, siteData, log, exit })
break
}
case ADDON_VALIDATION.NOT_EXISTS: {
validateNotExists({ addon, addonName, siteData, log, exit })
break
}
default: {
warn(`Unknown addons validation: ${validation}`)
break
}
}
}
const getAddonManifest = async ({ api, addonName, error }) => {
let manifest
try {
manifest = await api.showServiceManifest({ addonName })
} catch (error_) {
if (typeof error_.message === 'string' && error_.message.includes('Not Found')) {
error(`No add-on "${addonName}" found. Please double check your add-on name and try again`)
} else {
error(error_.message)
}
}
return manifest
}
const getSiteData = async ({ api, siteId, error }) => {
let siteData
try {
siteData = await api.getSite({ siteId })
} catch (error_) {
error(`Failed getting list of site data: ${error_.message}`)
}
return siteData
}
const getAddons = async ({ api, siteId, error }) => {
let addons
try {
addons = await api.listServiceInstancesForSite({ siteId })
} catch (error_) {
error(`Failed getting list of addons: ${error_.message}`)
}
return addons
}
const prepareAddonCommand = async ({ context, addonName, validation }) => {
const { netlify, log, warn, error, exit } = context
const { api, site } = netlify
const siteId = site.id
if (!siteId) {
error('No site id found, please run inside a site folder or `netlify link`')
}
await context.authenticate()
const [manifest, siteData, addons] = await Promise.all([
addonName ? getAddonManifest({ api, addonName, error }) : Promise.resolve(),
getSiteData({ api, siteId, error }),
getAddons({ api, siteId, error }),
])
let addon
if (addonName) {
addon = getCurrentAddon({ addons, addonName })
validateCurrentAddon({ addon, validation, addonName, siteData, log, warn, exit })
}
return { manifest, addons, addon, siteData }
}
module.exports = { ADDON_VALIDATION, prepareAddonCommand, getAddonManifest, getSiteData, getAddons, getCurrentAddon }