clean
Version:
clean parses and sanitize argv for node, supporting fully extendable types, shorthands, validatiors and setters.
148 lines (117 loc) • 2.75 kB
JavaScript
;
var types = exports;
var node_path = require('path');
var node_url = require('url');
types.get = get_type;
function get_type (type, types) {
if (typeof type === 'string') {
type = type.toLowerCase();
var rule = types && types[type] || TYPES[type];
// type.get('string')
if (rule) {
return rule;
}
}
var key;
var def;
// type.get(String)
for (key in TYPES) {
def = TYPES[key];
if (type === def.type) {
return def;
}
}
return;
};
var TYPES = types.TYPES = {
string: {
type: String,
set: function(value, is_default) {
if (is_default) {
return value || '';
}
return String(value);
}
},
number: {
type: Number,
validate: function(value, is_default) {
var done = this.async();
if (is_default && value === undefined) {
return done(null, 0);
}
if (isNaN(value)) {
return done(new TypeError('Must be a number.'));
}
done(null, 0);
},
set: function(value) {
return Number(value);
}
},
boolean: {
type: Boolean,
set: function(value, is_default) {
if (typeof value === 'boolean') {
return value;
}
if (is_default && value === undefined) {
return false;
}
if (value === 'null' || value === 'false') {
return false;
}
if (!isNaN(value)) {
return !!(+ value);
}
return true;
}
},
date: {
type: Date,
set: function(value, is_default) {
if (is_default && value === undefined) {
return;
}
// already is
if (value instanceof Date) {
return value;
}
var done = this.async();
var date = Date.parse(value);
if (isNaN(date)) {
done(new TypeError('"' + value + '" is not a valid date.'));
} else {
done(null, new Date(value));
}
}
},
url: {
type: node_url,
set: function(value, is_default) {
var done = this.async();
// There might be other filters ahead of `types.url.set`
if (is_default && value === undefined) {
return done(null);
}
// if the parameter is not string, an error occurs
var url = node_url.parse(String(value));
if (!url.host) {
done(new TypeError('"' + value + '" is not a valid url.'));
} else {
done(null, url.href);
}
}
},
path: {
type: node_path,
set: function(value, is_default) {
// we should not convert `undefined` to some path like `/Users/xxx/undefined`
if (is_default && value === undefined) {
return;
} else {
return node_path.resolve(String(value));
}
}
}
};