data-joint.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. // Version 1.2.4 data-joint - https://github.com/vasturiano/data-joint
  2. (function (global, factory) {
  3. typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  4. typeof define === 'function' && define.amd ? define(factory) :
  5. (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.dataJoint = factory());
  6. }(this, (function () { 'use strict';
  7. function ownKeys(object, enumerableOnly) {
  8. var keys = Object.keys(object);
  9. if (Object.getOwnPropertySymbols) {
  10. var symbols = Object.getOwnPropertySymbols(object);
  11. if (enumerableOnly) {
  12. symbols = symbols.filter(function (sym) {
  13. return Object.getOwnPropertyDescriptor(object, sym).enumerable;
  14. });
  15. }
  16. keys.push.apply(keys, symbols);
  17. }
  18. return keys;
  19. }
  20. function _objectSpread2(target) {
  21. for (var i = 1; i < arguments.length; i++) {
  22. var source = arguments[i] != null ? arguments[i] : {};
  23. if (i % 2) {
  24. ownKeys(Object(source), true).forEach(function (key) {
  25. _defineProperty(target, key, source[key]);
  26. });
  27. } else if (Object.getOwnPropertyDescriptors) {
  28. Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
  29. } else {
  30. ownKeys(Object(source)).forEach(function (key) {
  31. Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
  32. });
  33. }
  34. }
  35. return target;
  36. }
  37. function _defineProperty(obj, key, value) {
  38. if (key in obj) {
  39. Object.defineProperty(obj, key, {
  40. value: value,
  41. enumerable: true,
  42. configurable: true,
  43. writable: true
  44. });
  45. } else {
  46. obj[key] = value;
  47. }
  48. return obj;
  49. }
  50. function _objectWithoutPropertiesLoose$1(source, excluded) {
  51. if (source == null) return {};
  52. var target = {};
  53. var sourceKeys = Object.keys(source);
  54. var key, i;
  55. for (i = 0; i < sourceKeys.length; i++) {
  56. key = sourceKeys[i];
  57. if (excluded.indexOf(key) >= 0) continue;
  58. target[key] = source[key];
  59. }
  60. return target;
  61. }
  62. function _objectWithoutProperties$1(source, excluded) {
  63. if (source == null) return {};
  64. var target = _objectWithoutPropertiesLoose$1(source, excluded);
  65. var key, i;
  66. if (Object.getOwnPropertySymbols) {
  67. var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
  68. for (i = 0; i < sourceSymbolKeys.length; i++) {
  69. key = sourceSymbolKeys[i];
  70. if (excluded.indexOf(key) >= 0) continue;
  71. if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
  72. target[key] = source[key];
  73. }
  74. }
  75. return target;
  76. }
  77. function _slicedToArray$1(arr, i) {
  78. return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest$1();
  79. }
  80. function _toConsumableArray$1(arr) {
  81. return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread$1();
  82. }
  83. function _arrayWithoutHoles$1(arr) {
  84. if (Array.isArray(arr)) return _arrayLikeToArray$1(arr);
  85. }
  86. function _arrayWithHoles$1(arr) {
  87. if (Array.isArray(arr)) return arr;
  88. }
  89. function _iterableToArray$1(iter) {
  90. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  91. }
  92. function _iterableToArrayLimit$1(arr, i) {
  93. var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
  94. if (_i == null) return;
  95. var _arr = [];
  96. var _n = true;
  97. var _d = false;
  98. var _s, _e;
  99. try {
  100. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  101. _arr.push(_s.value);
  102. if (i && _arr.length === i) break;
  103. }
  104. } catch (err) {
  105. _d = true;
  106. _e = err;
  107. } finally {
  108. try {
  109. if (!_n && _i["return"] != null) _i["return"]();
  110. } finally {
  111. if (_d) throw _e;
  112. }
  113. }
  114. return _arr;
  115. }
  116. function _unsupportedIterableToArray$1(o, minLen) {
  117. if (!o) return;
  118. if (typeof o === "string") return _arrayLikeToArray$1(o, minLen);
  119. var n = Object.prototype.toString.call(o).slice(8, -1);
  120. if (n === "Object" && o.constructor) n = o.constructor.name;
  121. if (n === "Map" || n === "Set") return Array.from(o);
  122. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen);
  123. }
  124. function _arrayLikeToArray$1(arr, len) {
  125. if (len == null || len > arr.length) len = arr.length;
  126. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  127. return arr2;
  128. }
  129. function _nonIterableSpread$1() {
  130. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  131. }
  132. function _nonIterableRest$1() {
  133. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  134. }
  135. function _objectWithoutPropertiesLoose(source, excluded) {
  136. if (source == null) return {};
  137. var target = {};
  138. var sourceKeys = Object.keys(source);
  139. var key, i;
  140. for (i = 0; i < sourceKeys.length; i++) {
  141. key = sourceKeys[i];
  142. if (excluded.indexOf(key) >= 0) continue;
  143. target[key] = source[key];
  144. }
  145. return target;
  146. }
  147. function _objectWithoutProperties(source, excluded) {
  148. if (source == null) return {};
  149. var target = _objectWithoutPropertiesLoose(source, excluded);
  150. var key, i;
  151. if (Object.getOwnPropertySymbols) {
  152. var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
  153. for (i = 0; i < sourceSymbolKeys.length; i++) {
  154. key = sourceSymbolKeys[i];
  155. if (excluded.indexOf(key) >= 0) continue;
  156. if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
  157. target[key] = source[key];
  158. }
  159. }
  160. return target;
  161. }
  162. function _slicedToArray(arr, i) {
  163. return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
  164. }
  165. function _toConsumableArray(arr) {
  166. return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
  167. }
  168. function _arrayWithoutHoles(arr) {
  169. if (Array.isArray(arr)) return _arrayLikeToArray(arr);
  170. }
  171. function _arrayWithHoles(arr) {
  172. if (Array.isArray(arr)) return arr;
  173. }
  174. function _iterableToArray(iter) {
  175. if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
  176. }
  177. function _iterableToArrayLimit(arr, i) {
  178. var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]);
  179. if (_i == null) return;
  180. var _arr = [];
  181. var _n = true;
  182. var _d = false;
  183. var _s, _e;
  184. try {
  185. for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
  186. _arr.push(_s.value);
  187. if (i && _arr.length === i) break;
  188. }
  189. } catch (err) {
  190. _d = true;
  191. _e = err;
  192. } finally {
  193. try {
  194. if (!_n && _i["return"] != null) _i["return"]();
  195. } finally {
  196. if (_d) throw _e;
  197. }
  198. }
  199. return _arr;
  200. }
  201. function _unsupportedIterableToArray(o, minLen) {
  202. if (!o) return;
  203. if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  204. var n = Object.prototype.toString.call(o).slice(8, -1);
  205. if (n === "Object" && o.constructor) n = o.constructor.name;
  206. if (n === "Map" || n === "Set") return Array.from(o);
  207. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  208. }
  209. function _arrayLikeToArray(arr, len) {
  210. if (len == null || len > arr.length) len = arr.length;
  211. for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
  212. return arr2;
  213. }
  214. function _nonIterableSpread() {
  215. throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  216. }
  217. function _nonIterableRest() {
  218. throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  219. }
  220. function _toPrimitive(input, hint) {
  221. if (typeof input !== "object" || input === null) return input;
  222. var prim = input[Symbol.toPrimitive];
  223. if (prim !== undefined) {
  224. var res = prim.call(input, hint || "default");
  225. if (typeof res !== "object") return res;
  226. throw new TypeError("@@toPrimitive must return a primitive value.");
  227. }
  228. return (hint === "string" ? String : Number)(input);
  229. }
  230. function _toPropertyKey(arg) {
  231. var key = _toPrimitive(arg, "string");
  232. return typeof key === "symbol" ? key : String(key);
  233. }
  234. var index = (function () {
  235. var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  236. var keyAccessors = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  237. var multiItem = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  238. var flattenKeys = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  239. var keys = (keyAccessors instanceof Array ? keyAccessors.length ? keyAccessors : [undefined] : [keyAccessors]).map(function (key) {
  240. return {
  241. keyAccessor: key,
  242. isProp: !(key instanceof Function)
  243. };
  244. });
  245. var indexedResult = list.reduce(function (res, item) {
  246. var iterObj = res;
  247. var itemVal = item;
  248. keys.forEach(function (_ref, idx) {
  249. var keyAccessor = _ref.keyAccessor,
  250. isProp = _ref.isProp;
  251. var key;
  252. if (isProp) {
  253. var _itemVal = itemVal,
  254. propVal = _itemVal[keyAccessor],
  255. rest = _objectWithoutProperties(_itemVal, [keyAccessor].map(_toPropertyKey));
  256. key = propVal;
  257. itemVal = rest;
  258. } else {
  259. key = keyAccessor(itemVal, idx);
  260. }
  261. if (idx + 1 < keys.length) {
  262. if (!iterObj.hasOwnProperty(key)) {
  263. iterObj[key] = {};
  264. }
  265. iterObj = iterObj[key];
  266. } else {
  267. // Leaf key
  268. if (multiItem) {
  269. if (!iterObj.hasOwnProperty(key)) {
  270. iterObj[key] = [];
  271. }
  272. iterObj[key].push(itemVal);
  273. } else {
  274. iterObj[key] = itemVal;
  275. }
  276. }
  277. });
  278. return res;
  279. }, {});
  280. if (multiItem instanceof Function) {
  281. // Reduce leaf multiple values
  282. (function reduce(node) {
  283. var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  284. if (level === keys.length) {
  285. Object.keys(node).forEach(function (k) {
  286. return node[k] = multiItem(node[k]);
  287. });
  288. } else {
  289. Object.values(node).forEach(function (child) {
  290. return reduce(child, level + 1);
  291. });
  292. }
  293. })(indexedResult); // IIFE
  294. }
  295. var result = indexedResult;
  296. if (flattenKeys) {
  297. // flatten into array
  298. result = [];
  299. (function flatten(node) {
  300. var accKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  301. if (accKeys.length === keys.length) {
  302. result.push({
  303. keys: accKeys,
  304. vals: node
  305. });
  306. } else {
  307. Object.entries(node).forEach(function (_ref2) {
  308. var _ref3 = _slicedToArray(_ref2, 2),
  309. key = _ref3[0],
  310. val = _ref3[1];
  311. return flatten(val, [].concat(_toConsumableArray(accKeys), [key]));
  312. });
  313. }
  314. })(indexedResult); //IIFE
  315. if (keyAccessors instanceof Array && keyAccessors.length === 0 && result.length === 1) {
  316. // clear keys if there's no key accessors (single result)
  317. result[0].keys = [];
  318. }
  319. }
  320. return result;
  321. });
  322. function diffArrays(prev, next, idAccessor) {
  323. var result = {
  324. enter: [],
  325. update: [],
  326. exit: []
  327. };
  328. if (!idAccessor) {
  329. // use object references for comparison
  330. var prevSet = new Set(prev);
  331. var nextSet = new Set(next);
  332. new Set([].concat(_toConsumableArray$1(prevSet), _toConsumableArray$1(nextSet))).forEach(function (item) {
  333. var type = !prevSet.has(item) ? 'enter' : !nextSet.has(item) ? 'exit' : 'update';
  334. result[type].push(type === 'update' ? [item, item] : item);
  335. });
  336. } else {
  337. // compare by id (duplicate keys are ignored)
  338. var prevById = index(prev, idAccessor, false);
  339. var nextById = index(next, idAccessor, false);
  340. var byId = Object.assign({}, prevById, nextById);
  341. Object.entries(byId).forEach(function (_ref) {
  342. var _ref2 = _slicedToArray$1(_ref, 2),
  343. id = _ref2[0],
  344. item = _ref2[1];
  345. var type = !prevById.hasOwnProperty(id) ? 'enter' : !nextById.hasOwnProperty(id) ? 'exit' : 'update';
  346. result[type].push(type === 'update' ? [prevById[id], nextById[id]] : item);
  347. });
  348. }
  349. return result;
  350. }
  351. function dataBindDiff(data, existingObjs, _ref3) {
  352. var _ref3$objBindAttr = _ref3.objBindAttr,
  353. objBindAttr = _ref3$objBindAttr === void 0 ? '__obj' : _ref3$objBindAttr,
  354. _ref3$dataBindAttr = _ref3.dataBindAttr,
  355. dataBindAttr = _ref3$dataBindAttr === void 0 ? '__data' : _ref3$dataBindAttr,
  356. idAccessor = _ref3.idAccessor,
  357. _ref3$purge = _ref3.purge,
  358. purge = _ref3$purge === void 0 ? false : _ref3$purge;
  359. var isObjValid = function isObjValid(obj) {
  360. return obj.hasOwnProperty(dataBindAttr);
  361. };
  362. var removeObjs = existingObjs.filter(function (obj) {
  363. return !isObjValid(obj);
  364. });
  365. var prevD = existingObjs.filter(isObjValid).map(function (obj) {
  366. return obj[dataBindAttr];
  367. });
  368. var nextD = data;
  369. var diff = purge ? {
  370. enter: nextD,
  371. exit: prevD,
  372. update: []
  373. } // don't diff data in purge mode
  374. : diffArrays(prevD, nextD, idAccessor);
  375. diff.update = diff.update.map(function (_ref4) {
  376. var _ref5 = _slicedToArray$1(_ref4, 2),
  377. prevD = _ref5[0],
  378. nextD = _ref5[1];
  379. if (prevD !== nextD) {
  380. // transfer obj to new data point (if different)
  381. nextD[objBindAttr] = prevD[objBindAttr];
  382. nextD[objBindAttr][dataBindAttr] = nextD;
  383. }
  384. return nextD;
  385. });
  386. diff.exit = diff.exit.concat(removeObjs.map(function (obj) {
  387. return _defineProperty({}, objBindAttr, obj);
  388. }));
  389. return diff;
  390. }
  391. function viewDigest(data, existingObjs, // list
  392. appendObj, // item => {...} function
  393. removeObj, // item => {...} function
  394. _ref7) {
  395. var _ref7$createObj = _ref7.createObj,
  396. createObj = _ref7$createObj === void 0 ? function (d) {
  397. return {};
  398. } : _ref7$createObj,
  399. _ref7$updateObj = _ref7.updateObj,
  400. updateObj = _ref7$updateObj === void 0 ? function (obj, d) {} : _ref7$updateObj,
  401. _ref7$exitObj = _ref7.exitObj,
  402. exitObj = _ref7$exitObj === void 0 ? function (obj) {} : _ref7$exitObj,
  403. _ref7$objBindAttr = _ref7.objBindAttr,
  404. objBindAttr = _ref7$objBindAttr === void 0 ? '__obj' : _ref7$objBindAttr,
  405. _ref7$dataBindAttr = _ref7.dataBindAttr,
  406. dataBindAttr = _ref7$dataBindAttr === void 0 ? '__data' : _ref7$dataBindAttr,
  407. dataDiffOptions = _objectWithoutProperties$1(_ref7, ["createObj", "updateObj", "exitObj", "objBindAttr", "dataBindAttr"]);
  408. var _dataBindDiff = dataBindDiff(data, existingObjs, _objectSpread2({
  409. objBindAttr: objBindAttr,
  410. dataBindAttr: dataBindAttr
  411. }, dataDiffOptions)),
  412. enter = _dataBindDiff.enter,
  413. update = _dataBindDiff.update,
  414. exit = _dataBindDiff.exit; // Remove exiting points
  415. exit.forEach(function (d) {
  416. var obj = d[objBindAttr];
  417. delete d[objBindAttr]; // unbind obj
  418. exitObj(obj);
  419. removeObj(obj);
  420. });
  421. var newObjs = createObjs(enter);
  422. var pointsData = [].concat(_toConsumableArray$1(enter), _toConsumableArray$1(update));
  423. updateObjs(pointsData); // Add new points
  424. newObjs.forEach(appendObj); //
  425. function createObjs(data) {
  426. var newObjs = [];
  427. data.forEach(function (d) {
  428. var obj = createObj(d);
  429. if (obj) {
  430. obj[dataBindAttr] = d;
  431. d[objBindAttr] = obj;
  432. newObjs.push(obj);
  433. }
  434. });
  435. return newObjs;
  436. }
  437. function updateObjs(data) {
  438. data.forEach(function (d) {
  439. var obj = d[objBindAttr];
  440. if (obj) {
  441. obj[dataBindAttr] = d;
  442. updateObj(obj, d);
  443. }
  444. });
  445. }
  446. }
  447. return viewDigest;
  448. })));
  449. //# sourceMappingURL=data-joint.js.map