embark/lib/cmd.js

249 lines
8.2 KiB
JavaScript
Raw Normal View History

2017-10-14 10:06:09 +00:00
const program = require('commander');
const promptly = require('promptly');
2017-12-19 19:07:48 +00:00
const utils = require('./utils/utils.js');
2017-03-30 13:16:46 +00:00
const Embark = require('../lib/index');
let embark = new Embark;
2016-08-18 00:29:41 +00:00
2017-03-30 11:12:39 +00:00
class Cmd {
constructor() {
2017-03-30 13:16:46 +00:00
program.version(embark.version);
}
2016-08-18 00:29:41 +00:00
2017-03-30 11:12:39 +00:00
process(args) {
this.newApp();
this.demo();
this.build();
this.run();
this.blockchain();
this.simulator();
this.test();
2018-01-11 14:22:58 +00:00
this.reset();
this.graph();
2017-03-30 11:12:39 +00:00
this.upload();
2017-12-19 15:20:05 +00:00
this.versionCmd();
2017-03-30 11:12:39 +00:00
this.otherCommands();
//If no arguments are passed display help by default
if (!process.argv.slice(2).length) {
program.help();
}
2017-03-30 11:12:39 +00:00
program.parse(args);
}
2017-10-14 10:06:09 +00:00
newApp() {
2017-03-30 11:12:39 +00:00
let validateName = function (value) {
try {
2017-10-14 10:06:09 +00:00
if (value.match(/^[a-zA-Z\s-]+$/)) return value;
2017-03-30 11:12:39 +00:00
} catch (e) {
throw new Error('Name must be only letters, spaces, or dashes');
2017-03-22 05:13:58 +00:00
}
2017-03-30 11:12:39 +00:00
};
program
.command('new [name]')
.description('new application')
2018-03-29 23:42:47 +00:00
.option('--simple', 'create a barebones project meant only for contract development')
.action(function (name, options) {
2017-03-30 11:12:39 +00:00
if (name === undefined) {
2017-06-27 19:45:30 +00:00
return promptly.prompt("Name your app (default is embarkDApp):", {
default: "embarkDApp",
2017-03-30 11:12:39 +00:00
validator: validateName
}, function (err, inputvalue) {
if (err) {
console.error('Invalid name:', err.message);
// Manually call retry
// The passed error has a retry method to easily prompt again.
err.retry();
} else {
//slightly different assignment of name since it comes from child prompt
2018-03-29 23:42:47 +00:00
if (options.simple) {
embark.generateTemplate('simple', './', inputvalue);
} else {
embark.generateTemplate('boilerplate', './', inputvalue);
}
2017-03-30 11:12:39 +00:00
}
});
} else {
2018-03-29 23:42:47 +00:00
if (options.simple) {
embark.generateTemplate('simple', './', name);
} else {
embark.generateTemplate('boilerplate', './', name);
}
2017-03-30 11:12:39 +00:00
}
});
}
demo() {
program
.command('demo')
.description('create a working dapp with a SimpleStorage contract')
.action(function () {
2017-03-30 13:16:46 +00:00
embark.generateTemplate('demo', './', 'embark_demo');
2017-03-30 11:12:39 +00:00
});
}
build() {
program
.command('build [environment]')
.option('--logfile [logfile]', 'filename to output logs (default: none)')
.option('--loglevel [loglevel]', 'level of logging to display ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
2017-03-30 11:12:39 +00:00
.description('deploy and build dapp at dist/ (default: development)')
2017-10-14 10:06:09 +00:00
.action(function (env, _options) {
_options.env = env || 'development';
_options.logFile = _options.logfile; // fix casing
_options.logLevel = _options.loglevel; // fix casing
embark.build(_options);
2017-03-30 11:12:39 +00:00
});
}
run() {
program
.command('run [environment]')
.option('-p, --port [port]', 'port to run the dev webserver (default: 8000)')
.option('-b, --host [host]', 'host to run the dev webserver (default: localhost)')
.option('--noserver', 'disable the development webserver')
.option('--nodashboard', 'simple mode, disables the dashboard')
.option('--no-color', 'no colors in case it\'s needed for compatbility purposes')
.option('--logfile [logfile]', 'filename to output logs (default: none)')
.option('--loglevel [loglevel]', 'level of logging to display ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
2017-03-30 11:12:39 +00:00
.description('run dapp (default: development)')
.action(function (env, options) {
2017-03-30 13:16:46 +00:00
embark.run({
2017-03-30 11:12:39 +00:00
env: env || 'development',
serverPort: options.port,
serverHost: options.host,
runWebserver: !options.noserver,
useDashboard: !options.nodashboard,
logFile: options.logfile,
logLevel: options.loglevel
2017-03-30 11:12:39 +00:00
});
});
}
blockchain() {
program
.command('blockchain [environment]')
2018-03-29 22:12:07 +00:00
.option('-c, --client [client]', 'Use a specific ethereum client or simulator (supported: geth, testrpc)')
2017-03-30 11:12:39 +00:00
.description('run blockchain server (default: development)')
.action(function (env, options) {
2017-03-30 13:16:46 +00:00
embark.initConfig(env || 'development', {
2017-03-30 11:12:39 +00:00
embarkConfig: 'embark.json',
interceptLogs: false
});
2017-03-30 13:16:46 +00:00
embark.blockchain(env || 'development', options.client || 'geth');
2017-03-30 11:12:39 +00:00
});
}
simulator() {
program
.command('simulator [environment]')
.description('run a fast ethereum rpc simulator')
.option('--testrpc', 'use testrpc as the rpc simulator [default]')
2017-12-27 22:48:33 +00:00
.option('-p, --port [port]', 'port to run the rpc simulator (default: 8545)')
2017-03-30 11:12:39 +00:00
.option('-h, --host [host]', 'host to run the rpc simulator (default: localhost)')
2017-12-27 22:48:33 +00:00
.option('-a, --accounts [numAccounts]', 'number of accounts (default: 10)')
.option('-e, --defaultBalanceEther [balance]', 'Amount of ether to assign each test account (default: 100)')
.option('-l, --gasLimit [gasLimit]', 'custom gas limit (default: 8000000)')
2017-03-30 11:12:39 +00:00
.action(function (env, options) {
2017-03-30 13:16:46 +00:00
embark.initConfig(env || 'development', {
2017-03-30 11:12:39 +00:00
embarkConfig: 'embark.json',
interceptLogs: false
});
2017-12-27 22:48:33 +00:00
embark.simulator({
port: options.port,
host: options.host,
numAccounts: options.numAccounts,
defaultBalance: options.balance,
gasLimit: options.gasLimit
});
2017-03-30 11:12:39 +00:00
});
}
test() {
program
.command('test [file]')
2017-03-30 11:12:39 +00:00
.description('run tests')
.action(function (file) {
embark.initConfig('development', {
embarkConfig: 'embark.json', interceptLogs: false
});
embark.runTests(file);
2017-03-30 11:12:39 +00:00
});
}
upload() {
program
.command('upload <platform> [environment]')
.option('--logfile [logfile]', 'filename to output logs (default: none)')
.option('--loglevel [loglevel]', 'level of logging to display ["error", "warn", "info", "debug", "trace"]', /^(error|warn|info|debug|trace)$/i, 'debug')
.description('Upload your dapp to a decentralized storage (e.g embark upload ipfs).')
2017-10-14 10:06:09 +00:00
.action(function (platform, env, _options) {
_options.env = env || 'development';
_options.logFile = _options.logfile; // fix casing
_options.logLevel = _options.loglevel; // fix casing
embark.upload(platform, _options);
2017-03-30 11:12:39 +00:00
});
}
graph() {
program
.command('graph [environment]')
.option('--skip-undeployed', 'Graph will not include undeployed contracts')
.option('--skip-functions', 'Graph will not include functions')
.option('--skip-events', 'Graph will not include events')
.description('generates documentation based on the smart contracts configured')
.action(function (env, options) {
embark.graph({
env: env || 'development',
logFile: options.logfile,
skipUndeployed: options.skipUndeployed,
skipFunctions: options.skipFunctions,
skipEvents: options.skipEvents
});
});
}
2018-01-11 14:22:58 +00:00
reset() {
program
.command('reset')
.description('resets embarks state on this dapp including clearing cache')
2018-01-12 19:21:36 +00:00
.action(function () {
2018-01-11 14:22:58 +00:00
embark.initConfig('development', {
embarkConfig: 'embark.json', interceptLogs: false
});
embark.reset();
});
}
2017-12-19 15:20:05 +00:00
versionCmd() {
program
.command('version')
.description('output the version number')
.action(function () {
console.log(embark.version);
process.exit(0);
});
}
2017-03-30 11:12:39 +00:00
otherCommands() {
program
2017-12-19 18:29:48 +00:00
.action(function (cmd) {
console.log('unknown command "%s"'.red, cmd);
2017-12-19 20:48:56 +00:00
let dictionary = ['new', 'demo', 'build', 'run', 'blockchain', 'simulator', 'test', 'upload', 'version'];
2017-12-19 19:07:48 +00:00
let suggestion = utils.proposeAlternative(cmd, dictionary);
2017-12-19 18:29:48 +00:00
if (suggestion) {
console.log('did you mean "%s"?'.green, suggestion);
}
2017-03-30 11:12:39 +00:00
console.log("type embark --help to see the available commands");
process.exit(0);
});
}
2017-03-22 05:13:58 +00:00
2017-03-30 11:12:39 +00:00
}
2016-08-18 00:29:41 +00:00
module.exports = Cmd;