@mason-api/cli
Version:
CLI assistant for Mason builder
117 lines (106 loc) • 3.22 kB
JavaScript
import readline from 'readline';
import fetch from 'node-fetch';
import colors from 'colors/safe';
import _ from 'lodash';
export async function prompt(text) {
return new Promise((resolve) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question(colors.gray(text), (value) => {
resolve(value);
rl.close();
});
});
}
export async function promptChoice(text, keyName = 'choice', choices, blankChoice, multiple) {
let i = 0;
const list = {};
console.log(_.join(_.map(choices, (value, key) => {
i += 1;
list[i] = key;
return `${colors.yellow(i)}) ${value}`;
}), '\n'));
if (blankChoice) {
console.log(colors.gray(colors.italic(blankChoice)));
}
while (true) {
const input = _.toLower(await prompt(text, text));
if (multiple) {
return _.compact(_.split(_.replace(input, /\s*/g, ''), ',').map(num => list[parseInt(num)]));
}
const choice = list[parseInt(input)] || (choices[input] && input);
if (!input && blankChoice) {
return;
}
if (!_.isNil(choice)) {
return choice;
}
console.log(`Please type in number or ${keyName}: e.g. ${_.keys(choices)[0]}\n`);
}
}
export async function promptPassword(text) {
return new Promise((resolve) => {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question(colors.gray(text), (password) => {
console.log('');
console.log('');
resolve(password);
rl.close();
});
rl._writeToOutput = function _writeToOutput(stringToWrite) {
rl.output.write('*');
};
});
}
const MASON_API_HOST = process.env.MASON_API_HOST || process.env.REACT_APP_MASON_API_HOST || 'https://api.trymason.com';
export async function sendLoginRequest(email, password) {
const response = await fetch(`${MASON_API_HOST}/users/login`, {
body: JSON.stringify({ email, password }),
headers: {
'Content-Type': 'application/json',
},
method: 'POST',
});
if (response.status !== 200) {
throw new Error('Cant find');
}
return response.json();
}
export async function fetchProject(apiKey, projectId, verbose) {
const url = `${MASON_API_HOST}/serve?apiKey=${encodeURIComponent(apiKey)}&pIds=${projectId}&true&libraryVersion=3.2.4`;
if (verbose) {
console.log(` ${colors.gray(url)}`);
}
const response = await fetch(url);
if (response.status !== 200) {
throw new Error('Cant find');
}
return response.json();
}
export async function fetchProjects(idToken, verbose) {
const url = `${MASON_API_HOST}/projects?idToken=${idToken}`;
if (verbose) {
console.log(` ${colors.gray(url)}`);
}
const response = await fetch(url);
if (response.status !== 200) {
throw new Error('Cant find');
}
return (await response.json()).projects;
}
export async function fetchDatasource(datasource, verbose) {
const url = `${MASON_API_HOST}/projects?idToken=${datasource.url}`;
if (verbose) {
console.log(` ${colors.gray(url)}`);
}
const response = await fetch(url);
if (response.status !== 200) {
throw new Error('Cant find');
}
return response.json();
}