fluxtuate
Version:
a javascript ES7 library for handling complex data transactions
71 lines (57 loc) • 2.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _lang = require("lodash/lang");
var _getOwnKeys = require("../../utils/getOwnKeys");
var _getOwnKeys2 = _interopRequireDefault(_getOwnKeys);
var _model = require("../model");
var _model2 = _interopRequireDefault(_model);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function convert(valueType, typeProperty, typeChecks, value, parentName, parentProperty) {
if (value === undefined) return undefined;
if (value.modelData) {
value = value.modelData;
}
if (!valueType) return value;
if (!(0, _lang.isObject)(value)) {
throw new Error("You must supply a value of object for property " + parentProperty + " in " + parentName + "!");
}
if ((0, _lang.isArray)(valueType)) {
if (!(0, _lang.isArray)(typeChecks) || typeChecks.length !== valueType.length) throw new Error("Type checks must be a array with the same length as value types if you are sending multiple value types for property " + parentProperty);
var v = value;
var propertyArray = typeProperty.split(".");
for (var i = 0; i < propertyArray.length; i++) {
if (!v[propertyArray[i]]) break;
v = v[propertyArray[i]];
}
valueType = valueType[typeChecks.indexOf(v)];
if (!valueType) throw new Error("No valid type found for property " + parentProperty);
}
if (valueType !== Object) {
var el = void 0;
//TODO: cycle trough inheritance tree to check for update function, will fail if there is a array of type
if ((0, _lang.isFunction)(valueType.prototype.update)) {
el = _model2.default.getInstance(valueType, parentName + "." + parentProperty);
el.update(value);
} else {
el = valueType(value, parentName, parentProperty);
if ((0, _lang.isObject)(value)) {
var keys = (0, _getOwnKeys2.default)(value);
keys.forEach(function (key) {
el[key] = value[key];
});
}
}
return el;
} else {
return value;
}
}
exports.default = function (valueClass, typeProperty, typeChecks) {
if (!(0, _lang.isArray)(valueClass) && typeChecks) {
return convert.apply(undefined, [undefined, undefined, undefined, valueClass, typeProperty, typeChecks]);
} else {
return convert.bind(undefined, valueClass, typeProperty, typeChecks);
}
};