can
Version:
MIT-licensed, client-side, JavaScript framework that makes building rich web applications easy.
111 lines (110 loc) • 3.66 kB
JavaScript
/*!
* CanJS - 2.3.34
* http://canjs.com/
* Copyright (c) 2018 Bitovi
* Mon, 30 Apr 2018 20:56:51 GMT
* Licensed MIT
*/
/*can@2.3.34#map/map_helpers*/
define([
'can/util/library',
'can/util/object/isplain'
], function (can) {
var mapHelpers = {
attrParts: function (attr, keepKey) {
if (keepKey) {
return [attr];
}
return typeof attr === 'object' ? attr : ('' + attr).split('.');
},
canMakeObserve: function (obj) {
return obj && !can.isPromise(obj) && (can.isArray(obj) || can.isPlainObject(obj));
},
serialize: function () {
var serializeMap = null;
return function (map, how, where) {
var cid = can.cid(map), firstSerialize = false;
if (!serializeMap) {
firstSerialize = true;
serializeMap = {
attr: {},
serialize: {}
};
}
serializeMap[how][cid] = where;
map.each(function (val, name) {
var result, isObservable = can.isMapLike(val), serialized = isObservable && serializeMap[how][can.cid(val)];
if (serialized) {
result = serialized;
} else {
if (map['___' + how]) {
result = map['___' + how](name, val);
} else {
result = mapHelpers.getValue(map, name, val, how);
}
}
if (result !== undefined) {
where[name] = result;
}
});
if (firstSerialize) {
serializeMap = null;
}
return where;
};
}(),
getValue: function (map, name, val, how) {
if (can.isMapLike(val)) {
return val[how]();
} else {
return val;
}
},
define: null,
addComputedAttr: function (map, attrName, compute) {
map._computedAttrs[attrName] = {
compute: compute,
count: 0,
handler: function (ev, newVal, oldVal) {
map._triggerChange(attrName, 'set', newVal, oldVal, ev.batchNum);
}
};
},
addToMap: function addToMap(obj, instance) {
var teardown;
if (!madeMap) {
teardown = teardownMap;
madeMap = {};
}
var hasCid = obj._cid;
var cid = can.cid(obj);
if (!madeMap[cid]) {
madeMap[cid] = {
obj: obj,
instance: instance,
added: !hasCid
};
}
return teardown;
},
getMapFromObject: function (obj) {
return madeMap && madeMap[obj._cid] && madeMap[obj._cid].instance;
},
twoLevelDeepExtend: function (destination, source) {
for (var prop in source) {
destination[prop] = destination[prop] || {};
can.simpleExtend(destination[prop], source[prop]);
}
}
};
var madeMap = null;
var teardownMap = function () {
for (var cid in madeMap) {
if (madeMap[cid].added) {
delete madeMap[cid].obj._cid;
}
}
madeMap = null;
};
return mapHelpers;
});