gentelella/vendors/update/lib/runner/updater.js

128 lines
2.3 KiB
JavaScript

'use strict';
var path = require('path');
var set = require('set-value');
var define = require('define-property');
var use = require('use');
/**
* Create an instance of `Updater`, optionally passing
* a default object to initialize with.
*
* ```js
* var app = new Updater({
* path: 'foo.html'
* });
* ```
* @param {Object} `app`
* @api public
*/
function Updater(name, config, fn) {
if (!(this instanceof Updater)) {
return new Updater(config);
}
if (typeof config === 'function') {
fn = config;
config = {};
}
this.isUpdater = true;
define(this, 'cache', {});
config = config || {};
config.fn = fn;
for (var key in config) {
if (!(key in this)) {
this.set(key, config[key]);
}
}
use(this);
}
/**
* Set `key` on the instance with the given `value`.
*
* @param {String} `key`
* @param {Object} `value`
* @return {Object} Returns the instance for chaining
*/
Updater.prototype.set = function(key, value) {
set(this, key, value);
return this;
};
/**
* Custom `inspect` method.
*/
// Updater.prototype.inspect = function() {
// var name = this.name || 'Updater';
// var inspect = [];
// if (this.alias) {
// inspect.push('"' + this.alias + '"');
// }
// return '<' + name + ' ' + inspect.join(' ') + '>';
// };
/**
* Get the `cwd` (current working directory) for the updater.
*/
define(Updater.prototype, 'cwd', {
set: function(dir) {
this.cache.cwd = dir;
},
get: function() {
return this.cache.cwd || (this.cache.cwd = process.cwd());
}
});
/**
* Get the `dirname` for the updater.
*/
define(Updater.prototype, 'dirname', {
set: function(dir) {
this.path = path.join(dir, path.basename(this.path));
},
get: function() {
return path.dirname(this.path);
}
});
/**
* Get the `basename` for the updater.
*/
define(Updater.prototype, 'basename', {
set: function(basename) {
this.path = path.join(path.dirname(this.path), basename);
},
get: function() {
return path.basename(this.path);
}
});
/**
* Get the `filename` for the updater.
*/
define(Updater.prototype, 'filename', {
set: function(filename) {
this.path = path.join(path.dirname(this.path), filename + this.extname);
},
get: function() {
return path.basename(this.path, this.extname);
}
});
/**
* Expose `Updater`
*/
module.exports = Updater;