@fluidframework/sequence 2.31.1 → 2.32.0

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 (119) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -2
  5. package/dist/index.js.map +1 -1
  6. package/dist/intervalCollection.d.ts +5 -9
  7. package/dist/intervalCollection.d.ts.map +1 -1
  8. package/dist/intervalCollection.js +38 -104
  9. package/dist/intervalCollection.js.map +1 -1
  10. package/dist/intervalCollectionMap.d.ts.map +1 -1
  11. package/dist/intervalCollectionMap.js +5 -4
  12. package/dist/intervalCollectionMap.js.map +1 -1
  13. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  14. package/dist/intervalIndex/endpointInRangeIndex.js +2 -2
  15. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  16. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  17. package/dist/intervalIndex/endpointIndex.js +2 -3
  18. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  19. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  20. package/dist/intervalIndex/idIntervalIndex.js +0 -7
  21. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  22. package/dist/intervalIndex/index.d.ts +0 -1
  23. package/dist/intervalIndex/index.d.ts.map +1 -1
  24. package/dist/intervalIndex/index.js +1 -3
  25. package/dist/intervalIndex/index.js.map +1 -1
  26. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  27. package/dist/intervalIndex/overlappingIntervalsIndex.js +2 -2
  28. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  29. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  30. package/dist/intervalIndex/startpointInRangeIndex.js +2 -2
  31. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  32. package/dist/intervals/index.d.ts +2 -2
  33. package/dist/intervals/index.d.ts.map +1 -1
  34. package/dist/intervals/index.js +3 -1
  35. package/dist/intervals/index.js.map +1 -1
  36. package/dist/intervals/intervalUtils.d.ts +1 -5
  37. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  38. package/dist/intervals/intervalUtils.js.map +1 -1
  39. package/dist/intervals/sequenceInterval.d.ts +20 -9
  40. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  41. package/dist/intervals/sequenceInterval.js +82 -27
  42. package/dist/intervals/sequenceInterval.js.map +1 -1
  43. package/dist/packageVersion.d.ts +1 -1
  44. package/dist/packageVersion.js +1 -1
  45. package/dist/packageVersion.js.map +1 -1
  46. package/dist/revertibles.d.ts.map +1 -1
  47. package/dist/revertibles.js +8 -7
  48. package/dist/revertibles.js.map +1 -1
  49. package/lib/index.d.ts +1 -1
  50. package/lib/index.d.ts.map +1 -1
  51. package/lib/index.js +1 -1
  52. package/lib/index.js.map +1 -1
  53. package/lib/intervalCollection.d.ts +5 -9
  54. package/lib/intervalCollection.d.ts.map +1 -1
  55. package/lib/intervalCollection.js +39 -105
  56. package/lib/intervalCollection.js.map +1 -1
  57. package/lib/intervalCollectionMap.d.ts.map +1 -1
  58. package/lib/intervalCollectionMap.js +6 -5
  59. package/lib/intervalCollectionMap.js.map +1 -1
  60. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  61. package/lib/intervalIndex/endpointInRangeIndex.js +3 -3
  62. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  63. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  64. package/lib/intervalIndex/endpointIndex.js +3 -4
  65. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  66. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  67. package/lib/intervalIndex/idIntervalIndex.js +0 -7
  68. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  69. package/lib/intervalIndex/index.d.ts +0 -1
  70. package/lib/intervalIndex/index.d.ts.map +1 -1
  71. package/lib/intervalIndex/index.js +0 -1
  72. package/lib/intervalIndex/index.js.map +1 -1
  73. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  74. package/lib/intervalIndex/overlappingIntervalsIndex.js +3 -3
  75. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  76. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  77. package/lib/intervalIndex/startpointInRangeIndex.js +3 -3
  78. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  79. package/lib/intervals/index.d.ts +2 -2
  80. package/lib/intervals/index.d.ts.map +1 -1
  81. package/lib/intervals/index.js +1 -1
  82. package/lib/intervals/index.js.map +1 -1
  83. package/lib/intervals/intervalUtils.d.ts +1 -5
  84. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  85. package/lib/intervals/intervalUtils.js.map +1 -1
  86. package/lib/intervals/sequenceInterval.d.ts +20 -9
  87. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  88. package/lib/intervals/sequenceInterval.js +81 -28
  89. package/lib/intervals/sequenceInterval.js.map +1 -1
  90. package/lib/packageVersion.d.ts +1 -1
  91. package/lib/packageVersion.js +1 -1
  92. package/lib/packageVersion.js.map +1 -1
  93. package/lib/revertibles.d.ts.map +1 -1
  94. package/lib/revertibles.js +8 -7
  95. package/lib/revertibles.js.map +1 -1
  96. package/package.json +19 -18
  97. package/src/index.ts +0 -1
  98. package/src/intervalCollection.ts +59 -144
  99. package/src/intervalCollectionMap.ts +5 -5
  100. package/src/intervalIndex/endpointInRangeIndex.ts +3 -15
  101. package/src/intervalIndex/endpointIndex.ts +3 -17
  102. package/src/intervalIndex/idIntervalIndex.ts +0 -7
  103. package/src/intervalIndex/index.ts +0 -1
  104. package/src/intervalIndex/overlappingIntervalsIndex.ts +3 -12
  105. package/src/intervalIndex/startpointInRangeIndex.ts +3 -15
  106. package/src/intervals/index.ts +2 -1
  107. package/src/intervals/intervalUtils.ts +0 -7
  108. package/src/intervals/sequenceInterval.ts +124 -33
  109. package/src/packageVersion.ts +1 -1
  110. package/src/revertibles.ts +8 -7
  111. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +0 -11
  112. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +0 -1
  113. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +0 -38
  114. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +0 -1
  115. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +0 -11
  116. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +0 -1
  117. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +0 -34
  118. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +0 -1
  119. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +0 -80
@@ -7,15 +7,12 @@
7
7
 
8
8
  import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
9
9
  import {
10
- PropertiesManager,
11
10
  PropertySet,
12
11
  SlidingPreference,
13
12
  SequencePlace,
14
13
  Side,
15
14
  } from "@fluidframework/merge-tree/internal";
16
15
 
17
- import type { SequenceIntervalClass } from "./sequenceInterval.js";
18
-
19
16
  /**
20
17
  * Basic interval abstraction
21
18
  * @legacy
@@ -171,10 +168,6 @@ export interface ISerializableInterval extends IInterval {
171
168
  getIntervalId(): string;
172
169
  }
173
170
 
174
- export type ISerializableIntervalPrivate = SequenceIntervalClass & {
175
- propertyManager?: PropertiesManager;
176
- };
177
-
178
171
  /**
179
172
  * Represents a change that should be applied to an existing interval.
180
173
  * Changes can modify any of start/end/properties, with `undefined` signifying no change should be made.
@@ -29,14 +29,13 @@ import {
29
29
  addProperties,
30
30
  copyPropertiesAndManager,
31
31
  type ISegmentInternal,
32
+ UnassignedSequenceNumber,
33
+ UniversalSequenceNumber,
32
34
  } from "@fluidframework/merge-tree/internal";
33
35
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
36
+ import { v4 as uuid } from "uuid";
34
37
 
35
- import {
36
- computeStickinessFromSide,
37
- reservedIntervalIdKey,
38
- sidesFromStickiness,
39
- } from "../intervalCollection.js";
38
+ import { computeStickinessFromSide } from "../intervalCollection.js";
40
39
 
41
40
  import {
42
41
  ISerializableInterval,
@@ -45,6 +44,7 @@ import {
45
44
  IntervalType,
46
45
  endReferenceSlidingPreference,
47
46
  startReferenceSlidingPreference,
47
+ type SerializedIntervalDelta,
48
48
  } from "./intervalUtils.js";
49
49
 
50
50
  function compareSides(sideA: Side, sideB: Side): number {
@@ -75,6 +75,30 @@ function maxSide(sideA: Side, sideB: Side): Side {
75
75
  return Side.After;
76
76
  }
77
77
 
78
+ const reservedIntervalIdKey = "intervalId";
79
+
80
+ const legacyIdPrefix = "legacy";
81
+
82
+ export function getSerializedProperties(
83
+ serializedInterval: ISerializedInterval | SerializedIntervalDelta,
84
+ ): {
85
+ id: string;
86
+ labels: string[];
87
+ properties: PropertySet;
88
+ } {
89
+ const {
90
+ [reservedIntervalIdKey]: maybeId,
91
+ [reservedRangeLabelsKey]: labels,
92
+ ...properties
93
+ } = serializedInterval.properties ?? {};
94
+ // Create a non-unique ID based on start and end to be used on intervals that come from legacy clients
95
+ // without ID's.
96
+ const id =
97
+ maybeId ?? `${legacyIdPrefix}${serializedInterval.start}-${serializedInterval.end}`;
98
+
99
+ return { id, labels, properties };
100
+ }
101
+
78
102
  /**
79
103
  * Interval implementation whose ends are associated with positions in a mutatable sequence.
80
104
  * As such, when content is inserted into the middle of the interval, the interval expands to
@@ -183,15 +207,32 @@ export interface SequenceInterval extends ISerializableInterval {
183
207
  }
184
208
 
185
209
  export class SequenceIntervalClass implements SequenceInterval {
210
+ readonly #props: {
211
+ propertyManager?: PropertiesManager;
212
+ properties: PropertySet;
213
+ } = { properties: createMap<any>() };
214
+
186
215
  /**
187
216
  * {@inheritDoc ISerializableInterval.properties}
188
217
  */
189
- public properties: PropertySet = createMap<any>();
218
+ public get properties(): Readonly<PropertySet> {
219
+ return this.#props.properties;
220
+ }
190
221
 
191
- /**
192
- * {@inheritDoc ISerializableInterval.propertyManager}
193
- */
194
- public propertyManager?: PropertiesManager;
222
+ public changeProperties(props: PropertySet | undefined, op?: ISequencedDocumentMessage) {
223
+ if (props !== undefined) {
224
+ this.#props.propertyManager ??= new PropertiesManager();
225
+ return this.#props.propertyManager.handleProperties(
226
+ { props },
227
+ this.#props,
228
+ this.client.getCollabWindow().collaborating
229
+ ? (op?.sequenceNumber ?? UnassignedSequenceNumber)
230
+ : UniversalSequenceNumber,
231
+ op?.minimumSequenceNumber ?? UniversalSequenceNumber,
232
+ this.client.getCollabWindow().collaborating,
233
+ );
234
+ }
235
+ }
195
236
 
196
237
  /***/
197
238
  public get stickiness(): IntervalStickiness {
@@ -207,6 +248,8 @@ export class SequenceIntervalClass implements SequenceInterval {
207
248
 
208
249
  constructor(
209
250
  private readonly client: Client,
251
+ private readonly id: string,
252
+ private readonly label: string,
210
253
  /**
211
254
  * Start endpoint of this interval.
212
255
  * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.
@@ -223,7 +266,7 @@ export class SequenceIntervalClass implements SequenceInterval {
223
266
  public readonly endSide: Side = Side.Before,
224
267
  ) {
225
268
  if (props) {
226
- this.properties = addProperties(this.properties, props);
269
+ this.#props.properties = addProperties(this.#props.properties, props);
227
270
  }
228
271
  }
229
272
 
@@ -264,27 +307,42 @@ export class SequenceIntervalClass implements SequenceInterval {
264
307
  * {@inheritDoc ISerializableInterval.serialize}
265
308
  */
266
309
  public serialize(): ISerializedInterval {
267
- const startPosition = this.client.localReferencePositionToPosition(this.start);
268
- const endPosition = this.client.localReferencePositionToPosition(this.end);
269
- const { startSide, endSide } = sidesFromStickiness(this.stickiness);
270
- const serializedInterval: ISerializedInterval = {
310
+ return this.serializeDelta({
311
+ props: this.properties,
312
+ includeEndpoints: true,
313
+ }) as ISerializedInterval;
314
+ }
315
+
316
+ public serializeDelta({
317
+ props,
318
+ includeEndpoints,
319
+ }: {
320
+ props: PropertySet | undefined;
321
+ includeEndpoints: boolean;
322
+ }): SerializedIntervalDelta {
323
+ const startSegment: ISegmentInternal | undefined = this.start.getSegment();
324
+ const endSegment: ISegmentInternal | undefined = this.end.getSegment();
325
+ const startPosition = includeEndpoints
326
+ ? (startSegment?.endpointType ??
327
+ this.client.localReferencePositionToPosition(this.start))
328
+ : undefined;
329
+ const endPosition = includeEndpoints
330
+ ? (endSegment?.endpointType ?? this.client.localReferencePositionToPosition(this.end))
331
+ : undefined;
332
+ return {
271
333
  end: endPosition,
272
334
  intervalType: this.intervalType,
273
335
  sequenceNumber: this.client.getCurrentSeq(),
274
336
  start: startPosition,
275
337
  stickiness: this.stickiness,
276
- startSide,
277
- endSide,
278
- };
279
-
280
- if (this.properties) {
281
- serializedInterval.properties = addProperties(
282
- serializedInterval.properties,
283
- this.properties,
284
- );
285
- }
286
-
287
- return serializedInterval;
338
+ startSide: includeEndpoints ? this.startSide : undefined,
339
+ endSide: includeEndpoints ? this.endSide : undefined,
340
+ properties: {
341
+ ...props,
342
+ [reservedIntervalIdKey]: this.id,
343
+ [reservedRangeLabelsKey]: [this.label],
344
+ },
345
+ } satisfies SerializedIntervalDelta;
288
346
  }
289
347
 
290
348
  /**
@@ -293,6 +351,8 @@ export class SequenceIntervalClass implements SequenceInterval {
293
351
  public clone(): SequenceIntervalClass {
294
352
  return new SequenceIntervalClass(
295
353
  this.client,
354
+ this.id,
355
+ this.label,
296
356
  this.start,
297
357
  this.end,
298
358
  this.intervalType,
@@ -367,9 +427,7 @@ export class SequenceIntervalClass implements SequenceInterval {
367
427
  * {@inheritDoc ISerializableInterval.getIntervalId}
368
428
  */
369
429
  public getIntervalId(): string {
370
- const id = this.properties?.[reservedIntervalIdKey];
371
- assert(id !== undefined, 0x5e2 /* interval ID should not be undefined */);
372
- return `${id}`;
430
+ return this.id;
373
431
  }
374
432
 
375
433
  /**
@@ -397,6 +455,8 @@ export class SequenceIntervalClass implements SequenceInterval {
397
455
 
398
456
  return new SequenceIntervalClass(
399
457
  this.client,
458
+ uuid(),
459
+ this.label,
400
460
  newStart,
401
461
  newEnd,
402
462
  this.intervalType,
@@ -482,6 +542,8 @@ export class SequenceIntervalClass implements SequenceInterval {
482
542
 
483
543
  const newInterval = new SequenceIntervalClass(
484
544
  this.client,
545
+ this.id,
546
+ this.label,
485
547
  startRef,
486
548
  endRef,
487
549
  this.intervalType,
@@ -489,9 +551,17 @@ export class SequenceIntervalClass implements SequenceInterval {
489
551
  startSide ?? this.startSide,
490
552
  endSide ?? this.endSide,
491
553
  );
492
- copyPropertiesAndManager(this, newInterval);
554
+ copyPropertiesAndManager(this.#props, newInterval.#props);
493
555
  return newInterval;
494
556
  }
557
+
558
+ public ackPropertiesChange(newProps: PropertySet, op: ISequencedDocumentMessage) {
559
+ this.#props.propertyManager ??= new PropertiesManager();
560
+ // Let the propertyManager prune its pending change-properties set.
561
+ this.#props.propertyManager.ack(op.sequenceNumber, op.minimumSequenceNumber, {
562
+ props: newProps,
563
+ });
564
+ }
495
565
  }
496
566
 
497
567
  export function createPositionReferenceFromSegoff(
@@ -569,7 +639,7 @@ function createPositionReference(
569
639
  referenceSequenceNumber: op.referenceSequenceNumber,
570
640
  clientId: op.clientId,
571
641
  });
572
- segoff = getSlideToSegoff(segoff, slidingPreference, useNewSlidingBehavior);
642
+ segoff = getSlideToSegoff(segoff, slidingPreference, undefined, useNewSlidingBehavior);
573
643
  }
574
644
  } else {
575
645
  assert(
@@ -594,8 +664,24 @@ function createPositionReference(
594
664
  );
595
665
  }
596
666
 
667
+ export function createTransientInterval(
668
+ start: SequencePlace | undefined,
669
+ end: SequencePlace | undefined,
670
+ client: Client,
671
+ ) {
672
+ return createSequenceInterval(
673
+ "transient",
674
+ uuid(),
675
+ start,
676
+ end,
677
+ client,
678
+ IntervalType.Transient,
679
+ );
680
+ }
681
+
597
682
  export function createSequenceInterval(
598
683
  label: string,
684
+ id: string,
599
685
  start: SequencePlace | undefined,
600
686
  end: SequencePlace | undefined,
601
687
  client: Client,
@@ -603,6 +689,7 @@ export function createSequenceInterval(
603
689
  op?: ISequencedDocumentMessage,
604
690
  fromSnapshot?: boolean,
605
691
  useNewSlidingBehavior: boolean = false,
692
+ props?: PropertySet,
606
693
  ): SequenceIntervalClass {
607
694
  const { startPos, startSide, endPos, endSide } = endpointPosAndSide(
608
695
  start ?? "start",
@@ -666,10 +753,14 @@ export function createSequenceInterval(
666
753
 
667
754
  const ival = new SequenceIntervalClass(
668
755
  client,
756
+ id,
757
+ label,
669
758
  startLref,
670
759
  endLref,
671
760
  intervalType,
672
- rangeProp,
761
+ props === undefined
762
+ ? undefined
763
+ : { ...props, [reservedIntervalIdKey]: undefined, [reservedRangeLabelsKey]: undefined },
673
764
  startSide,
674
765
  endSide,
675
766
  );
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.31.1";
9
+ export const pkgVersion = "2.32.0";
@@ -341,7 +341,7 @@ export function appendSharedStringDeltaToRevertibles(
341
341
 
342
342
  revertible.intervals.push({
343
343
  intervalId: interval.getIntervalId(),
344
- label: interval.properties.referenceRangeLabels[0],
344
+ label: interval.start.properties?.referenceRangeLabels[0],
345
345
  startOffset: offset,
346
346
  endOffset,
347
347
  });
@@ -351,7 +351,7 @@ export function appendSharedStringDeltaToRevertibles(
351
351
  endIntervals.forEach(({ interval, offset }) => {
352
352
  revertible.intervals.push({
353
353
  intervalId: interval.getIntervalId(),
354
- label: interval.properties.referenceRangeLabels[0],
354
+ label: interval.start.properties?.referenceRangeLabels[0],
355
355
  endOffset: offset,
356
356
  });
357
357
  });
@@ -433,7 +433,7 @@ function revertLocalAdd(
433
433
  revertible: TypedRevertible<typeof IntervalOpType.ADD>,
434
434
  ) {
435
435
  const id = getUpdatedIdFromInterval(revertible.interval);
436
- const label = revertible.interval.properties.referenceRangeLabels[0];
436
+ const label = revertible.interval.start.properties?.referenceRangeLabels[0];
437
437
  string.getIntervalCollection(label).removeIntervalById(id);
438
438
  }
439
439
 
@@ -461,14 +461,15 @@ function revertLocalDelete(
461
461
  string: ISharedString,
462
462
  revertible: TypedRevertible<typeof IntervalOpType.DELETE>,
463
463
  ) {
464
- const label = revertible.interval.properties.referenceRangeLabels[0];
464
+ const label = revertible.interval.start.properties?.referenceRangeLabels[0];
465
465
  const collection = string.getIntervalCollection(label);
466
466
  const start = string.localReferencePositionToPosition(revertible.start);
467
467
  const startSlidePos = getSlidePosition(string, revertible.start, start);
468
468
  const end = string.localReferencePositionToPosition(revertible.end);
469
469
  const endSlidePos = getSlidePosition(string, revertible.end, end);
470
470
  // reusing the id causes eventual consistency bugs, so it is removed here and recreated in add
471
- const { intervalId, ...props } = revertible.interval.properties;
471
+ const { ...props } = revertible.interval.properties;
472
+ const intervalId = revertible.interval.getIntervalId();
472
473
  if (
473
474
  isValidRange(
474
475
  startSlidePos,
@@ -500,7 +501,7 @@ function revertLocalChange(
500
501
  string: ISharedString,
501
502
  revertible: TypedRevertible<typeof IntervalOpType.CHANGE>,
502
503
  ) {
503
- const label = revertible.interval.properties.referenceRangeLabels[0];
504
+ const label = revertible.interval.start.properties?.referenceRangeLabels[0];
504
505
  const collection = string.getIntervalCollection(label);
505
506
  const id = getUpdatedIdFromInterval(revertible.interval);
506
507
  const start = string.localReferencePositionToPosition(revertible.start);
@@ -540,7 +541,7 @@ function revertLocalPropertyChanged(
540
541
  string: ISharedString,
541
542
  revertible: TypedRevertible<typeof IntervalOpType.PROPERTY_CHANGED>,
542
543
  ) {
543
- const label = revertible.interval.properties.referenceRangeLabels[0];
544
+ const label = revertible.interval.start.properties?.referenceRangeLabels[0];
544
545
  const id = getUpdatedIdFromInterval(revertible.interval);
545
546
  const newProps = revertible.propertyDeltas;
546
547
  string.getIntervalCollection(label).change(id, { props: newProps });
@@ -1,11 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { ISharedString } from "../sharedString.js";
6
- import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
7
- /**
8
- * @internal
9
- */
10
- export declare function createOverlappingSequenceIntervalsIndex(sharedString: ISharedString): SequenceIntervalIndexes.Overlapping;
11
- //# sourceMappingURL=overlappingSequenceIntervalsIndex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AA+CvE;;GAEG;AACH,wBAAgB,uCAAuC,CACtD,YAAY,EAAE,aAAa,GACzB,uBAAuB,CAAC,WAAW,CAGrC"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- /*!
3
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
4
- * Licensed under the MIT License.
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createOverlappingSequenceIntervalsIndex = void 0;
8
- /* eslint-disable import/no-deprecated */
9
- const internal_1 = require("@fluidframework/merge-tree/internal");
10
- const index_js_1 = require("../intervals/index.js");
11
- const overlappingIntervalsIndex_js_1 = require("./overlappingIntervalsIndex.js");
12
- class OverlappingSequenceIntervalsIndex extends overlappingIntervalsIndex_js_1.OverlappingIntervalsIndex {
13
- constructor(client) {
14
- super(client);
15
- }
16
- findOverlappingIntervalsBySegoff(startSegoff, endSegoff) {
17
- if (this.intervalTree.intervals.isEmpty()) {
18
- return [];
19
- }
20
- const startLref = (0, index_js_1.createPositionReferenceFromSegoff)(this.client, startSegoff, internal_1.ReferenceType.Transient);
21
- const endLref = (0, index_js_1.createPositionReferenceFromSegoff)(this.client, endSegoff, internal_1.ReferenceType.Transient);
22
- if ((0, internal_1.compareReferencePositions)(startLref, endLref) > 0) {
23
- return [];
24
- }
25
- const transientInterval = new index_js_1.SequenceIntervalClass(this.client, startLref, endLref, index_js_1.IntervalType.Transient, { [internal_1.reservedRangeLabelsKey]: ["transient"] });
26
- const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
27
- return overlappingIntervalNodes.map((node) => node.key);
28
- }
29
- }
30
- /**
31
- * @internal
32
- */
33
- function createOverlappingSequenceIntervalsIndex(sharedString) {
34
- const client = sharedString.client;
35
- return new OverlappingSequenceIntervalsIndex(client);
36
- }
37
- exports.createOverlappingSequenceIntervalsIndex = createOverlappingSequenceIntervalsIndex;
38
- //# sourceMappingURL=overlappingSequenceIntervalsIndex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,yCAAyC;AAEzC,kEAM6C;AAE7C,oDAK+B;AAG/B,iFAA2E;AAG3E,MAAM,iCACL,SAAQ,wDAAyB;IAGjC,YAAY,MAAc;QACzB,KAAK,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IAEM,gCAAgC,CACtC,WAA0E,EAC1E,SAAwE;QAExE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,4CAAiC,EAClD,IAAI,CAAC,MAAM,EACX,WAAW,EACX,wBAAa,CAAC,SAAS,CACvB,CAAC;QAEF,MAAM,OAAO,GAAG,IAAA,4CAAiC,EAChD,IAAI,CAAC,MAAM,EACX,SAAS,EACT,wBAAa,CAAC,SAAS,CACvB,CAAC;QAEF,IAAI,IAAA,oCAAyB,EAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,gCAAqB,CAClD,IAAI,CAAC,MAAM,EACX,SAAS,EACT,OAAO,EACP,uBAAY,CAAC,SAAS,EACtB,EAAE,CAAC,iCAAsB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAC3C,CAAC;QAEF,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5E,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;CACD;AAED;;GAEG;AACH,SAAgB,uCAAuC,CACtD,YAA2B;IAE3B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,iCAAiC,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC;AALD,0FAKC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-deprecated */\n\nimport {\n\tClient,\n\tISegment,\n\tReferenceType,\n\tcompareReferencePositions,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree/internal\";\n\nimport {\n\tIntervalType,\n\tSequenceInterval,\n\tSequenceIntervalClass,\n\tcreatePositionReferenceFromSegoff,\n} from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport { OverlappingIntervalsIndex } from \"./overlappingIntervalsIndex.js\";\nimport { SequenceIntervalIndexes } from \"./sequenceIntervalIndexes.js\";\n\nclass OverlappingSequenceIntervalsIndex\n\textends OverlappingIntervalsIndex\n\timplements SequenceIntervalIndexes.Overlapping\n{\n\tconstructor(client: Client) {\n\t\tsuper(client);\n\t}\n\n\tpublic findOverlappingIntervalsBySegoff(\n\t\tstartSegoff: { segment: ISegment | undefined; offset: number | undefined },\n\t\tendSegoff: { segment: ISegment | undefined; offset: number | undefined },\n\t): Iterable<SequenceInterval> {\n\t\tif (this.intervalTree.intervals.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst startLref = createPositionReferenceFromSegoff(\n\t\t\tthis.client,\n\t\t\tstartSegoff,\n\t\t\tReferenceType.Transient,\n\t\t);\n\n\t\tconst endLref = createPositionReferenceFromSegoff(\n\t\t\tthis.client,\n\t\t\tendSegoff,\n\t\t\tReferenceType.Transient,\n\t\t);\n\n\t\tif (compareReferencePositions(startLref, endLref) > 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst transientInterval = new SequenceIntervalClass(\n\t\t\tthis.client,\n\t\t\tstartLref,\n\t\t\tendLref,\n\t\t\tIntervalType.Transient,\n\t\t\t{ [reservedRangeLabelsKey]: [\"transient\"] },\n\t\t);\n\n\t\tconst overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n\t\treturn overlappingIntervalNodes.map((node) => node.key);\n\t}\n}\n\n/**\n * @internal\n */\nexport function createOverlappingSequenceIntervalsIndex(\n\tsharedString: ISharedString,\n): SequenceIntervalIndexes.Overlapping {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingSequenceIntervalsIndex(client);\n}\n"]}
@@ -1,11 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { ISharedString } from "../sharedString.js";
6
- import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
7
- /**
8
- * @internal
9
- */
10
- export declare function createOverlappingSequenceIntervalsIndex(sharedString: ISharedString): SequenceIntervalIndexes.Overlapping;
11
- //# sourceMappingURL=overlappingSequenceIntervalsIndex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AA+CvE;;GAEG;AACH,wBAAgB,uCAAuC,CACtD,YAAY,EAAE,aAAa,GACzB,uBAAuB,CAAC,WAAW,CAGrC"}
@@ -1,34 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- /* eslint-disable import/no-deprecated */
6
- import { ReferenceType, compareReferencePositions, reservedRangeLabelsKey, } from "@fluidframework/merge-tree/internal";
7
- import { IntervalType, SequenceIntervalClass, createPositionReferenceFromSegoff, } from "../intervals/index.js";
8
- import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
9
- class OverlappingSequenceIntervalsIndex extends OverlappingIntervalsIndex {
10
- constructor(client) {
11
- super(client);
12
- }
13
- findOverlappingIntervalsBySegoff(startSegoff, endSegoff) {
14
- if (this.intervalTree.intervals.isEmpty()) {
15
- return [];
16
- }
17
- const startLref = createPositionReferenceFromSegoff(this.client, startSegoff, ReferenceType.Transient);
18
- const endLref = createPositionReferenceFromSegoff(this.client, endSegoff, ReferenceType.Transient);
19
- if (compareReferencePositions(startLref, endLref) > 0) {
20
- return [];
21
- }
22
- const transientInterval = new SequenceIntervalClass(this.client, startLref, endLref, IntervalType.Transient, { [reservedRangeLabelsKey]: ["transient"] });
23
- const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
24
- return overlappingIntervalNodes.map((node) => node.key);
25
- }
26
- }
27
- /**
28
- * @internal
29
- */
30
- export function createOverlappingSequenceIntervalsIndex(sharedString) {
31
- const client = sharedString.client;
32
- return new OverlappingSequenceIntervalsIndex(client);
33
- }
34
- //# sourceMappingURL=overlappingSequenceIntervalsIndex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yCAAyC;AAEzC,OAAO,EAGN,aAAa,EACb,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACN,YAAY,EAEZ,qBAAqB,EACrB,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,MAAM,iCACL,SAAQ,yBAAyB;IAGjC,YAAY,MAAc;QACzB,KAAK,CAAC,MAAM,CAAC,CAAC;IACf,CAAC;IAEM,gCAAgC,CACtC,WAA0E,EAC1E,SAAwE;QAExE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3C,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,SAAS,GAAG,iCAAiC,CAClD,IAAI,CAAC,MAAM,EACX,WAAW,EACX,aAAa,CAAC,SAAS,CACvB,CAAC;QAEF,MAAM,OAAO,GAAG,iCAAiC,CAChD,IAAI,CAAC,MAAM,EACX,SAAS,EACT,aAAa,CAAC,SAAS,CACvB,CAAC;QAEF,IAAI,yBAAyB,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,iBAAiB,GAAG,IAAI,qBAAqB,CAClD,IAAI,CAAC,MAAM,EACX,SAAS,EACT,OAAO,EACP,YAAY,CAAC,SAAS,EACtB,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAC3C,CAAC;QAEF,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC5E,OAAO,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;CACD;AAED;;GAEG;AACH,MAAM,UAAU,uCAAuC,CACtD,YAA2B;IAE3B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,iCAAiC,CAAC,MAAM,CAAC,CAAC;AACtD,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable import/no-deprecated */\n\nimport {\n\tClient,\n\tISegment,\n\tReferenceType,\n\tcompareReferencePositions,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree/internal\";\n\nimport {\n\tIntervalType,\n\tSequenceInterval,\n\tSequenceIntervalClass,\n\tcreatePositionReferenceFromSegoff,\n} from \"../intervals/index.js\";\nimport { ISharedString } from \"../sharedString.js\";\n\nimport { OverlappingIntervalsIndex } from \"./overlappingIntervalsIndex.js\";\nimport { SequenceIntervalIndexes } from \"./sequenceIntervalIndexes.js\";\n\nclass OverlappingSequenceIntervalsIndex\n\textends OverlappingIntervalsIndex\n\timplements SequenceIntervalIndexes.Overlapping\n{\n\tconstructor(client: Client) {\n\t\tsuper(client);\n\t}\n\n\tpublic findOverlappingIntervalsBySegoff(\n\t\tstartSegoff: { segment: ISegment | undefined; offset: number | undefined },\n\t\tendSegoff: { segment: ISegment | undefined; offset: number | undefined },\n\t): Iterable<SequenceInterval> {\n\t\tif (this.intervalTree.intervals.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst startLref = createPositionReferenceFromSegoff(\n\t\t\tthis.client,\n\t\t\tstartSegoff,\n\t\t\tReferenceType.Transient,\n\t\t);\n\n\t\tconst endLref = createPositionReferenceFromSegoff(\n\t\t\tthis.client,\n\t\t\tendSegoff,\n\t\t\tReferenceType.Transient,\n\t\t);\n\n\t\tif (compareReferencePositions(startLref, endLref) > 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst transientInterval = new SequenceIntervalClass(\n\t\t\tthis.client,\n\t\t\tstartLref,\n\t\t\tendLref,\n\t\t\tIntervalType.Transient,\n\t\t\t{ [reservedRangeLabelsKey]: [\"transient\"] },\n\t\t);\n\n\t\tconst overlappingIntervalNodes = this.intervalTree.match(transientInterval);\n\t\treturn overlappingIntervalNodes.map((node) => node.key);\n\t}\n}\n\n/**\n * @internal\n */\nexport function createOverlappingSequenceIntervalsIndex(\n\tsharedString: ISharedString,\n): SequenceIntervalIndexes.Overlapping {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingSequenceIntervalsIndex(client);\n}\n"]}
@@ -1,80 +0,0 @@
1
- /*!
2
- * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- /* eslint-disable import/no-deprecated */
7
-
8
- import {
9
- Client,
10
- ISegment,
11
- ReferenceType,
12
- compareReferencePositions,
13
- reservedRangeLabelsKey,
14
- } from "@fluidframework/merge-tree/internal";
15
-
16
- import {
17
- IntervalType,
18
- SequenceInterval,
19
- SequenceIntervalClass,
20
- createPositionReferenceFromSegoff,
21
- } from "../intervals/index.js";
22
- import { ISharedString } from "../sharedString.js";
23
-
24
- import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex.js";
25
- import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes.js";
26
-
27
- class OverlappingSequenceIntervalsIndex
28
- extends OverlappingIntervalsIndex
29
- implements SequenceIntervalIndexes.Overlapping
30
- {
31
- constructor(client: Client) {
32
- super(client);
33
- }
34
-
35
- public findOverlappingIntervalsBySegoff(
36
- startSegoff: { segment: ISegment | undefined; offset: number | undefined },
37
- endSegoff: { segment: ISegment | undefined; offset: number | undefined },
38
- ): Iterable<SequenceInterval> {
39
- if (this.intervalTree.intervals.isEmpty()) {
40
- return [];
41
- }
42
-
43
- const startLref = createPositionReferenceFromSegoff(
44
- this.client,
45
- startSegoff,
46
- ReferenceType.Transient,
47
- );
48
-
49
- const endLref = createPositionReferenceFromSegoff(
50
- this.client,
51
- endSegoff,
52
- ReferenceType.Transient,
53
- );
54
-
55
- if (compareReferencePositions(startLref, endLref) > 0) {
56
- return [];
57
- }
58
-
59
- const transientInterval = new SequenceIntervalClass(
60
- this.client,
61
- startLref,
62
- endLref,
63
- IntervalType.Transient,
64
- { [reservedRangeLabelsKey]: ["transient"] },
65
- );
66
-
67
- const overlappingIntervalNodes = this.intervalTree.match(transientInterval);
68
- return overlappingIntervalNodes.map((node) => node.key);
69
- }
70
- }
71
-
72
- /**
73
- * @internal
74
- */
75
- export function createOverlappingSequenceIntervalsIndex(
76
- sharedString: ISharedString,
77
- ): SequenceIntervalIndexes.Overlapping {
78
- const client = (sharedString as unknown as { client: Client }).client;
79
- return new OverlappingSequenceIntervalsIndex(client);
80
- }