From b79f801d71144725cc8c19bad5107236e846ff9e Mon Sep 17 00:00:00 2001 From: Taylor Beseda Date: Mon, 22 Jan 2024 13:49:15 -0700 Subject: [PATCH] add regions list command not extremely useful but a nice to have. precursor to updating region select for app env creation --- src/commands/index.js | 4 +++- src/commands/regions/help.js | 34 ++++++++++++++++++++++++++++++++++ src/commands/regions/index.js | 34 ++++++++++++++++++++++++++++++++++ src/commands/regions/list.js | 22 ++++++++++++++++++++++ src/lib/columns.js | 27 +++++++++++++++++++++++++++ 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/commands/regions/help.js create mode 100644 src/commands/regions/index.js create mode 100644 src/commands/regions/list.js create mode 100644 src/lib/columns.js diff --git a/src/commands/index.js b/src/commands/index.js index a2ea3f9..b2523e7 100644 --- a/src/commands/index.js +++ b/src/commands/index.js @@ -12,6 +12,7 @@ let list = require('./list') let login = require('./login') let logout = require('./logout') let newProj = require('./new') +let regions = require('./regions') let tail = require('./tail') let team = require('./team') let telemetry = require('./telemetry') @@ -20,7 +21,8 @@ let update = require('./update') let version = require('./version') let commands = [ builds, create, deploy, destroy, dev, domains, envVar, generate, help, - list, login, logout, logs, newProj, tail, team, tokens, telemetry, update, version, + list, login, logout, logs, newProj, regions, tail, team, tokens, telemetry, + update, version, ] let helper = require('../helper') diff --git a/src/commands/regions/help.js b/src/commands/regions/help.js new file mode 100644 index 0000000..ac8463d --- /dev/null +++ b/src/commands/regions/help.js @@ -0,0 +1,34 @@ +module.exports = async function (params) { + const { + args: { _: commands }, + } = params + const action = commands[1] + + if (HELP[action]) return HELP[action] + + return { + en: { + usage: [ 'regions ', '[options]' ], + description: 'Begin regions', + contents: { + header: 'Regions actions', + items: [ + { name: 'list', description: 'List Begin regions' }, + ], + }, + }, + } +} + +const HELP = { + list: { + en: { + usage: [ 'regions list', '[options]' ], + description: 'List Begin regions', + contents: { + header: 'List Begin regions', + example: 'begin regions list', + }, + }, + }, +} diff --git a/src/commands/regions/index.js b/src/commands/regions/index.js new file mode 100644 index 0000000..26d7504 --- /dev/null +++ b/src/commands/regions/index.js @@ -0,0 +1,34 @@ +const names = { en: [ 'regions' ] } +const subcommands = [ 'list' ] +const aliases = { ls: 'list' } +const defaultCommand = 'list' +const help = require('./help').bind({}) + +async function action (params) { + const { args } = params + const { _ } = args + let subcommand = _[1] || defaultCommand + const alias = Object.keys(aliases).includes(subcommand) && aliases[subcommand] + subcommand = alias || subcommand + + if (subcommands.includes(subcommand)) { + const lib = require('../../lib') + const { getConfig } = lib + const { action } = require(`./${subcommand}`) + + const config = getConfig(params) + return action({ + config, + ...params + }) + } + else { + return help(params) + } +} + +module.exports = { + names, + action, + help, +} diff --git a/src/commands/regions/list.js b/src/commands/regions/list.js new file mode 100644 index 0000000..0d28f10 --- /dev/null +++ b/src/commands/regions/list.js @@ -0,0 +1,22 @@ +async function action (params) { + let client = require('@begin/api') + let f = require('../../lib/format')() + let collumns = require('../../lib/columns') + let { config } = params + let { access_token: token, stagingAPI: _staging } = config + + let regions = await client.regions({ token, _staging }) + + if (!regions) return Error('No regions found!') + + return [ + f.bold('Available regions:'), + collumns(Object.entries(regions).map(([ k, v ]) => [ v, k ]), 2) + ].join('\n') +} + +module.exports = { + name: 'list', + description: 'List Begin regions', + action, +} diff --git a/src/lib/columns.js b/src/lib/columns.js new file mode 100644 index 0000000..9497b5a --- /dev/null +++ b/src/lib/columns.js @@ -0,0 +1,27 @@ +/** + * + * @param {Array>} arrays + * @param {Number} padding + * @returns {string} mluti-line string + */ +function columns (arrays, padding = 1) { + const colLengths = [] + arrays.forEach(row => { + row.forEach((item, colI) => { + colLengths[colI] = Math.max(colLengths[colI] || 0, item.length) + }) + }) + + const lines = [] + arrays.forEach(row => { + let line = row.map((item, colI) => { + return item.padEnd(colLengths[colI] + padding, ' ') + }).join('').trim() + + lines.push(line) + }) + + return lines.join('\n') +} + +module.exports = columns