gentelella/vendors/update/index.js

170 lines
3.6 KiB
JavaScript

/*!
* update <https://github.com/jonschlinkert/update>
*
* Copyright (c) 2015, Jon Schlinkert.
* Licensed under the MIT License.
*/
'use strict';
var path = require('path');
var Base = require('assemble-core');
var expand = require('expand-args');
var minimist = require('minimist');
var config = require('./lib/config');
var locals = require('./lib/locals');
var utils = require('./lib/utils');
/**
* Create an `update` application. This is the main function exported
* by the update module.
*
* ```js
* var Update = require('update');
* var update = new Update();
* ```
* @param {Object} `options`
* @api public
*/
function Update(options) {
if (!(this instanceof Update)) {
return new Update(options);
}
Base.call(this, options);
this.name = this.options.name || 'update';
this.isUpdate = true;
this.initUpdate(this);
}
/**
* Inherit assemble-core
*/
Base.extend(Update);
/**
* Initialize Updater defaults
*/
Update.prototype.initUpdate = function(base) {
this.set('updaters', {});
// custom middleware handlers
this.handler('onStream');
this.handler('preWrite');
this.handler('postWrite');
// parse command line arguments
var argv = expand(minimist(process.argv.slice(2)), {
alias: {v: 'verbose'}
});
this.option('argv', argv);
// expose `argv` on the instance
this.mixin('argv', function(prop) {
var args = [].slice.call(arguments);
args.unshift(argv);
return utils.get.apply(null, args);
});
// load the package.json for the updater
this.data(utils.pkg.sync(this.options.path));
config(this);
this.use(locals('update'))
.use(utils.runtimes({
displayName: function(key) {
return base.name === key ? key : (base.name + ':' + key);
}
}))
.use(utils.store())
.use(utils.pipeline())
.use(utils.loader())
.use(utils.cli())
.use(utils.defaults())
.use(utils.opts())
var data = utils.get(this.cache.data, 'update');
this.config.process(utils.extend({}, data, argv));
this.engine(['md', 'tmpl'], require('engine-base'));
this.onLoad(/\.(md|tmpl)$/, function(view, next) {
utils.matter.parse(view, next);
});
};
/**
* Returns a function for resolving filepaths from the given `directory`
* or from the user's current working directory if no directory
* is passed.
*
* ```js
* var cwd = update.cwd('foo');
* var a = cwd('bar');
* var b = cwd('baz');
* ```
* @param {String} `dir`
* @return {Function}
*/
Update.prototype.cwd = function(dir) {
var cwd = dir || process.cwd();
return function() {
var args = [].slice.call(arguments);
args.unshift(cwd);
return path.resolve.apply(null, args);
};
};
/**
* Temporary logger method.
* TODO: add event logger
*/
Update.prototype.log = function() {
this.emit.bind(this, 'log').apply(this, arguments);
if (this.enabled('verbose')) {
console.log.apply(console, arguments);
}
};
/**
* Register updater `name` with the given `update`
* instance.
*
* @param {String} `name`
* @param {Object} `update` Instance of update
* @return {Object} Returns the instance for chaining
*/
Update.prototype.updater = function(name, app) {
if (arguments.length === 1 && typeof name === 'string') {
return this.updaters[name];
}
app.use(utils.runtimes({
displayName: function(key) {
return app.name === key ? key : (app.name + ':' + key);
}
}));
this.emit('updater', name, app);
this.updaters[name] = app;
return app;
};
/**
* Expose `Update`
*/
module.exports = Update;
/**
* Expose `utils` and package.json metadata
*/
module.exports.utils = utils;
module.exports.pkg = require('./package');