@platformos/pos-cli
Version:
Manage your platformOS application
108 lines (89 loc) • 3.38 kB
JavaScript
const program = require('commander'),
fs = require('fs'),
rl = require('readline'),
logger = require('../lib/logger'),
validate = require('../lib/validators'),
files = require('../lib/files'),
Portal = require('../lib/portal');
// turn to promise
const getPassword = () => {
return new Promise((resolve, reject) => {
const reader = rl.createInterface({ input: process.stdin, output: process.stdout });
reader.stdoutMuted = true;
reader.question('Password: ', password => {
reader.close();
logger.Info('');
resolve(password);
});
reader._writeToOutput = stringToWrite => {
(reader.stdoutMuted && reader.output.write('*')) || reader.output.write(stringToWrite);
};
});
};
const storeEnvironment = settings => {
logger.Debug(`[storeEnvironment] ${JSON.stringify(settings, null, 2)}`);
const environmentSettings = {
[settings.endpoint]: {
url: settings.url,
token: settings.token,
email: settings.email
}
};
const configPath = files.getConfigPath();
logger.Debug(`[storeEnvironment] Current config path: ${configPath}`);
const newSettings = Object.assign({}, files.getConfig(), environmentSettings);
fs.writeFileSync(configPath, JSON.stringify(newSettings, null, 2));
};
const help = () => {
program.outputHelp();
process.exit(1);
}
const checkParams = params => {
validate.existence({ argumentValue: params.email, argumentName: 'email', fail: help });
validate.existence({ argumentValue: params.url, argumentName: 'URL', fail: help });
validate.existence({ argumentValue: program.args[0], argumentName: 'environment', fail: help });
validate.email(params.email);
if (params.url.slice(-1) != '/') {
params.url = params.url + '/';
}
validate.url(params.url);
};
program
.name('pos-cli env add')
.arguments('[environment]', 'name of environment. Example: staging')
.option('--email <email>', 'Partner Portal account email. Example: admin@example.com')
.option('--url <url>', 'marketplace url. Example: https://example.com')
.option(
'--token <token>',
'if you have a token you can add it directly to pos-cli configuration without connecting to portal'
)
.action((environment, params) => {
checkParams(params);
const settings = { url: params.url, endpoint: environment, email: params.email };
if (params.token) {
storeEnvironment(Object.assign(settings, { token: params.token }));
logger.Success(`Environment ${params.url} as ${environment} has been added successfuly.`);
process.exit(0);
}
logger.Info(
`Please make sure that you have a permission to deploy. \n
You can verify it here: ${Portal.HOST}/me/permissions`,
{ hideTimestamp: true }
);
getPassword().then(password => {
logger.Info(`Asking ${Portal.HOST} for access token...`);
Portal.login(params.email, password, params.url)
.then(response => {
const token = response[0].token;
if (token) {
storeEnvironment(Object.assign(settings, { token }));
logger.Success(`Environment ${params.url} as ${environment} has been added successfuly.`);
}
})
.catch(e => {
logger.Error('Response from server invalid, token is missing.');
});
});
});
program.parse(process.argv);