loopback-datasource-juggler/lib/introspection.js

63 lines
1.3 KiB
JavaScript
Raw Normal View History

2013-08-07 21:51:32 +00:00
module.exports = function getIntrospector(ModelBuilder) {
2014-01-24 17:09:53 +00:00
function introspectType(value) {
2014-01-24 17:09:53 +00:00
// Unknown type, using Any
if (value === null || value === undefined) {
return ModelBuilder.Any;
}
2014-01-24 17:09:53 +00:00
// Check registered schemaTypes
for (var t in ModelBuilder.schemaTypes) {
var st = ModelBuilder.schemaTypes[t];
if (st !== Object && st !== Array && (value instanceof st)) {
return t;
}
}
2014-01-24 17:09:53 +00:00
var type = typeof value;
if (type === 'string' || type === 'number' || type === 'boolean') {
return type;
}
2014-01-24 17:09:53 +00:00
if (value instanceof Date) {
return 'date';
}
var itemType;
2014-01-24 17:09:53 +00:00
if (Array.isArray(value)) {
for (var i = 0; i < value.length; i++) {
if (value[i] === null || value[i] === undefined) {
continue;
}
itemType = introspectType(value[i]);
2014-01-24 17:09:53 +00:00
if (itemType) {
return [itemType];
2013-08-07 21:51:32 +00:00
}
2014-01-24 17:09:53 +00:00
}
return 'array';
}
2014-01-24 17:09:53 +00:00
if (type === 'function') {
return value.constructor.name;
}
var properties = {};
for (var p in value) {
itemType = introspectType(value[p]);
2014-01-24 17:09:53 +00:00
if (itemType) {
properties[p] = itemType;
}
}
if (Object.keys(properties).length === 0) {
return 'object';
}
2014-01-24 17:09:53 +00:00
return properties;
}
ModelBuilder.introspect = introspectType;
2014-01-24 17:09:53 +00:00
return introspectType;
2013-08-07 21:51:32 +00:00
}