Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

121 řádky
3.3 KiB

  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.STATUS_REMOVED = exports.STATUS_REMOVE = exports.STATUS_KEEP = exports.STATUS_ADD = undefined;
  6. var _extends2 = require('babel-runtime/helpers/extends');
  7. var _extends3 = _interopRequireDefault(_extends2);
  8. exports.wrapKeyToObject = wrapKeyToObject;
  9. exports.parseKeys = parseKeys;
  10. exports.diffKeys = diffKeys;
  11. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  12. var STATUS_ADD = exports.STATUS_ADD = 'add';
  13. var STATUS_KEEP = exports.STATUS_KEEP = 'keep';
  14. var STATUS_REMOVE = exports.STATUS_REMOVE = 'remove';
  15. var STATUS_REMOVED = exports.STATUS_REMOVED = 'removed';
  16. function wrapKeyToObject(key) {
  17. var keyObj = void 0;
  18. if (key && typeof key === 'object' && 'key' in key) {
  19. keyObj = key;
  20. } else {
  21. keyObj = { key: key };
  22. }
  23. return (0, _extends3['default'])({}, keyObj, {
  24. key: String(keyObj.key)
  25. });
  26. }
  27. function parseKeys() {
  28. var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  29. return keys.map(wrapKeyToObject);
  30. }
  31. function diffKeys() {
  32. var prevKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  33. var currentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  34. var list = [];
  35. var currentIndex = 0;
  36. var currentLen = currentKeys.length;
  37. var prevKeyObjects = parseKeys(prevKeys);
  38. var currentKeyObjects = parseKeys(currentKeys);
  39. // Check prev keys to insert or keep
  40. prevKeyObjects.forEach(function (keyObj) {
  41. var hit = false;
  42. for (var i = currentIndex; i < currentLen; i += 1) {
  43. var currentKeyObj = currentKeyObjects[i];
  44. if (currentKeyObj.key === keyObj.key) {
  45. // New added keys should add before current key
  46. if (currentIndex < i) {
  47. list = list.concat(currentKeyObjects.slice(currentIndex, i).map(function (obj) {
  48. return (0, _extends3['default'])({}, obj, { status: STATUS_ADD });
  49. }));
  50. currentIndex = i;
  51. }
  52. list.push((0, _extends3['default'])({}, currentKeyObj, {
  53. status: STATUS_KEEP
  54. }));
  55. currentIndex += 1;
  56. hit = true;
  57. break;
  58. }
  59. }
  60. // If not hit, it means key is removed
  61. if (!hit) {
  62. list.push((0, _extends3['default'])({}, keyObj, {
  63. status: STATUS_REMOVE
  64. }));
  65. }
  66. });
  67. // Add rest to the list
  68. if (currentIndex < currentLen) {
  69. list = list.concat(currentKeyObjects.slice(currentIndex).map(function (obj) {
  70. return (0, _extends3['default'])({}, obj, { status: STATUS_ADD });
  71. }));
  72. }
  73. /**
  74. * Merge same key when it remove and add again:
  75. * [1 - add, 2 - keep, 1 - remove] -> [1 - keep, 2 - keep]
  76. */
  77. var keys = {};
  78. list.forEach(function (_ref) {
  79. var key = _ref.key;
  80. keys[key] = (keys[key] || 0) + 1;
  81. });
  82. var duplicatedKeys = Object.keys(keys).filter(function (key) {
  83. return keys[key] > 1;
  84. });
  85. duplicatedKeys.forEach(function (matchKey) {
  86. // Remove `STATUS_REMOVE` node.
  87. list = list.filter(function (_ref2) {
  88. var key = _ref2.key,
  89. status = _ref2.status;
  90. return key !== matchKey || status !== STATUS_REMOVE;
  91. });
  92. // Update `STATUS_ADD` to `STATUS_KEEP`
  93. list.forEach(function (node) {
  94. if (node.key === matchKey) {
  95. node.status = STATUS_KEEP;
  96. }
  97. });
  98. });
  99. return list;
  100. }