You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
507 lines
18 KiB
507 lines
18 KiB
// Generated by CoffeeScript 1.6.2
|
|
var ConsoleInterface, TaskGroup, balUtil, cliColor, extendr, pathUtil, safefs,
|
|
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
|
|
__slice = [].slice,
|
|
__hasProp = {}.hasOwnProperty;
|
|
|
|
cliColor = require('caterpillar').cliColor;
|
|
|
|
pathUtil = require('path');
|
|
|
|
balUtil = require('bal-util');
|
|
|
|
safefs = require('safefs');
|
|
|
|
TaskGroup = require('taskgroup').TaskGroup;
|
|
|
|
extendr = require('extendr');
|
|
|
|
ConsoleInterface = (function() {
|
|
function ConsoleInterface(opts, next) {
|
|
this.watch = __bind(this.watch, this);
|
|
this.skeleton = __bind(this.skeleton, this);
|
|
this.clean = __bind(this.clean, this);
|
|
this.server = __bind(this.server, this);
|
|
this.run = __bind(this.run, this);
|
|
this.render = __bind(this.render, this);
|
|
this.install = __bind(this.install, this);
|
|
this.info = __bind(this.info, this);
|
|
this.help = __bind(this.help, this);
|
|
this.generate = __bind(this.generate, this);
|
|
this.action = __bind(this.action, this);
|
|
this.welcomeCallback = __bind(this.welcomeCallback, this);
|
|
this.selectSkeletonCallback = __bind(this.selectSkeletonCallback, this);
|
|
this.extractConfig = __bind(this.extractConfig, this);
|
|
this.completeAction = __bind(this.completeAction, this);
|
|
this.performAction = __bind(this.performAction, this);
|
|
this.handleError = __bind(this.handleError, this);
|
|
this.getCommander = __bind(this.getCommander, this);
|
|
this.start = __bind(this.start, this);
|
|
var commander, consoleInterface, docpad, locale, version;
|
|
|
|
consoleInterface = this;
|
|
this.docpad = docpad = opts.docpad;
|
|
this.commander = commander = require('commander');
|
|
locale = docpad.getLocale();
|
|
version = require(__dirname + '/../../../package.json').version;
|
|
commander.version(version).option('-o, --out <outPath>', locale.consoleOptionOut).option('-c, --config <configPath>', locale.consoleOptionConfig).option('-e, --env <environment>', locale.consoleOptionEnv).option('-d, --debug [logLevel]', locale.consoleOptionDebug, parseInt).option('-f, --force', locale.consoleOptionForce).option('-p, --port <port>', locale.consoleOptionPort, parseInt).option('-s, --skeleton <skeleton>', locale.consoleOptionSkeleton);
|
|
commander.command('action <actions>').description(locale.consoleDescriptionRun).action(consoleInterface.wrapAction(consoleInterface.action));
|
|
commander.command('run').description(locale.consoleDescriptionRun).action(consoleInterface.wrapAction(consoleInterface.run));
|
|
commander.command('server').description(locale.consoleDescriptionServer).action(consoleInterface.wrapAction(consoleInterface.server));
|
|
commander.command('skeleton').description(locale.consoleDescriptionSkeleton).option('-s, --skeleton <skeleton>', locale.consoleOptionSkeleton).action(consoleInterface.wrapAction(consoleInterface.skeleton));
|
|
commander.command('render [path]').description(locale.consoleDescriptionRender).action(consoleInterface.wrapAction(consoleInterface.render, {
|
|
logLevel: 5,
|
|
checkVersion: false,
|
|
welcome: false,
|
|
prompts: false
|
|
}));
|
|
commander.command('generate').description(locale.consoleDescriptionGenerate).action(consoleInterface.wrapAction(consoleInterface.generate));
|
|
commander.command('watch').description(locale.consoleDescriptionWatch).action(consoleInterface.wrapAction(consoleInterface.watch));
|
|
commander.command('install').description(locale.consoleDescriptionInstall).action(consoleInterface.wrapAction(consoleInterface.install));
|
|
commander.command('clean').description(locale.consoleDescriptionClean).action(consoleInterface.wrapAction(consoleInterface.clean));
|
|
commander.command('info').description(locale.consoleDescriptionInfo).action(consoleInterface.wrapAction(consoleInterface.info));
|
|
commander.command('help').description(locale.consoleDescriptionHelp).action(consoleInterface.wrapAction(consoleInterface.help));
|
|
commander.command('*').description(locale.consoleDescriptionUnknown).action(consoleInterface.wrapAction(consoleInterface.help));
|
|
docpad.on('welcome', function(data, next) {
|
|
return consoleInterface.welcomeCallback(data, next);
|
|
});
|
|
docpad.emitSync('consoleSetup', {
|
|
consoleInterface: consoleInterface,
|
|
commander: commander
|
|
}, function(err) {
|
|
if (err) {
|
|
return consoleInterface.handleError(err);
|
|
}
|
|
return next(null, consoleInterface);
|
|
});
|
|
this;
|
|
}
|
|
|
|
ConsoleInterface.prototype.start = function(argv) {
|
|
this.commander.parse(argv || process.argv);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.getCommander = function() {
|
|
return this.commander;
|
|
};
|
|
|
|
ConsoleInterface.prototype.handleError = function(err) {
|
|
var docpad, locale;
|
|
|
|
docpad = this.docpad;
|
|
locale = docpad.getLocale();
|
|
docpad.log('error', locale.consoleError);
|
|
docpad.error(err);
|
|
process.exit(1);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.wrapAction = function(action, config) {
|
|
var consoleInterface;
|
|
|
|
consoleInterface = this;
|
|
return function() {
|
|
var args;
|
|
|
|
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
|
|
return consoleInterface.performAction(action, args, config);
|
|
};
|
|
};
|
|
|
|
ConsoleInterface.prototype.performAction = function(action, args, config) {
|
|
var opts,
|
|
_this = this;
|
|
|
|
opts = {};
|
|
opts.commander = args.slice(-1)[0];
|
|
opts.args = args.slice(0, -1);
|
|
opts.instanceConfig = extendr.safeDeepExtendPlainObjects({}, this.extractConfig(opts.commander), config);
|
|
this.docpad.action('load ready', opts.instanceConfig, function(err) {
|
|
if (err) {
|
|
return _this.completeAction(err);
|
|
}
|
|
return action(_this.completeAction, opts);
|
|
});
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.completeAction = function(err) {
|
|
var docpad, locale;
|
|
|
|
docpad = this.docpad;
|
|
locale = docpad.getLocale();
|
|
if (err) {
|
|
this.handleError(err);
|
|
} else {
|
|
docpad.log('info', locale.consoleSuccess);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.extractConfig = function(customConfig) {
|
|
var commanderConfig, config, configPath, key, outPath, sourceConfig, value;
|
|
|
|
if (customConfig == null) {
|
|
customConfig = {};
|
|
}
|
|
config = {};
|
|
commanderConfig = this.commander;
|
|
sourceConfig = this.docpad.initialConfig;
|
|
if (commanderConfig.debug) {
|
|
if (commanderConfig.debug === true) {
|
|
commanderConfig.debug = 7;
|
|
}
|
|
commanderConfig.logLevel = commanderConfig.debug;
|
|
}
|
|
if (commanderConfig.config) {
|
|
configPath = pathUtil.resolve(process.cwd(), commanderConfig.config);
|
|
commanderConfig.configPaths = [configPath];
|
|
}
|
|
if (commanderConfig.out) {
|
|
outPath = pathUtil.resolve(process.cwd(), commanderConfig.out);
|
|
commanderConfig.outPath = outPath;
|
|
}
|
|
for (key in commanderConfig) {
|
|
if (!__hasProp.call(commanderConfig, key)) continue;
|
|
value = commanderConfig[key];
|
|
if (typeof sourceConfig[key] !== 'undefined') {
|
|
config[key] = value;
|
|
}
|
|
}
|
|
for (key in customConfig) {
|
|
if (!__hasProp.call(customConfig, key)) continue;
|
|
value = customConfig[key];
|
|
if (typeof sourceConfig[key] !== 'undefined') {
|
|
config[key] = value;
|
|
}
|
|
}
|
|
return config;
|
|
};
|
|
|
|
ConsoleInterface.prototype.selectSkeletonCallback = function(skeletonsCollection, next) {
|
|
var commander, docpad, locale, skeletonNames;
|
|
|
|
commander = this.commander;
|
|
docpad = this.docpad;
|
|
locale = docpad.getLocale();
|
|
skeletonNames = [];
|
|
console.log(cliColor.bold(locale.skeletonSelectionIntroduction + '\n'));
|
|
skeletonsCollection.forEach(function(skeletonModel) {
|
|
var skeletonDescription, skeletonName;
|
|
|
|
skeletonName = skeletonModel.get('name');
|
|
skeletonDescription = skeletonModel.get('description').replace(/\n/g, '\n\t');
|
|
skeletonNames.push(skeletonName);
|
|
return console.log("\t" + (cliColor.bold(skeletonName)) + "\n\t" + skeletonDescription + "\n");
|
|
});
|
|
console.log(cliColor.bold(locale.skeletonSelectionPrompt));
|
|
commander.choose(skeletonNames, function(i) {
|
|
process.stdin.destroy();
|
|
return next(null, skeletonsCollection.at(i));
|
|
});
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.welcomeCallback = function(opts, next) {
|
|
var commander, consoleInterface, docpad, locale, userConfig, welcomeTasks;
|
|
|
|
consoleInterface = this;
|
|
commander = this.commander;
|
|
docpad = this.docpad;
|
|
locale = docpad.getLocale();
|
|
userConfig = docpad.userConfig;
|
|
welcomeTasks = new TaskGroup().once('complete', next);
|
|
welcomeTasks.addTask(function(complete) {
|
|
if (docpad.config.prompts === false || userConfig.tos === true) {
|
|
return complete();
|
|
}
|
|
return consoleInterface.confirm(locale.tosPrompt, true, function(ok) {
|
|
return docpad.track('tos', {
|
|
ok: ok
|
|
}, function(err) {
|
|
if (ok) {
|
|
userConfig.tos = true;
|
|
console.log(locale.tosAgree);
|
|
docpad.updateUserConfig(complete);
|
|
} else {
|
|
console.log(locale.tosDisagree);
|
|
process.exit();
|
|
}
|
|
});
|
|
});
|
|
});
|
|
welcomeTasks.addTask(function(complete) {
|
|
if (docpad.config.prompts === false || (userConfig.subscribed != null) || ((userConfig.subscribeTryAgain != null) && (new Date()) > (new Date(userConfig.subscribeTryAgain)))) {
|
|
return complete();
|
|
}
|
|
return consoleInterface.confirm(locale.subscribePrompt, true, function(ok) {
|
|
return docpad.track('subscribe', {
|
|
ok: ok
|
|
}, function(err) {
|
|
var commands;
|
|
|
|
if (!ok) {
|
|
console.log(locale.subscribeIgnore);
|
|
userConfig.subscribed = false;
|
|
docpad.updateUserConfig(function(err) {
|
|
if (err) {
|
|
return complete(err);
|
|
}
|
|
return balUtil.wait(2000, complete);
|
|
});
|
|
return;
|
|
}
|
|
commands = [['config', '--get', 'user.name'], ['config', '--get', 'user.email'], ['config', '--get', 'github.user']];
|
|
return balUtil.spawnCommands('git', commands, function(err, results) {
|
|
var subscribeTasks, _ref, _ref1, _ref2;
|
|
|
|
userConfig.name || (userConfig.name = String((results != null ? (_ref = results[0]) != null ? _ref[1] : void 0 : void 0) || '').trim() || null);
|
|
userConfig.email || (userConfig.email = String((results != null ? (_ref1 = results[1]) != null ? _ref1[1] : void 0 : void 0) || '').trim() || null);
|
|
userConfig.username || (userConfig.username = String((results != null ? (_ref2 = results[2]) != null ? _ref2[1] : void 0 : void 0) || '').trim() || null);
|
|
if (userConfig.name || userConfig.email || userConfig.username) {
|
|
console.log(locale.subscribeConfigNotify);
|
|
}
|
|
subscribeTasks = new TaskGroup().once('complete', function(err) {
|
|
if (err) {
|
|
console.log(locale.subscribeError);
|
|
userConfig.subscribeTryAgain = new Date().getTime() + 1000 * 60 * 60 * 24;
|
|
} else {
|
|
console.log(locale.subscribeSuccess);
|
|
userConfig.subscribed = true;
|
|
userConfig.subscribeTryAgain = null;
|
|
}
|
|
return docpad.updateUserConfig(userConfig, complete);
|
|
});
|
|
subscribeTasks.addTask(function(complete) {
|
|
return consoleInterface.prompt(locale.subscribeNamePrompt, userConfig.name, function(result) {
|
|
userConfig.name = result;
|
|
return complete();
|
|
});
|
|
});
|
|
subscribeTasks.addTask(function(complete) {
|
|
return consoleInterface.prompt(locale.subscribeEmailPrompt, userConfig.email, function(result) {
|
|
userConfig.email = result;
|
|
return complete();
|
|
});
|
|
});
|
|
subscribeTasks.addTask(function(complete) {
|
|
return consoleInterface.prompt(locale.subscribeUsernamePrompt, userConfig.username, function(result) {
|
|
userConfig.username = result;
|
|
return complete();
|
|
});
|
|
});
|
|
subscribeTasks.addTask(function(complete) {
|
|
return docpad.updateUserConfig(complete);
|
|
});
|
|
subscribeTasks.addTask(function(complete) {
|
|
var requestUrl;
|
|
|
|
console.log(locale.subscribeProgress);
|
|
requestUrl = docpad.config.helperUrl + '?' + require('querystring').stringify({
|
|
method: 'add-subscriber',
|
|
name: userConfig.name,
|
|
email: userConfig.email,
|
|
username: userConfig.username
|
|
});
|
|
return balUtil.readPath(requestUrl, function(err, body) {
|
|
var data;
|
|
|
|
if (err) {
|
|
docpad.log('debug', locale.subscribeRequestError, err.message);
|
|
return complete(err);
|
|
}
|
|
docpad.log('debug', locale.subscribeRequestData, body);
|
|
try {
|
|
data = JSON.parse(body);
|
|
if (data.success === false) {
|
|
return complete(new Error(data.error || 'unknown error'));
|
|
} else {
|
|
return complete();
|
|
}
|
|
} catch (_error) {
|
|
err = _error;
|
|
return complete(err);
|
|
}
|
|
});
|
|
});
|
|
return subscribeTasks.run();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
welcomeTasks.run();
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.prompt = function(message, fallback, next) {
|
|
var commander, consoleInterface;
|
|
|
|
consoleInterface = this;
|
|
commander = this.commander;
|
|
if (fallback) {
|
|
message += " [" + fallback + "]";
|
|
}
|
|
commander.prompt(message + ' ', function(result) {
|
|
if (!result.trim()) {
|
|
if (fallback != null) {
|
|
result = fallback;
|
|
} else {
|
|
return consoleInterface.prompt(message, fallback, next);
|
|
}
|
|
}
|
|
return next(result);
|
|
});
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.confirm = function(message, fallback, next) {
|
|
var commander, consoleInterface;
|
|
|
|
consoleInterface = this;
|
|
commander = this.commander;
|
|
if (fallback === true) {
|
|
message += " [Y/n]";
|
|
} else if (fallback === false) {
|
|
message += " [y/N]";
|
|
}
|
|
commander.prompt(message + ' ', function(ok) {
|
|
if (!ok.trim()) {
|
|
if (fallback != null) {
|
|
ok = fallback;
|
|
} else {
|
|
return consoleInterface.confirm(message, fallback, next);
|
|
}
|
|
} else {
|
|
ok = /^y|yes|ok|true$/i.test(ok);
|
|
}
|
|
return next(ok);
|
|
});
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.action = function(next, opts) {
|
|
var actions;
|
|
|
|
actions = opts.args[0];
|
|
this.docpad.log('info', 'Performing the actions:', actions);
|
|
this.docpad.action(actions, next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.generate = function(next) {
|
|
this.docpad.action('generate', next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.help = function(next) {
|
|
var help;
|
|
|
|
help = this.commander.helpInformation();
|
|
console.log(help);
|
|
next();
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.info = function(next) {
|
|
var info;
|
|
|
|
info = require('util').inspect(this.docpad.config);
|
|
console.log(info);
|
|
next();
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.install = function(next) {
|
|
this.docpad.action('install', next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.render = function(next, opts) {
|
|
var basename, commander, data, docpad, filename, renderDocument, renderOpts, stdin, timeout, useStdin;
|
|
|
|
docpad = this.docpad;
|
|
commander = this.commander;
|
|
renderOpts = {};
|
|
filename = opts.args[0] || null;
|
|
basename = pathUtil.basename(filename);
|
|
renderOpts.filename = filename;
|
|
renderOpts.renderSingleExtensions = 'auto';
|
|
data = '';
|
|
useStdin = true;
|
|
renderDocument = function() {
|
|
return docpad.action('render', renderOpts, function(err, result) {
|
|
if (err) {
|
|
return docpad.fatal(err);
|
|
}
|
|
if (commander.out != null) {
|
|
return safefs.writeFile(commander.out, result, next);
|
|
} else {
|
|
process.stdout.write(result);
|
|
return next();
|
|
}
|
|
});
|
|
};
|
|
timeout = setTimeout(function() {
|
|
timeout = null;
|
|
if (data.replace(/\s+/, '')) {
|
|
return;
|
|
}
|
|
useStdin = false;
|
|
stdin.pause();
|
|
return renderDocument();
|
|
}, 1000);
|
|
stdin = process.stdin;
|
|
stdin.resume();
|
|
stdin.setEncoding('utf8');
|
|
stdin.on('data', function(_data) {
|
|
return data += _data.toString();
|
|
});
|
|
process.stdin.on('end', function() {
|
|
if (!useStdin) {
|
|
return;
|
|
}
|
|
if (timeout) {
|
|
clearTimeout(timeout);
|
|
timeout = null;
|
|
}
|
|
renderOpts.data = data;
|
|
return renderDocument();
|
|
});
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.run = function(next) {
|
|
this.docpad.action('run', {
|
|
selectSkeletonCallback: this.selectSkeletonCallback
|
|
}, next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.server = function(next) {
|
|
this.docpad.action('server generate', next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.clean = function(next) {
|
|
this.docpad.action('clean', next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.skeleton = function(next) {
|
|
this.docpad.action('skeleton', {
|
|
selectSkeletonCallback: this.selectSkeletonCallback
|
|
}, next);
|
|
return this;
|
|
};
|
|
|
|
ConsoleInterface.prototype.watch = function(next) {
|
|
this.docpad.action('generate watch', next);
|
|
return this;
|
|
};
|
|
|
|
return ConsoleInterface;
|
|
|
|
})();
|
|
|
|
module.exports = ConsoleInterface;
|