四好公路
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

65 lines
1.5 KiB

'use strict';
module.exports = function(name, description, defaultValue, init) {
let usage = [];
const assignShort = (name, options, short) => {
if (options.find(flagName => flagName.usage[0] === short)) {
short = name.charAt(0).toUpperCase();
}
return [short, name];
};
// If name is an array, pick the values
// Otherwise just use the whole thing
switch (name.constructor) {
case String:
usage = assignShort(name, this.details.options, name.charAt(0));
break;
case Array:
usage = usage.concat(name);
break;
default:
throw new Error('Invalid name for option');
}
// Throw error if short option is too long
if (usage.length > 0 && usage[0].length > 1) {
throw new Error('Short version of option is longer than 1 char');
}
const optionDetails = {
defaultValue,
usage,
description
};
let defaultIsWrong;
switch (defaultValue) {
case false:
defaultIsWrong = true;
break;
case null:
defaultIsWrong = true;
break;
case undefined:
defaultIsWrong = true;
break;
default:
defaultIsWrong = false;
}
if (typeof init === 'function') {
optionDetails.init = init;
} else if (!defaultIsWrong) {
// Set initializer depending on type of default value
optionDetails.init = this.handleType(defaultValue)[1];
}
// Register option to global scope
this.details.options.push(optionDetails);
// Allow chaining of .option()
return this;
};