@textbus/collaborate 5.3.1 → 5.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -735,11 +735,10 @@ exports.Collaborate = /*#__PURE__*/ function() {
735
735
  key: "createSharedArrayByLocalArray",
736
736
  value: function createSharedArrayByLocalArray(localArray) {
737
737
  var sharedArray = new yjs.Array();
738
- var raw = core.toRaw(localArray);
739
- for(var i = 0; i < raw.length; i++){
740
- if (i in raw) {
738
+ for(var i = 0; i < localArray.length; i++){
739
+ if (i in localArray) {
741
740
  sharedArray.push([
742
- this.sharedModelForArraySlot(raw[i])
741
+ this.sharedModelForArraySlot(localArray[i])
743
742
  ]);
744
743
  } else {
745
744
  sharedArray.push([
@@ -1074,9 +1073,60 @@ exports.Collaborate = /*#__PURE__*/ function() {
1074
1073
  key: "insertSparseHole",
1075
1074
  value: /**
1076
1075
  * 在可观察数组中插入稀疏空洞(与 YArray 中 XmlElement 占位对齐)。
1077
- * 仅在远端同步路径调用;直接操作 raw,避免走插入 undefined 的可观察路径。
1076
+ * 仅在远端同步路径调用;先改 raw,再用与 {@link ArrayProxyHandler} `length` 增长一致的原子命令
1077
+ * `retain` + `insert`(`undefined` 槽)记录,`unApply` 为 `retain` + `delete`。
1078
+ * `runLocalUpdate` 在 `updateFromRemote` 为 true 时会跳过,不会把洞再写回 Y。
1078
1079
  */ function insertSparseHole(localArray, atIndex) {
1079
1080
  var raw = core.toRaw(localArray);
1081
+ var oldLen = raw.length;
1082
+ this.applySparseHoleToRaw(raw, atIndex);
1083
+ var holeCount = atIndex >= oldLen ? atIndex + 1 - oldLen : 1;
1084
+ var newTail = [];
1085
+ if (atIndex >= oldLen) {
1086
+ for(var i = oldLen; i < oldLen + holeCount; i++){
1087
+ newTail.push(raw[i]);
1088
+ }
1089
+ } else {
1090
+ newTail.push(undefined);
1091
+ }
1092
+ var changeMarker = localArray.__changeMarker__;
1093
+ changeMarker.beforeChange();
1094
+ var parentModel = core.getObserver(raw);
1095
+ var subModels = newTail.map(function(item) {
1096
+ var m = core.observe(item);
1097
+ core.attachModel(parentModel, m);
1098
+ return m;
1099
+ });
1100
+ var retainOffset = atIndex >= oldLen ? oldLen : atIndex;
1101
+ changeMarker.markAsDirtied({
1102
+ paths: [],
1103
+ apply: [
1104
+ {
1105
+ type: 'retain',
1106
+ offset: retainOffset
1107
+ },
1108
+ {
1109
+ type: 'insert',
1110
+ data: core.valueToJSON(newTail),
1111
+ ref: subModels
1112
+ }
1113
+ ],
1114
+ unApply: [
1115
+ {
1116
+ type: 'retain',
1117
+ offset: retainOffset
1118
+ },
1119
+ {
1120
+ type: 'delete',
1121
+ count: holeCount
1122
+ }
1123
+ ]
1124
+ });
1125
+ }
1126
+ },
1127
+ {
1128
+ key: "applySparseHoleToRaw",
1129
+ value: /** 与 Y 洞位对齐的稀疏洞写入,仅操作 raw */ function applySparseHoleToRaw(raw, atIndex) {
1080
1130
  var len = raw.length;
1081
1131
  if (atIndex >= len) {
1082
1132
  raw.length = atIndex + 1;