preact-material-components
Version:
preact wrapper for "Material Components for the web"
66 lines (55 loc) • 1.52 kB
JavaScript
;
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;
};