UNPKG

@zkochan/pnpm

Version:

A fast implementation of npm install

139 lines (93 loc) 2.45 kB
var EventEmitter = require('events').EventEmitter; var _ = require('lodash'); var flatten = require('flat-arguments'); var name = require('./name'); var flag = module.exports = function () { // TODO: test command decorators individually _.each(flag.decorators, function (decorator) { Flag.prototype[decorator.name] = decorator.handler; }); // Also ensure that the name is always an array // This gives us the ability to have multiple names/aliases return new Flag(arguments); }; flag.decorators = []; flag.prefix = function (flagName) { // i.e. --flag or --test if (flagName.slice(0, 2) === '--' && flagName.length > 2) { return flagName; } // i.e: -t or -f if (flagName.slice(0, 1) === '-' && flagName.length < 3) { return flagName; } return (flagName.length === 1) ? '-' + flagName : '--' + flagName; }; flag.unprefix = function (flagName) { // --flag if (flagName.slice(0, 2) === '--') { return flagName.slice(2); } // -f if (flagName.slice(0, 1) === '-') { return flagName.slice(1); } return flagName; }; function Flag () { this.internals = { name: name(arguments), ran: false, handler: function (val, done) { done(); } }; _.extend(this, EventEmitter.prototype); } Flag.prototype.run = function (data, done) { done = done || function () {}; var self = this; function runDone () { self.internals.ran = true; done(); } this.internals.handler(data, runDone); return this; }; Flag.prototype.runOnce = function () { if (!this.internals.ran) { this.run.apply(this, arguments); } else { // Already ran. Just finish. _(arguments).toArray().last()(); } return this; }; Flag.prototype.matchesName = function () { var names = _.map(flatten(arguments), flag.prefix); return this.internals.name.matches(names); }; Flag.prototype.handler = function (fn) { if (arguments.length === 0) { return this.internals.handler; } this.internals.handler = fn.bind(this); return this; }; Flag.prototype.shouldOverride = function () { return this.internals.override; }; Flag.prototype.override = function (val) { this.internals.override = (val !== false) ? true : false; // Is true if no value return this; }; Flag.prototype.name = function (val) { if (arguments.length === 0) { return this.internals.name.all(); } this.internals.name.add(val); return this; };