UNPKG

lambdasync

Version:

Easy sync between local code and AWS lambda functions

149 lines (138 loc) 4.49 kB
const path = require('path'); const inquirer = require('inquirer'); const ini = require('ini'); const {readFile, writeFile} = require('./file'); const {markdown, addInputDefault, handleGenericFailure} = require('./util'); const {getAccountId} = require('./iam'); const {AWS_CREDENTIALS_PATH, AWS_CONFIG_PATH} = require('./constants'); const { updateSettings, getAwsSettings, getSettings } = require('./settings.js'); const { EXCEPTIONS, PROMPT_INPUT_PROFILE_NAME, PROMPT_INPUT_FUNCTION_NAME, PROMPT_INPUT_ACCESS_KEY, PROMPT_INPUT_SECRET_KEY, PROMPT_CHOICE_REGION } = require('./constants.js'); function init() { return getSettings() .then(settings => { if (settings.lambdaName && settings.profileName && settings.accountId) { console.log(markdown({ templatePath: 'markdown/init-twice.md' })); throw EXCEPTIONS.INIT_ALREADY_RUN; } else { return; } }) .then(getDefaults) .then(getSettingsInput) .catch(handleGenericFailure); } function getDefaults() { return new Promise((resolve, reject) => { console.log(markdown({ templatePath: 'markdown/init.md' })); inquirer.prompt([PROMPT_INPUT_PROFILE_NAME]) .then(({profileName}) => { return getAwsSettings() .then(([credentials, config]) => ({ credentials, config, profileName })) .catch(() => ({profileName})); // eslint-disable-line handle-callback-err no-unused-expressions }) .then(settings => { return readFile(path.join(process.cwd(), 'package.json'), JSON.parse) .then(packageJson => ({settings, packageJson})) .catch(() => ({settings})); }) .then(({settings = {}, packageJson = {}}) => { const {credentials, config, profileName} = settings; const {name} = packageJson; if (credentials && credentials[profileName] && config && config['profile ' + profileName]) { resolve({ profileName, lambdaName: name || '', accessKey: credentials[profileName].aws_access_key_id, // eslint-disable-line camelcase secretKey: credentials[profileName].aws_secret_access_key, // eslint-disable-line camelcase region: config['profile ' + profileName].region }); } else { resolve({ profileName, lambdaName: name || '' }); } }) .catch(err => reject(err)); }); } function getSettingsInput(defaults) { const prompts = []; prompts.push(addInputDefault(defaults, PROMPT_INPUT_FUNCTION_NAME)); if (!defaults.accessKey) { prompts.push(addInputDefault(defaults, PROMPT_INPUT_ACCESS_KEY)); } if (!defaults.secretKey) { prompts.push(addInputDefault(defaults, PROMPT_INPUT_SECRET_KEY)); } prompts.push(addInputDefault(defaults, PROMPT_CHOICE_REGION)); return inquirer.prompt(prompts) .then(result => { const settings = Object.assign(defaults, result); return Promise.all([ updateSettings(settings), persistAwsConfig(settings) ]) .then(getSettings); }) .then(getAccountId) .then(settings => { console.log(markdown({ templatePath: 'markdown/init-success.md', data: settings })); return settings; }); } function persistAwsConfig(conf) { return getAwsSettings() .then(([credentials, config]) => { const persistCredentials = () => { const newCredentials = Object.assign({}, credentials); newCredentials[conf.profileName] = { aws_access_key_id: conf.accessKey, // eslint-disable-line camelcase aws_secret_access_key: conf.secretKey // eslint-disable-line camelcase }; writeFile(AWS_CREDENTIALS_PATH, newCredentials, ini.stringify); }; const persistConfig = () => { const newConfig = Object.assign({}, config); newConfig['profile ' + conf.profileName] = { output: newConfig.output || 'json', region: conf.region }; writeFile(AWS_CONFIG_PATH, newConfig, ini.stringify) .catch(err => { console.error(err); }); }; persistCredentials(); persistConfig(); }); } function maybeInit(settings) { if (settings.lambdaName && settings.profileName && settings.accountId) { return settings; } return init(); } module.exports = maybeInit;