123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- (function() {
- var NpmAdapter, async, chalk, clip, commonOptions, displayListing, extendOptions, fetchListing, fileExists, fs, https, loadEnv, logger, lpad, main, max, mkdirp, normalizePluginName, npm, options, path, readJSON, ref, ref1, usage, waterfall,
- indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
- async = require('async');
- chalk = require('chalk');
- fs = require('fs');
- path = require('path');
- npm = require('npm');
- mkdirp = require('mkdirp');
- https = require('https');
- ref = require('./common'), NpmAdapter = ref.NpmAdapter, loadEnv = ref.loadEnv, commonOptions = ref.commonOptions, extendOptions = ref.extendOptions;
- ref1 = require('./../core/utils'), fileExists = ref1.fileExists, readJSON = ref1.readJSON;
- logger = require('./../core/logger').logger;
- usage = "\nusage: wintersmith plugin [options] <command>\n\ncommands:\n\n " + (chalk.bold('list')) + " - list available plugins\n " + (chalk.bold('install')) + " <plugin> - install plugin\n\noptions:\n\n -C, --chdir [path] change the working directory\n -c, --config [path] path to config\n";
- options = {};
- extendOptions(options, commonOptions);
- max = function(array, get) {
- var item, j, len, rv, v;
- if (get == null) {
- get = function(item) {
- return item;
- };
- }
- rv = null;
- for (j = 0, len = array.length; j < len; j++) {
- item = array[j];
- v = get(item);
- if (v > rv) {
- rv = v;
- }
- }
- return rv;
- };
- lpad = function(string, amount, char) {
- var i, j, p, ref2;
- if (char == null) {
- char = ' ';
- }
- p = '';
- for (i = j = 0, ref2 = amount - string.length; 0 <= ref2 ? j < ref2 : j > ref2; i = 0 <= ref2 ? ++j : --j) {
- p += char;
- }
- return p + string;
- };
- clip = function(string, maxlen) {
- if (string.length <= maxlen) {
- return string;
- }
- return string.slice(0, maxlen - 2).trim() + "..";
- };
- fetchListing = function(callback) {
- var request;
- return request = https.get('https://api.npms.io/v2/search?q=keywords:wintersmith-plugin&size=200', function(response) {
- var data, error;
- if (response.statusCode !== 200) {
- error = new Error("Unexpected response when searching registry, HTTP " + response.statusCode);
- }
- if (!/^application\/json/.test(response.headers['content-type'])) {
- error = new Error("Invalid content-type: " + response.headers['content-type']);
- }
- if (error != null) {
- response.resume();
- callback(error);
- return;
- }
- data = [];
- response.on('data', function(chunk) {
- return data.push(chunk);
- });
- return response.on('end', function() {
- var listing, parsed;
- try {
- parsed = JSON.parse(Buffer.concat(data));
- } catch (error1) {
- error = error1;
- callback(error);
- return;
- }
- listing = parsed.results.map(function(result) {
- return result["package"];
- });
- listing.sort(function(a, b) {
- if (a.name > b.name) {
- return 1;
- }
- if (a.name < b.name) {
- return -1;
- }
- return 0;
- });
- return callback(null, listing);
- });
- });
- };
- displayListing = function(list, callback) {
- var display, j, k, left, len, line, margin, maxw, pad, plugin, results;
- display = list.map(function(plugin) {
- var description, homepage, maintainers, name, ref2, ref3, ref4;
- name = normalizePluginName(plugin.name);
- description = plugin.description;
- maintainers = plugin.maintainers.map(function(v) {
- return v.username;
- }).join(' ');
- homepage = (ref2 = (ref3 = plugin.links) != null ? ref3.homepage : void 0) != null ? ref2 : (ref4 = plugin.links) != null ? ref4.npm : void 0;
- return {
- name: name,
- description: description,
- maintainers: maintainers,
- homepage: homepage
- };
- });
- pad = max(display, function(item) {
- return item.name.length;
- });
- maxw = process.stdout.getWindowSize()[0] - 2;
- margin = ((function() {
- results = [];
- for (var j = 0; 0 <= pad ? j < pad : j > pad; 0 <= pad ? j++ : j--){ results.push(j); }
- return results;
- }).apply(this).map(function() {
- return ' ';
- })).join('');
- for (k = 0, len = display.length; k < len; k++) {
- plugin = display[k];
- line = (lpad(plugin.name, pad)) + " " + (clip(plugin.description, maxw - pad - 2));
- left = maxw - line.length;
- if (left > plugin.maintainers.length) {
- line += chalk.grey(lpad(plugin.maintainers, left));
- }
- logger.info(line.replace(/^\s*(\S+) /, function(m) {
- return chalk.bold(m);
- }));
- if ((plugin.homepage != null) && plugin.homepage.length < maxw - pad - 2) {
- logger.info(margin + " " + (chalk.gray(plugin.homepage)));
- }
- logger.info('');
- }
- return callback(null, list);
- };
- waterfall = function(flow, callback) {
- /* async.waterfall that allows for parallel tasks */
- var item, j, len, resolved;
- resolved = [];
- for (j = 0, len = flow.length; j < len; j++) {
- item = flow[j];
- switch (typeof item) {
- case 'function':
- resolved.push(item);
- break;
- case 'object':
- case 'array':
- resolved.push(async.apply(async.parallel, item));
- break;
- default:
- return callback(new Error("Invalid item '" + item + "' in flow"));
- }
- }
- return async.waterfall(resolved, callback);
- };
- normalizePluginName = function(name) {
- return name.replace(/^wintersmith\-/, '');
- };
- main = function(argv) {
- var action, cmd, installPlugin, loadCurrentEnv;
- action = argv._[3];
- if (action == null) {
- console.log(usage);
- process.exit(0);
- }
- loadCurrentEnv = function(callback) {
- return loadEnv(argv, callback);
- };
- installPlugin = function(res, callback) {
- var configFile, createPackageJson, env, install, j, len, list, name, p, packageFile, plugin, readConfig, saveConfig, updateConfig;
- env = res[0], list = res[1];
- name = argv._[4];
- plugin = null;
- for (j = 0, len = list.length; j < len; j++) {
- p = list[j];
- if (normalizePluginName(p.name) === normalizePluginName(name)) {
- plugin = p;
- break;
- }
- }
- if (!plugin) {
- return callback(new Error("Unknown plugin: " + name));
- }
- configFile = env.config.__filename;
- packageFile = env.resolvePath('package.json');
- createPackageJson = function(callback) {
- return fileExists(packageFile, function(exists) {
- if (exists) {
- return callback();
- } else {
- logger.warn("package.json missing, creating minimal package");
- return fs.writeFile(packageFile, '{\n "dependencies": {},\n "private": true\n}\n', callback);
- }
- });
- };
- readConfig = function(callback) {
- return readJSON(configFile, callback);
- };
- updateConfig = function(config, callback) {
- var ref2;
- if (config.plugins == null) {
- config.plugins = [];
- }
- if (ref2 = plugin.name, indexOf.call(config.plugins, ref2) < 0) {
- config.plugins.push(plugin.name);
- }
- return callback(null, config);
- };
- saveConfig = function(config, callback) {
- var json;
- logger.verbose("saving config file: " + configFile);
- json = JSON.stringify(config, null, 2);
- return fs.writeFile(configFile, json + '\n', callback);
- };
- install = function(callback) {
- logger.verbose("installing " + plugin.name);
- process.chdir(env.workDir);
- return async.series([
- createPackageJson, function(callback) {
- return npm.load({
- logstream: new NpmAdapter(logger),
- save: true
- }, callback);
- }, function(callback) {
- return npm.install(plugin.name, callback);
- }
- ], function(error) {
- return callback(error);
- });
- };
- return async.waterfall([install, readConfig, updateConfig, saveConfig], callback);
- };
- switch (action) {
- case 'list':
- cmd = [fetchListing, displayListing];
- break;
- case 'install':
- cmd = [[loadCurrentEnv, fetchListing], installPlugin];
- break;
- default:
- cmd = [
- function(callback) {
- return callback(new Error("Unknown plugin action: " + action));
- }
- ];
- }
- return waterfall(cmd, function(error) {
- if (error != null) {
- logger.error(error.message, error);
- return process.exit(1);
- } else {
- return process.exit(0);
- }
- });
- };
- module.exports = main;
- module.exports.usage = usage;
- module.exports.options = options;
- }).call(this);
|