ryuu
Version:
Domo App Dev Studio CLI, The main tool used to create, edit, and publish app designs to Domo
287 lines • 11.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var inquirer = require("inquirer");
var autocompletePrompt = require("inquirer-autocomplete-prompt");
var chalk = require("chalk");
var path = require("path");
var fs = require("fs-extra");
var shell = require("shelljs");
var axios_1 = require("axios");
var Domo = require("ryuu-client");
var log_1 = require("../util/log");
var login_1 = require("../util/login");
var multichoice_1 = require("../util/multichoice");
var oauth_1 = require("../util/oauth");
var constant_1 = require("../models/enums/constant");
var autoUpdate = false;
var NEW_INSTANCE = 'new instance';
//@ts-ignore
inquirer.registerPrompt('autocomplete', autocompletePrompt);
module.exports = function (program) {
program
.command('login')
.description('login to Domo')
.option('-i, --instance <value>', 'Domo instance')
.option('-u, --user-email <value>', 'user email')
.option('-f, --manifest-file <file>', 'use a specific manifest file')
.option('-t, --transfer', 'transfer login files from ryuu 3.x')
.option('-o, --oauth', 'setup oauth')
.option('--no-upgrade-check', 'do not check for new versions')
.option('--upgrade-download', 'Automatically download newer version if available. ')
.action(function (args) {
if (args.upgradeDownload) {
autoUpdate = true;
}
if (args.transfer) {
var isWin = process.platform === 'win32';
var homeEnv = process.env[isWin ? 'USERPROFILE' : 'HOME'];
var deprecatedLoginDir = "".concat(homeEnv, "/.domo/login/");
if (fs.existsSync(deprecatedLoginDir)) {
try {
fs.copySync(deprecatedLoginDir, "".concat(Domo.getHomeDir(), "/ryuu/"), {
overwrite: false,
});
}
catch (error) {
log_1.log.fail('Failed to transfer logins:', error);
}
}
else {
log_1.log.fail('You do not have any ryuu 3.x logins to transfer to ryuu 4.x. Run this command without the -t flag to log in.');
}
}
var previousLogins = login_1.Login.getPreviousLogins();
var login;
var currentLogin = login_1.Login.getCurrentLogin().instance;
var prompts = [];
var versionCheckFn = !args.upgradeCheck
? function (x) {
return x;
}
: verifyVersion;
if (!args.instance) {
prompts.push((0, multichoice_1.default)({
//@ts-ignore
type: 'autocomplete',
source: function (prevAnswers, input) {
var filtered = previousLogins
.map(function (login) { return login.instance; })
.filter(function (c) {
return input === undefined ? true : c.indexOf(input) >= 0;
});
filtered.push(NEW_INSTANCE);
return Promise.resolve(filtered);
},
message: 'Domo instance ' + chalk.grey('e.g. company.domo.com '),
name: 'instance',
default: currentLogin,
// only show up if they have previous logins
when: previousLogins.length > 0,
}, previousLogins, NEW_INSTANCE), {
type: 'input',
message: 'Domo instance ' + chalk.grey('e.g. company.domo.com '),
name: 'newInstance',
when: function (answers) {
// only ask if the instance selector wasn't used or new one was selected
return !answers.instance || answers.instance === NEW_INSTANCE;
},
validate: function (input) {
var acceptedDomains = ['domo.com', 'domotech.io', 'domorig.io'];
if (acceptedDomains.some(function (domain) { return input.endsWith(domain); })) {
return true;
}
return ('Please login using the full Domo instance. ' +
chalk.grey('Example: "company.domo.com"'));
},
});
}
// prompt user
inquirer
.prompt(prompts)
.then(function (answers) {
var instance = args.instance || answers.newInstance || answers.instance;
var login = new login_1.Login(instance);
login
.getClient()
.then(function (client) {
client
.login()
.catch(function () {
return log_1.log.fail('Failure to get user from server', 'There may be issues with your instance name, authorization, or domo dev token');
})
/*
.then(() => {
if (args.oauth) {
const manifest: string =
args.manifestFile !== undefined
? args.manifestFile
: 'manifest.json';
if (Oauth.isOAuthEnabled(manifest)) {
if (Oauth.hasAppProxyId(manifest)) {
return setupOauth(
instance,
manifest,
);
} else {
return promptAppProxyId().then(proxyId => {
return setupOauth(
instance,
manifest,
proxyId,
);
});
}
}
} else return;
})
.catch(() => log.fail('Failure to setup oauth'))
*/
/*
.then(
checkVersion.bind(null, instance)
)
//@ts-ignore
.then(versionCheckFn)
.catch(() => console.log ("NPM servers are down, skipping checking for latest version."))
*/
.then(function (loginData) {
console.log(chalk.grey(constant_1.logo));
log_1.log.ok('Login to ' + instance + ' successful.',
//@ts-ignore
'Welcome, ' + loginData.displayName + '.');
return login.persistLogin(
//@ts-ignore
loginData.refreshToken, client.getDevToken());
})
.catch(function (err) {
return log_1.log.fail("Login unsuccessful: ".concat(JSON.stringify(err)));
})
.finally(process.exit);
})
.catch(function (test) {
return log_1.log.notAuthenticated;
});
})
.catch(function (err) {
return log_1.log.fail("Login failed, likely an issue with data in ~/.config/configstore/ryuu: ".concat(err));
});
});
};
/**
* E.T. phone home
*/
function checkVersion(instance) {
var cliVersion = require(path.resolve(__dirname + '/../package.json')).version;
var options = {
url: 'https://' +
instance +
'/domoapps/admin/checkversion?version=' +
cliVersion,
method: 'GET',
headers: {
Accept: 'application/json',
},
};
return (0, axios_1.default)(options);
}
/**
* log message based on the action
* if action is 'block' then 'fail' will get called and end the process early
*/
function verifyVersion(res) {
var body = Array.isArray(res.data) ? res[0].data : res.data;
if (body.action === 'block') {
log_1.log.fail(body.message);
}
if (body.action === 'warn') {
log_1.log.warn(body.message);
return promptUpgrade(body.latest);
}
if (body.action === 'info') {
log_1.log.info(body.message);
return promptUpgrade(body.latest);
}
}
function promptUpgrade(latest) {
return new Promise(function (resolve, reject) {
var prompts = [];
if (!autoUpdate) {
prompts.push({
type: 'confirm',
message: 'Would you like to upgrade now?',
name: 'upgrade',
default: true,
});
}
inquirer.prompt(prompts).then(function (answers) {
if (autoUpdate === true) {
answers.upgrade = autoUpdate;
}
if (answers.upgrade) {
log_1.log.info('Upgrading to latest version', 'Hang tight, this may take a moment...');
var output = shell.exec('npm install ryuu -g', {
async: false,
silent: true,
});
if (output.code === 0) {
log_1.log.ok('Upgrade to version ' + latest + ' successful');
Promise.resolve();
}
else {
log_1.log.warn('Upgrade unsuccessful', 'Please try upgrading manually with npm install -g ryuu');
}
}
else {
Promise.resolve();
}
});
});
}
/**
* Oauth Code
*/
function promptAppProxyId() {
return new Promise(function (resolve, reject) {
inquirer
.prompt([
{
type: 'input',
message: 'Please enter the app instance id ' + chalk.grey('(oauth proxy) '),
name: 'proxyId',
},
])
.then(function (answer) { return resolve(answer.proxyId.trim()); });
});
}
function setupOauth(instance, manifestName, proxyId) {
if (!oauth_1.Oauth.hasTokens({ instance: instance, manifestName: manifestName, proxyId: proxyId })) {
return oauth_1.Oauth.register({ instance: instance, manifestName: manifestName, proxyId: proxyId })
.then(function (response) {
var result = response.data;
log_1.log.ok('Valid Device Id');
return oauth_1.Oauth.verifyRegistration({
instance: instance,
manifestName: manifestName,
proxyId: proxyId,
verification_uri: result['verification_uri'],
user_code: result['user_code'],
device_code: result['device_code'],
});
})
.then(function (response) {
var result = response.data;
log_1.log.ok('Retrieved Oauth Tokens');
oauth_1.Oauth.persistTokens({
instance: instance,
manifestName: manifestName,
proxyId: proxyId,
accessToken: result['access_token'],
refreshToken: result['refresh_token'],
});
})
.catch(function (error) {
log_1.log.fail(error);
});
}
}
//# sourceMappingURL=login.js.map