diff --git a/bin/jaws b/bin/jaws index ee1095e19..1ad9279c7 100755 --- a/bin/jaws +++ b/bin/jaws @@ -41,6 +41,7 @@ program )); }); +//TODO: generate stage program .command('generate') .description('Create boilerplate structure for a new lambda or api gateway (or both)') @@ -134,10 +135,10 @@ program } }); -//TODO: support local env program .command('env [key] [val]') - .description('Manage env vars for stage. Valid cmds: list,get,set,unset. Ex: get USERNAME test or set USERNAME=blah test') + .description('Manage env vars for stage. Valid cmds: list,get,set,unset.' + + '\nEx: get test USERNAME or set test USERNAME blah.') .action(function(cmd, stage, key, val) { cmd = cmd.toLowerCase(); switch (cmd) { diff --git a/lib/commands/env.js b/lib/commands/env.js index a0f89f333..db2c0aeb3 100644 --- a/lib/commands/env.js +++ b/lib/commands/env.js @@ -8,6 +8,7 @@ var JawsError = require('../jaws-error'), Promise = require('bluebird'), utils = require('../utils'), + fs = require('fs'), AWSUtils = require('../utils/aws'), path = require('path'), chalk = require('chalk'), @@ -15,19 +16,31 @@ var JawsError = require('../jaws-error'), module.exports = function(JAWS) { JAWS.getEnvFileAsMap = function(awsProfile, awsRegion, bucketName, projectName, stage) { - return AWSUtils.getEnvFile( - awsProfile, - awsRegion, - bucketName, - projectName, - stage - ) - .then(function(s3ObjData) { - if (!s3ObjData.Body) { - return {}; - } + var _this = this, + deferred; - return dotenv.parse(s3ObjData.Body); + if (stage == 'local') { + deferred = Promise.resolve(fs.readFileSync(path.join(_this._meta.projectRootPath, 'back', '.env'))); + } else { + deferred = AWSUtils.getEnvFile( + awsProfile, + awsRegion, + bucketName, + projectName, + stage + ) + .then(function(s3ObjData) { + if (!s3ObjData.Body) { + return ''; + } + + return s3ObjData.Body; + }); + } + + return deferred + .then(function(envFileBuffer) { + return dotenv.parse(envFileBuffer); }) .catch(function(err) { return {}; @@ -56,7 +69,7 @@ module.exports = function(JAWS) { projectBucketName, projectName, stage - )]) + ),]) .spread(function(jawsJsonPaths, envMap) { var envInBackMap = {}; @@ -155,18 +168,22 @@ module.exports = function(JAWS) { delete envMap[key]; } - var contents = ""; + var contents = ''; Object.keys(envMap).forEach(function(newKey) { contents += [newKey, envMap[newKey]].join('=') + '\n'; }); - return AWSUtils.putEnvFile( - awsProfile, - projectBucketRegion, - projectBucketName, - projectName, - stage, - contents); + if (stage == 'local') { + return utils.writeFile(path.join(_this._meta.projectRootPath, 'back', '.env'), contents); + } else { + return AWSUtils.putEnvFile( + awsProfile, + projectBucketRegion, + projectBucketName, + projectName, + stage, + contents); + } }); }; }; diff --git a/lib/commands/new.js b/lib/commands/new.js index 2267bbb42..14764e943 100644 --- a/lib/commands/new.js +++ b/lib/commands/new.js @@ -169,7 +169,12 @@ function _getAnswers(projName, stage, s3Bucket, lambdaRegion, notificationEmail, * @private */ function _prepareProjectData(answers) { - // Set project name + if (answers.stage.toLowerCase() == 'local') { + Promise.reject(new JawsError( + 'Stage ' + answers.stage + ' is reserved', + JawsError.errorCodes.UNKNOWN)); + } + project.name = answers.name.toLowerCase().trim() .replace(/[^a-zA-Z-\d\s:]/g, '') .replace(/\s/g, '-') @@ -178,7 +183,7 @@ function _prepareProjectData(answers) { // AWS only allows Alphanumeric and - in name var nameOk = /^([a-zA-Z0-9-]+)$/.exec(project.name); if (!nameOk) { - reject(new JawsError( + Promise.reject(new JawsError( 'Project names can only be alphanumeric and -', JawsError.errorCodes.INVALID_PROJ_NAME)); } @@ -401,7 +406,6 @@ module.exports = function(JAWS) { * @returns {*} */ JAWS.new = function(projName, stage, s3Bucket, lambdaRegion, notificationEmail, awsProfile) { - return _getAnswers(projName, stage, s3Bucket, lambdaRegion, notificationEmail, awsProfile) .then(_prepareProjectData) .then(_createS3JawsStructure) //see if bucket is avail first before doing work