rttc
Version:
Runtime type-checking for JavaScript.
68 lines (60 loc) • 2.01 kB
JavaScript
/**
* Module dependencies
*/
var _ = require('@sailshq/lodash');
var TYPES = require('./helpers/types');
/**
* Given a value, return an INFORMAL type string loosely
* representing its data type.
*
* WARNING: THIS FUNCTION IS NOT ALL THAT IT SEEMS.
* It does not return an RDT ("RTTC display type")-- it returns a display string
* that might include other values as well, such as `'undefined'`, `'null',
* `'Date'`, etc.
*
* > ------------------------------------------------------------------------
* > NOTE:
* > THIS FUNCTION IS DEPRECATED AND WILL BE REMOVED IN FAVOR OF MORE
* > SPECIFIC UTILITY METHODS IN AN UPCOMING RELEASE OF RTTC.
* > ------------------------------------------------------------------------
*
* TODO: Remove this
*
* @param {===} val
* @return {String}
*/
module.exports = function getDisplayType(val){
// `undefined` should take precedence over special exemplar syntax
// (i.e. '===')
if (_.isUndefined(val)) return 'undefined';
if (TYPES.json.isExemplar(val)) return 'json';
if (TYPES.lamda.isExemplar(val)) return 'lamda';
if (TYPES.ref.isExemplar(val)) return 'ref';
if (_.isEqual(val, Infinity) || _.isEqual(val, -Infinity) || _.isNaN(val)) {
return 'invalid number';
}
if (_.isString(val)) return 'string';
if (_.isNumber(val)) return 'number';
if (_.isBoolean(val)) return 'boolean';
if (_.isNull(val)) return 'null';
if (_.isArray(val)) return 'array';
if (_.isFunction(val)) return 'function';
if (_.isDate(val)) return 'Date';
if (_.isError(val)) return 'Error';
if (_.isRegExp(val)) return 'RegExp';
// If it's an object
if (_.isObject(val)) {
var displayType = typeof val;
try {
displayType = val.constructor.name;
if (displayType.match(/object/i) && _.isPlainObject(val)) {
return 'dictionary';
}
// Use the constructor name if it's anything other than "Object"
return displayType;
}
catch (e){}
}
// ok.. wtf is it?
return 'unknown';
};