@fluidframework/sequence 2.0.0-dev.5.2.0.169897 → 2.0.0-dev.5.3.2.178189

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +4 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/intervalCollection.d.ts +9 -19
  7. package/dist/intervalCollection.d.ts.map +1 -1
  8. package/dist/intervalCollection.js +26 -105
  9. package/dist/intervalCollection.js.map +1 -1
  10. package/dist/intervalIndex/index.d.ts +8 -0
  11. package/dist/intervalIndex/index.d.ts.map +1 -0
  12. package/dist/intervalIndex/index.js +12 -0
  13. package/dist/intervalIndex/index.js.map +1 -0
  14. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  15. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  16. package/dist/intervalIndex/overlappingIntervalsIndex.js +103 -0
  17. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  18. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  19. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  20. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +33 -0
  21. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  22. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  23. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  24. package/dist/intervalIndex/sequenceIntervalIndexes.js +7 -0
  25. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  26. package/dist/packageVersion.d.ts +1 -1
  27. package/dist/packageVersion.js +1 -1
  28. package/dist/packageVersion.js.map +1 -1
  29. package/dist/revertibles.d.ts.map +1 -1
  30. package/dist/revertibles.js +47 -7
  31. package/dist/revertibles.js.map +1 -1
  32. package/lib/index.d.ts +1 -0
  33. package/lib/index.d.ts.map +1 -1
  34. package/lib/index.js +1 -0
  35. package/lib/index.js.map +1 -1
  36. package/lib/intervalCollection.d.ts +9 -19
  37. package/lib/intervalCollection.d.ts.map +1 -1
  38. package/lib/intervalCollection.js +26 -106
  39. package/lib/intervalCollection.js.map +1 -1
  40. package/lib/intervalIndex/index.d.ts +8 -0
  41. package/lib/intervalIndex/index.d.ts.map +1 -0
  42. package/lib/intervalIndex/index.js +7 -0
  43. package/lib/intervalIndex/index.js.map +1 -0
  44. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +32 -0
  45. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  46. package/lib/intervalIndex/overlappingIntervalsIndex.js +98 -0
  47. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  48. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +8 -0
  49. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  50. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +29 -0
  51. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  52. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +33 -0
  53. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  54. package/lib/intervalIndex/sequenceIntervalIndexes.js +6 -0
  55. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  56. package/lib/packageVersion.d.ts +1 -1
  57. package/lib/packageVersion.js +1 -1
  58. package/lib/packageVersion.js.map +1 -1
  59. package/lib/revertibles.d.ts.map +1 -1
  60. package/lib/revertibles.js +48 -8
  61. package/lib/revertibles.js.map +1 -1
  62. package/package.json +18 -18
  63. package/src/index.ts +6 -0
  64. package/src/intervalCollection.ts +41 -143
  65. package/src/intervalIndex/index.ts +11 -0
  66. package/src/intervalIndex/overlappingIntervalsIndex.ts +166 -0
  67. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +71 -0
  68. package/src/intervalIndex/sequenceIntervalIndexes.ts +32 -0
  69. package/src/packageVersion.ts +1 -1
  70. package/src/revertibles.ts +61 -7
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.0.0-dev.5.2.0.169897";
9
+ export const pkgVersion = "2.0.0-dev.5.3.2.178189";
@@ -18,6 +18,7 @@ import {
18
18
  refTypeIncludesFlag,
19
19
  revertMergeTreeDeltaRevertibles,
20
20
  SortedSet,
21
+ getSlideToSegoff,
21
22
  } from "@fluidframework/merge-tree";
22
23
  import { IntervalOpType, SequenceInterval } from "./intervalCollection";
23
24
  import { SharedString, SharedStringSegment } from "./sharedString";
@@ -121,18 +122,28 @@ export function appendDeleteIntervalToRevertibles(
121
122
  revertibles: SharedStringRevertible[],
122
123
  ) {
123
124
  const startSeg = interval.start.getSegment() as SharedStringSegment;
125
+ const startType =
126
+ startSeg.removedSeq !== undefined
127
+ ? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin
128
+ : ReferenceType.StayOnRemove | ReferenceType.RangeBegin;
124
129
  const endSeg = interval.end.getSegment() as SharedStringSegment;
130
+ const endType =
131
+ endSeg.removedSeq !== undefined
132
+ ? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd
133
+ : ReferenceType.StayOnRemove | ReferenceType.RangeEnd;
125
134
  const startRef = string.createLocalReferencePosition(
126
135
  startSeg,
127
136
  interval.start.getOffset(),
128
- ReferenceType.StayOnRemove | ReferenceType.RangeBegin,
137
+ startType,
129
138
  undefined,
139
+ interval.start.slidingPreference,
130
140
  );
131
141
  const endRef = string.createLocalReferencePosition(
132
142
  endSeg,
133
143
  interval.end.getOffset(),
134
- ReferenceType.StayOnRemove | ReferenceType.RangeEnd,
144
+ endType,
135
145
  undefined,
146
+ interval.end.slidingPreference,
136
147
  );
137
148
  const revertible = {
138
149
  event: IntervalOpType.DELETE,
@@ -158,18 +169,31 @@ export function appendChangeIntervalToRevertibles(
158
169
  revertibles: SharedStringRevertible[],
159
170
  ) {
160
171
  const startSeg = previousInterval.start.getSegment() as SharedStringSegment;
172
+ // This logic is needed because the ReferenceType StayOnRemove cannot be used
173
+ // on removed segments. This works for revertibles because the old position of the
174
+ // interval within the removed segment is handled by the remove range revertible.
175
+ const startType =
176
+ startSeg.removedSeq !== undefined
177
+ ? ReferenceType.SlideOnRemove | ReferenceType.RangeBegin
178
+ : ReferenceType.StayOnRemove | ReferenceType.RangeBegin;
161
179
  const endSeg = previousInterval.end.getSegment() as SharedStringSegment;
180
+ const endType =
181
+ endSeg.removedSeq !== undefined
182
+ ? ReferenceType.SlideOnRemove | ReferenceType.RangeEnd
183
+ : ReferenceType.StayOnRemove | ReferenceType.RangeEnd;
162
184
  const prevStartRef = string.createLocalReferencePosition(
163
185
  startSeg,
164
186
  previousInterval.start.getOffset(),
165
- ReferenceType.StayOnRemove | ReferenceType.RangeBegin,
187
+ startType,
166
188
  undefined,
189
+ previousInterval.start.slidingPreference,
167
190
  );
168
191
  const prevEndRef = string.createLocalReferencePosition(
169
192
  endSeg,
170
193
  previousInterval.end.getOffset(),
171
- ReferenceType.StayOnRemove | ReferenceType.RangeEnd,
194
+ endType,
172
195
  undefined,
196
+ previousInterval.end.slidingPreference,
173
197
  );
174
198
  const revertible = {
175
199
  event: IntervalOpType.CHANGE,
@@ -359,7 +383,29 @@ export function discardSharedStringRevertibles(
359
383
  });
360
384
  }
361
385
 
362
- // Uses of referenceRangeLabels will be removed once AB#4081 is completed.
386
+ function getSlidePosition(string: SharedString, lref: LocalReferencePosition, pos: number): number {
387
+ const slide = getSlideToSegoff(
388
+ { segment: lref.getSegment(), offset: undefined },
389
+ lref.slidingPreference,
390
+ );
391
+ return slide?.segment !== undefined &&
392
+ slide.offset !== undefined &&
393
+ string.getPosition(slide.segment) !== -1 &&
394
+ (pos < 0 || pos >= string.getLength())
395
+ ? string.getPosition(slide.segment) + slide.offset
396
+ : pos;
397
+ }
398
+
399
+ function isValidRange(start: number, end: number, string: SharedString) {
400
+ return (
401
+ start >= 0 &&
402
+ start < string.getLength() &&
403
+ end >= 0 &&
404
+ end < string.getLength() &&
405
+ start <= end
406
+ );
407
+ }
408
+
363
409
  function revertLocalAdd(
364
410
  string: SharedString,
365
411
  revertible: TypedRevertible<typeof IntervalOpType.ADD>,
@@ -374,12 +420,16 @@ function revertLocalDelete(
374
420
  revertible: TypedRevertible<typeof IntervalOpType.DELETE>,
375
421
  ) {
376
422
  const label = revertible.interval.properties.referenceRangeLabels[0];
423
+ const collection = string.getIntervalCollection(label);
377
424
  const start = string.localReferencePositionToPosition(revertible.start);
425
+ const startSlidePos = getSlidePosition(string, revertible.start, start);
378
426
  const end = string.localReferencePositionToPosition(revertible.end);
427
+ const endSlidePos = getSlidePosition(string, revertible.end, end);
379
428
  const type = revertible.interval.intervalType;
380
429
  // reusing the id causes eventual consistency bugs, so it is removed here and recreated in add
381
430
  const { intervalId, ...props } = revertible.interval.properties;
382
- const int = string.getIntervalCollection(label).add(start, end, type, props);
431
+ if (!isValidRange(startSlidePos, endSlidePos, string)) return;
432
+ const int = collection.add(startSlidePos, endSlidePos, type, props);
383
433
 
384
434
  idMap.forEach((newId, oldId) => {
385
435
  if (intervalId === newId) {
@@ -397,10 +447,14 @@ function revertLocalChange(
397
447
  revertible: TypedRevertible<typeof IntervalOpType.CHANGE>,
398
448
  ) {
399
449
  const label = revertible.interval.properties.referenceRangeLabels[0];
450
+ const collection = string.getIntervalCollection(label);
400
451
  const id = getUpdatedIdFromInterval(revertible.interval);
401
452
  const start = string.localReferencePositionToPosition(revertible.start);
453
+ const startSlidePos = getSlidePosition(string, revertible.start, start);
402
454
  const end = string.localReferencePositionToPosition(revertible.end);
403
- string.getIntervalCollection(label).change(id, start, end);
455
+ const endSlidePos = getSlidePosition(string, revertible.end, end);
456
+ if (!isValidRange(startSlidePos, endSlidePos, string)) return;
457
+ collection.change(id, startSlidePos, endSlidePos);
404
458
 
405
459
  string.removeLocalReferencePosition(revertible.start);
406
460
  string.removeLocalReferencePosition(revertible.end);