diff --git a/bin/firebase b/bin/firebase index 3b494e85f96..d94f4f2e6de 100755 --- a/bin/firebase +++ b/bin/firebase @@ -29,7 +29,13 @@ if (argv._.length === 0) { } } else { - if (argv.help) { + if ( + argv.h || + argv.hel || + argv.hep || + argv.hepl || + argv.help + ) { help.showHelp(argv._[0]); @@ -40,14 +46,14 @@ if (argv._.length === 0) { // Top-level functionality case 'login': - firebase.login(); + firebase.login(argv); break; case 'logout': - firebase.logout(argv.d); + firebase.logout(argv); break; case 'ls': case 'list': - firebase.list(); + firebase.list(argv); break; // Submodules diff --git a/lib/app.js b/lib/app.js index f97a1f40069..a4240c909ed 100644 --- a/lib/app.js +++ b/lib/app.js @@ -18,7 +18,8 @@ var request = require('request'), _when = require('when'); var defaultSettings = { - 'public': '.' + 'public': '.', + 'ignore': ['firebase.json', '.*', '**/node_modules/**'] }; temp.track(); @@ -51,7 +52,7 @@ function getPrompt(schema, onComplete, idx, results) { module.exports = { init: function(argv) { - auth.listFirebases().then(function(res) { + auth.listFirebases(argv).then(function(res) { var settingsFile = path.resolve('./firebase.json'); if (fs.existsSync(settingsFile)) { @@ -120,7 +121,8 @@ module.exports = { } var settings = { firebase: results.firebase, - 'public': results['public'] + 'public': results['public'], + 'ignore': defaultSettings['ignore'] }; console.log('Initializing app into current directory...'); auth.checkCanAccess(results.firebase, function(err) { @@ -150,7 +152,7 @@ module.exports = { }); }, bootstrap: function(argv) { - _when.join(this.getTemplates(), auth.listFirebases()).done(function(resultSet) { + _when.join(this.getTemplates(), auth.listFirebases(argv)).done(function(resultSet) { var supportedTemplates = resultSet[0], res = resultSet[1]; @@ -213,18 +215,11 @@ module.exports = { results.directory = dir; console.log('Bootstrapping into directory \'' + dir + '\'...'); - try { - fs.mkdirSync(projectDir, '0755'); - } catch (err) { - console.log(chalk.red('Filesystem Error') + ' - Could not create new' + - ' directory'); - process.exit(1); - } // Load the project root if defined, and gracefully handle missing '/' - var templateRoot = supportedTemplates[results.template].templateRoot || '/'; - if (templateRoot && templateRoot[0] !== '/') { - templateRoot = '/' + templateRoot; + var templateRoot = (supportedTemplates[results.template].templateRoot || '/').replace(/\//g, path.sep); + if (templateRoot && templateRoot[0] !== path.sep) { + templateRoot = path.sep + templateRoot; } console.log('Downloading and unpacking template...'); @@ -284,15 +279,19 @@ module.exports = { console.log('Writing firebase.json settings file...'); var settings = { 'firebase': firebase, - 'public': '.' + 'public': defaultSettings['public'], + 'ignore': defaultSettings['ignore'] }; if (supportedTemplates[results.template].settings) { if (supportedTemplates[results.template].settings['public']) { - settings.public = supportedTemplates[results.template].settings['public'].replace(/\//g, path.sep) + settings.public = supportedTemplates[results.template].settings['public']; } if (supportedTemplates[results.template].settings['rules']) { - settings.rules = supportedTemplates[results.template].settings['rules'].replace(/\//g, path.sep); + settings.rules = supportedTemplates[results.template].settings['rules']; + } + if (supportedTemplates[results.template].settings['ignore']) { + settings.ignore = supportedTemplates[results.template].settings['ignore']; } } @@ -306,7 +305,7 @@ module.exports = { } console.log(chalk.green('Successfully added template')); - console.log('To deploy: %s then %s', chalk.bold(util.format('cd %s/', results.directory)), chalk.bold('firebase deploy')); + console.log('To deploy: %s then %s', chalk.bold(util.format('cd %s', results.directory + path.sep)), chalk.bold('firebase deploy')); }); }); }, function(error) { @@ -330,7 +329,7 @@ module.exports = { }); }, deploy: function(argv) { - auth.requireLogin(function(err) { + auth.requireLogin(argv, function(err) { if (err) { console.log(chalk.red('Login Error')); process.exit(1); @@ -440,7 +439,7 @@ module.exports = { message = argv.message; } - upload.send(settings.firebase, settings['public'], directoryRef.name(), message, function(err, directory) { + upload.send(settings.firebase, settings['public'], settings.ignore || defaultSettings.ignore, directoryRef.name(), message, function(err, directory) { if (err) { console.log(chalk.red('Deploy Error') + ' - Couldn\'t upload app'); console.log(err); diff --git a/lib/auth.js b/lib/auth.js index 266b1c8c756..d919ab4655d 100644 --- a/lib/auth.js +++ b/lib/auth.js @@ -12,10 +12,12 @@ var auth = { '.firebaserc' ), maxRetries: 3, - requireLogin: function(callback) { + requireLogin: function(argv, callback) { var that = this; - if ((this.email.length === 0) || (this.token.length === 0)) { + if (argv.email && argv.password) { + this._attemptLogin(this.maxRetries, callback); + } else if ((this.email.length === 0) || (this.token.length === 0)) { console.log('Please sign into your Firebase account to continue...'); this._attemptLogin(this.maxRetries, callback); } else { @@ -61,6 +63,8 @@ var auth = { if (tries > 0) { if (tries !== this.maxRetries) { console.log('Email or password incorrect, please try again'); + delete prompt.override.email; + delete prompt.override.password; } this._loginRequest(function(err, email, token) { if (err) { @@ -253,9 +257,9 @@ var auth = { } catch (e) {} return config; }, - listFirebases: function() { + listFirebases: function(argv) { return _when.promise(function(resolve, reject, notify) { - auth.requireLogin(function(err) { + auth.requireLogin(argv, function(err) { if (err) { var error = new Error('Login Unsuccessful'); error.type = 'LOGIN'; diff --git a/lib/firebase.js b/lib/firebase.js index cea4a7d8dc4..01deafd35ca 100644 --- a/lib/firebase.js +++ b/lib/firebase.js @@ -3,7 +3,7 @@ var auth = require('./auth'), chalk = require('chalk'); module.exports = { - login: function() { + login: function(argv) { auth.login(function(err) { if (err) { console.log(chalk.red('Login Unsuccessful')); @@ -13,8 +13,8 @@ module.exports = { } }); }, - logout: function(deleteAll) { - auth.logout(deleteAll, function(err) { + logout: function(argv) { + auth.logout(argv.d, function(err) { if (err) { console.log(chalk.red('Log Out Unsuccessful')); process.exit(1); @@ -23,8 +23,8 @@ module.exports = { } }); }, - list: function() { - auth.listFirebases().then(function(res) { + list: function(argv) { + auth.listFirebases(argv).then(function(res) { res.showFirebases(); }, function(error) { switch (error.type) { diff --git a/lib/upload.js b/lib/upload.js index d7a3cc18f97..b5b585cccd5 100644 --- a/lib/upload.js +++ b/lib/upload.js @@ -1,7 +1,7 @@ var request = require('request'), auth = require('./auth'), api = require('./api'), - fstream = require('fstream'), + fstreamIgnore = require('fstream-ignore'), tar = require('tar'), zlib = require('zlib'), temp = require('temp'), @@ -12,7 +12,7 @@ var request = require('request'), temp.track(); module.exports = { - send: function(firebase, publicDir, pushId, message, callback) { + send: function(firebase, publicDir, ignoreRules, pushId, message, callback) { var writeStream = temp.createWriteStream({ suffix: '.tar.gz' }), filename = writeStream.path, fileCount = 0, @@ -21,16 +21,11 @@ module.exports = { console.log('Preparing to deploy Public Directory...'); - fstream.Reader({ + var reader = fstreamIgnore({ path: publicDir, type: 'Directory', follow: true, filter: function() { - if (this.type !== 'Directory' && ( - this.basename.match(/^firebase\.json$/) || - this.basename.match(/^\./))) { - return false; - } if (this.type !== 'Directory') { fileCount += 1; } @@ -39,8 +34,11 @@ module.exports = { } return true; } - }) - .pipe(tar.Pack()) + }); + + reader.addIgnoreRules(ignoreRules); + + reader.pipe(tar.Pack()) .pipe(zlib.createGzip()) .pipe(writeStream); diff --git a/package.json b/package.json index d3569ee89dc..5dd0d5569f2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "firebase-tools", "preferGlobal": true, - "version": "1.0.0", + "version": "1.0.1", "description": "The Firebase Command Line Tools", "keywords": [ "firebase" @@ -29,7 +29,7 @@ "tar": "0.1.x", "open": "0.0.x", "request": "2.34.x", - "fstream": "0.1.x", + "fstream-ignore": "0.0.x", "temp": "0.6.x", "firebase": "~1.0.11", "progress": "~1.1.5",