balena-cli/build/actions/wizard.js

109 lines
4.5 KiB
JavaScript

(function() {
var Promise, _, async, capitano, form, mkdirp, resin, visuals;
_ = require('lodash');
Promise = require('bluebird');
capitano = Promise.promisifyAll(require('capitano'));
mkdirp = require('mkdirp');
visuals = require('resin-cli-visuals');
async = require('async');
resin = require('resin-sdk');
form = require('resin-cli-form');
exports.wizard = {
signature: 'quickstart [name]',
description: 'getting started with resin.io',
help: 'Use this command to run a friendly wizard to get started with resin.io.\n\nThe wizard will guide you through:\n\n - Create an application.\n - Initialise an SDCard with the resin.io operating system.\n - Associate an existing project directory with your resin.io application.\n - Push your project to your devices.\n\nExamples:\n\n $ sudo resin quickstart\n $ sudo resin quickstart MyApp',
root: true,
permission: 'user',
action: function(params, options, done) {
return async.waterfall([
function(callback) {
if (params.name != null) {
return callback();
}
return async.waterfall([
function(callback) {
return resin.models.application.hasAny().nodeify(callback);
}, function(hasAnyApplications, callback) {
if (!hasAnyApplications) {
return callback(null, null);
}
return async.waterfall([
function(callback) {
return resin.models.application.getAll().nodeify(callback);
}, function(applications, callback) {
applications = _.pluck(applications, 'app_name');
applications.unshift({
name: 'Create a new application',
value: null
});
return form.ask({
message: 'Select an application',
type: 'list',
choices: applications
}).nodeify(callback);
}
], callback);
}, function(application, callback) {
if (application != null) {
return callback(null, application);
}
return form.ask({
message: 'Choose a Name for your new application',
type: 'input'
}).then(function(applicationName) {
return capitano.runAsync("app create " + applicationName)["return"](applicationName);
}).nodeify(callback);
}, function(applicationName, callback) {
params.name = applicationName;
return callback();
}
], callback);
}, function(callback) {
return capitano.run("device init --application " + params.name, callback);
}, function(deviceUuid, callback) {
params.uuid = deviceUuid;
return resin.models.device.getName(params.uuid).then(function(deviceName) {
params.deviceName = deviceName;
console.log("Waiting for " + params.deviceName + " to connect to resin...");
return capitano.runAsync("device await " + params.uuid)["return"](callback);
}).nodeify(callback);
}, function(callback) {
console.log("The device " + params.deviceName + " successfully connected to resin!");
console.log('');
return capitano.run("device " + params.uuid, callback);
}, function(callback) {
console.log('Your device is ready, lets start pushing some code!');
return resin.settings.get('projectsDirectory').then(function(projectsDirectory) {
return form.ask({
message: 'Please choose a directory for your code',
type: 'input',
"default": projectsDirectory
});
}).nodeify(callback);
}, function(directoryName, callback) {
params.directory = directoryName;
return mkdirp(directoryName, callback);
}, function(made, callback) {
console.log("Associating " + params.name + " with " + params.directory + "...");
process.chdir(params.directory);
return capitano.run("app associate " + params.name, callback);
}, function(remoteUrl, callback) {
console.log("Resin git remote added: " + remoteUrl);
console.log("Please type:\n\n $ cd " + params.directory + " && git push resin master\n\nTo push your project to resin.io.");
return callback();
}
], done);
}
};
}).call(this);