File size: 3,843 Bytes
a75217d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 | /*
* EJS Embedded JavaScript templates
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
'use strict';
let parseargs = {};
let isOpt = function (arg) { return arg.indexOf('-') === 0; };
let removeOptPrefix = function (opt) { return opt.replace(/^--/, '').replace(/^-/, ''); };
/**
* @constructor
* Parses a list of command-line args into a key/value object of
* options and an array of positional commands.
* @param {Array} opts A list of options in the following format:
* [{full: 'foo', abbr: 'f'}, {full: 'bar', abbr: 'b'}]]
*/
parseargs.Parser = function (opts) {
// A key/value object of matching options parsed out of the args
this.opts = {};
this.taskNames = null;
this.envVars = null;
// Data structures used for parsing
this.reg = opts;
this.shortOpts = {};
this.longOpts = {};
let self = this;
[].forEach.call(opts, function (item) {
self.shortOpts[item.abbr] = item;
self.longOpts[item.full] = item;
});
};
parseargs.Parser.prototype = new function () {
let _trueOrNextVal = function (argParts, args) {
if (argParts[1]) {
return argParts[1];
}
else {
return (!args[0] || isOpt(args[0])) ?
true : args.shift();
}
};
/**
* Parses an array of arguments into options and positional commands
* @param {Array} args The command-line args to parse
*/
this.parse = function (args) {
let cmds = [];
let cmd;
let envVars = {};
let opts = {};
let arg;
let argItem;
let argParts;
let cmdItems;
let taskNames = [];
let preempt;
while (args.length) {
arg = args.shift();
if (isOpt(arg)) {
arg = removeOptPrefix(arg);
argParts = arg.split('=');
argItem = this.longOpts[argParts[0]] || this.shortOpts[argParts[0]];
if (argItem) {
// First-encountered preemptive opt takes precedence -- no further opts
// or possibility of ambiguity, so just look for a value, or set to
// true and then bail
if (argItem.preempts) {
opts[argItem.full] = _trueOrNextVal(argParts, args);
preempt = true;
break;
}
// If the opt requires a value, see if we can get a value from the
// next arg, or infer true from no-arg -- if it's followed by another
// opt, throw an error
if (argItem.expectValue || argItem.allowValue) {
opts[argItem.full] = _trueOrNextVal(argParts, args);
if (argItem.expectValue && !opts[argItem.full]) {
throw new Error(argItem.full + ' option expects a value.');
}
}
else {
opts[argItem.full] = true;
}
}
}
else {
cmds.unshift(arg);
}
}
if (!preempt) {
// Parse out any env-vars and task-name
while ((cmd = cmds.pop())) {
cmdItems = cmd.split('=');
if (cmdItems.length > 1) {
envVars[cmdItems[0]] = cmdItems[1];
}
else {
taskNames.push(cmd);
}
}
}
return {
opts: opts,
envVars: envVars,
taskNames: taskNames
};
};
};
if (typeof exports != 'undefined') {
module.exports = parseargs;
}
export default parseargs;
|