@fluidframework/sequence 2.0.0-internal.7.3.0 → 2.0.0-internal.8.0.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 (222) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/api-extractor-lint.json +13 -0
  3. package/api-extractor.json +8 -3
  4. package/api-report/sequence.api.md +138 -113
  5. package/dist/defaultMap.d.ts +3 -3
  6. package/dist/defaultMap.d.ts.map +1 -1
  7. package/dist/defaultMap.js +7 -2
  8. package/dist/defaultMap.js.map +1 -1
  9. package/dist/defaultMapInterfaces.d.ts +12 -11
  10. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  11. package/dist/defaultMapInterfaces.js.map +1 -1
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +11 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/intervalCollection.d.ts +70 -16
  17. package/dist/intervalCollection.d.ts.map +1 -1
  18. package/dist/intervalCollection.js +50 -45
  19. package/dist/intervalCollection.js.map +1 -1
  20. package/dist/intervalIndex/endpointInRangeIndex.d.ts +2 -2
  21. package/dist/intervalIndex/endpointInRangeIndex.js +1 -1
  22. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  23. package/dist/intervalIndex/endpointIndex.d.ts +2 -2
  24. package/dist/intervalIndex/endpointIndex.js +1 -1
  25. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  26. package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
  27. package/dist/intervalIndex/idIntervalIndex.js +1 -1
  28. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  29. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  30. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  31. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
  32. package/dist/intervalIndex/overlappingIntervalsIndex.js +1 -1
  33. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  34. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +1 -1
  35. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  36. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  37. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
  38. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  39. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  40. package/dist/intervalIndex/startpointInRangeIndex.d.ts +2 -2
  41. package/dist/intervalIndex/startpointInRangeIndex.js +1 -1
  42. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  43. package/dist/intervalTree.d.ts +1 -2
  44. package/dist/intervalTree.d.ts.map +1 -1
  45. package/dist/intervalTree.js +1 -3
  46. package/dist/intervalTree.js.map +1 -1
  47. package/dist/intervals/interval.d.ts +5 -11
  48. package/dist/intervals/interval.d.ts.map +1 -1
  49. package/dist/intervals/interval.js +10 -18
  50. package/dist/intervals/interval.js.map +1 -1
  51. package/dist/intervals/intervalUtils.d.ts +15 -18
  52. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  53. package/dist/intervals/intervalUtils.js +3 -8
  54. package/dist/intervals/intervalUtils.js.map +1 -1
  55. package/dist/intervals/sequenceInterval.d.ts +5 -15
  56. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  57. package/dist/intervals/sequenceInterval.js +12 -28
  58. package/dist/intervals/sequenceInterval.js.map +1 -1
  59. package/dist/localValues.d.ts +2 -1
  60. package/dist/localValues.d.ts.map +1 -1
  61. package/dist/localValues.js.map +1 -1
  62. package/dist/packageVersion.d.ts +1 -1
  63. package/dist/packageVersion.js +1 -1
  64. package/dist/packageVersion.js.map +1 -1
  65. package/dist/revertibles.d.ts +9 -15
  66. package/dist/revertibles.d.ts.map +1 -1
  67. package/dist/revertibles.js +14 -10
  68. package/dist/revertibles.js.map +1 -1
  69. package/dist/sequence-alpha.d.ts +283 -552
  70. package/dist/sequence-beta.d.ts +139 -1373
  71. package/dist/sequence-public.d.ts +139 -1373
  72. package/dist/sequence-untrimmed.d.ts +186 -141
  73. package/dist/sequence.d.ts +26 -24
  74. package/dist/sequence.d.ts.map +1 -1
  75. package/dist/sequence.js +38 -23
  76. package/dist/sequence.js.map +1 -1
  77. package/dist/sequenceDeltaEvent.d.ts +4 -4
  78. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  79. package/dist/sequenceDeltaEvent.js +14 -7
  80. package/dist/sequenceDeltaEvent.js.map +1 -1
  81. package/dist/sequenceFactory.d.ts +1 -1
  82. package/dist/sequenceFactory.js +1 -1
  83. package/dist/sequenceFactory.js.map +1 -1
  84. package/dist/sharedIntervalCollection.d.ts +3 -3
  85. package/dist/sharedIntervalCollection.js +2 -2
  86. package/dist/sharedIntervalCollection.js.map +1 -1
  87. package/dist/sharedSequence.d.ts +4 -4
  88. package/dist/sharedSequence.d.ts.map +1 -1
  89. package/dist/sharedSequence.js +8 -2
  90. package/dist/sharedSequence.js.map +1 -1
  91. package/dist/sharedString.d.ts +9 -18
  92. package/dist/sharedString.d.ts.map +1 -1
  93. package/dist/sharedString.js +9 -21
  94. package/dist/sharedString.js.map +1 -1
  95. package/lib/defaultMap.d.ts +3 -3
  96. package/lib/defaultMap.d.ts.map +1 -1
  97. package/lib/defaultMap.js +29 -20
  98. package/lib/defaultMap.js.map +1 -1
  99. package/lib/defaultMapInterfaces.d.ts +12 -11
  100. package/lib/defaultMapInterfaces.d.ts.map +1 -1
  101. package/lib/defaultMapInterfaces.js +2 -1
  102. package/lib/defaultMapInterfaces.js.map +1 -1
  103. package/lib/index.d.ts +1 -0
  104. package/lib/index.d.ts.map +1 -1
  105. package/lib/index.js +55 -10
  106. package/lib/index.js.map +1 -1
  107. package/lib/intervalCollection.d.ts +70 -16
  108. package/lib/intervalCollection.d.ts.map +1 -1
  109. package/lib/intervalCollection.js +174 -156
  110. package/lib/intervalCollection.js.map +1 -1
  111. package/lib/intervalIndex/endpointInRangeIndex.d.ts +2 -2
  112. package/lib/intervalIndex/endpointInRangeIndex.js +18 -13
  113. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  114. package/lib/intervalIndex/endpointIndex.d.ts +2 -2
  115. package/lib/intervalIndex/endpointIndex.js +14 -9
  116. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  117. package/lib/intervalIndex/idIntervalIndex.d.ts +2 -2
  118. package/lib/intervalIndex/idIntervalIndex.js +9 -5
  119. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  120. package/lib/intervalIndex/index.js +19 -6
  121. package/lib/intervalIndex/index.js.map +1 -1
  122. package/lib/intervalIndex/intervalIndex.d.ts +1 -1
  123. package/lib/intervalIndex/intervalIndex.js +2 -1
  124. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  125. package/lib/intervalIndex/intervalIndexUtils.js +8 -4
  126. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -1
  127. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +2 -2
  128. package/lib/intervalIndex/overlappingIntervalsIndex.js +16 -11
  129. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  130. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +1 -1
  131. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +15 -11
  132. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  133. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +2 -1
  134. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  135. package/lib/intervalIndex/sequenceIntervalIndexes.js +2 -1
  136. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  137. package/lib/intervalIndex/startpointInRangeIndex.d.ts +2 -2
  138. package/lib/intervalIndex/startpointInRangeIndex.js +18 -13
  139. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  140. package/lib/intervalTree.d.ts +1 -2
  141. package/lib/intervalTree.d.ts.map +1 -1
  142. package/lib/intervalTree.js +7 -4
  143. package/lib/intervalTree.js.map +1 -1
  144. package/lib/intervals/index.js +18 -3
  145. package/lib/intervals/index.js.map +1 -1
  146. package/lib/intervals/interval.d.ts +5 -11
  147. package/lib/intervals/interval.d.ts.map +1 -1
  148. package/lib/intervals/interval.js +26 -29
  149. package/lib/intervals/interval.js.map +1 -1
  150. package/lib/intervals/intervalUtils.d.ts +15 -18
  151. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  152. package/lib/intervals/intervalUtils.js +21 -21
  153. package/lib/intervals/intervalUtils.js.map +1 -1
  154. package/lib/intervals/sequenceInterval.d.ts +5 -15
  155. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  156. package/lib/intervals/sequenceInterval.js +72 -82
  157. package/lib/intervals/sequenceInterval.js.map +1 -1
  158. package/lib/localValues.d.ts +2 -1
  159. package/lib/localValues.d.ts.map +1 -1
  160. package/lib/localValues.js +9 -4
  161. package/lib/localValues.js.map +1 -1
  162. package/lib/packageVersion.d.ts +1 -1
  163. package/lib/packageVersion.js +5 -2
  164. package/lib/packageVersion.js.map +1 -1
  165. package/lib/revertibles.d.ts +9 -15
  166. package/lib/revertibles.d.ts.map +1 -1
  167. package/lib/revertibles.js +83 -69
  168. package/lib/revertibles.js.map +1 -1
  169. package/lib/sequence-alpha.d.ts +283 -552
  170. package/lib/sequence-beta.d.ts +139 -1373
  171. package/lib/sequence-public.d.ts +139 -1373
  172. package/lib/sequence-untrimmed.d.ts +186 -141
  173. package/lib/sequence.d.ts +26 -24
  174. package/lib/sequence.d.ts.map +1 -1
  175. package/lib/sequence.js +81 -61
  176. package/lib/sequence.js.map +1 -1
  177. package/lib/sequenceDeltaEvent.d.ts +4 -4
  178. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  179. package/lib/sequenceDeltaEvent.js +27 -14
  180. package/lib/sequenceDeltaEvent.js.map +1 -1
  181. package/lib/sequenceFactory.d.ts +1 -1
  182. package/lib/sequenceFactory.js +14 -10
  183. package/lib/sequenceFactory.js.map +1 -1
  184. package/lib/sharedIntervalCollection.d.ts +3 -3
  185. package/lib/sharedIntervalCollection.js +20 -15
  186. package/lib/sharedIntervalCollection.js.map +1 -1
  187. package/lib/sharedSequence.d.ts +4 -4
  188. package/lib/sharedSequence.d.ts.map +1 -1
  189. package/lib/sharedSequence.js +19 -8
  190. package/lib/sharedSequence.js.map +1 -1
  191. package/lib/sharedString.d.ts +9 -18
  192. package/lib/sharedString.d.ts.map +1 -1
  193. package/lib/sharedString.js +30 -37
  194. package/lib/sharedString.js.map +1 -1
  195. package/package.json +44 -22
  196. package/sequence.test-files.tar +0 -0
  197. package/src/defaultMap.ts +22 -16
  198. package/src/defaultMapInterfaces.ts +17 -14
  199. package/src/index.ts +17 -0
  200. package/src/intervalCollection.ts +135 -71
  201. package/src/intervalIndex/endpointInRangeIndex.ts +2 -2
  202. package/src/intervalIndex/endpointIndex.ts +2 -2
  203. package/src/intervalIndex/idIntervalIndex.ts +2 -2
  204. package/src/intervalIndex/intervalIndex.ts +1 -1
  205. package/src/intervalIndex/overlappingIntervalsIndex.ts +2 -2
  206. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -1
  207. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -1
  208. package/src/intervalIndex/startpointInRangeIndex.ts +2 -2
  209. package/src/intervalTree.ts +0 -3
  210. package/src/intervals/interval.ts +7 -26
  211. package/src/intervals/intervalUtils.ts +17 -20
  212. package/src/intervals/sequenceInterval.ts +7 -35
  213. package/src/localValues.ts +2 -1
  214. package/src/packageVersion.ts +1 -1
  215. package/src/revertibles.ts +20 -19
  216. package/src/sequence.ts +61 -43
  217. package/src/sequenceDeltaEvent.ts +12 -6
  218. package/src/sequenceFactory.ts +1 -1
  219. package/src/sharedIntervalCollection.ts +3 -3
  220. package/src/sharedSequence.ts +12 -6
  221. package/src/sharedString.ts +21 -48
  222. package/tsconfig.json +1 -0
@@ -35,7 +35,6 @@ import {
35
35
  IValueOpEmitter,
36
36
  IValueOperation,
37
37
  IValueType,
38
- IValueTypeOperationValue,
39
38
  SequenceOptions,
40
39
  } from "./defaultMapInterfaces";
41
40
  import {
@@ -88,7 +87,7 @@ import {
88
87
  * If a SequencePlace is the endpoint of a range (e.g. start/end of an interval or search range),
89
88
  * the Side value means it is exclusive if it is nearer to the other position and inclusive if it is farther.
90
89
  * E.g. the start of a range with Side.After is exclusive of the character at the position.
91
- * @public
90
+ * @alpha
92
91
  */
93
92
  export type SequencePlace = number | "start" | "end" | InteriorSequencePlace;
94
93
 
@@ -96,7 +95,7 @@ export type SequencePlace = number | "start" | "end" | InteriorSequencePlace;
96
95
  * A sequence place that does not refer to the special endpoint segments.
97
96
  *
98
97
  * See {@link SequencePlace} for additional context.
99
- * @public
98
+ * @alpha
100
99
  */
101
100
  export interface InteriorSequencePlace {
102
101
  pos: number;
@@ -107,7 +106,7 @@ export interface InteriorSequencePlace {
107
106
  * Defines a side relative to a character in a sequence.
108
107
  *
109
108
  * @remarks See {@link SequencePlace} for additional context on usage.
110
- * @public
109
+ * @alpha
111
110
  */
112
111
  export enum Side {
113
112
  Before = 0,
@@ -512,7 +511,7 @@ export class SequenceIntervalCollectionValueType
512
511
  return SequenceIntervalCollectionValueType._factory;
513
512
  }
514
513
 
515
- public get ops(): Map<string, IValueOperation<IntervalCollection<SequenceInterval>>> {
514
+ public get ops(): Map<IntervalOpType, IValueOperation<IntervalCollection<SequenceInterval>>> {
516
515
  return SequenceIntervalCollectionValueType._ops;
517
516
  }
518
517
 
@@ -552,7 +551,7 @@ export class IntervalCollectionValueType implements IValueType<IntervalCollectio
552
551
  return IntervalCollectionValueType._factory;
553
552
  }
554
553
 
555
- public get ops(): Map<string, IValueOperation<IntervalCollection<Interval>>> {
554
+ public get ops(): Map<IntervalOpType, IValueOperation<IntervalCollection<Interval>>> {
556
555
  return IntervalCollectionValueType._ops;
557
556
  }
558
557
 
@@ -562,21 +561,24 @@ export class IntervalCollectionValueType implements IValueType<IntervalCollectio
562
561
  }
563
562
 
564
563
  export function makeOpsMap<T extends ISerializableInterval>(): Map<
565
- string,
564
+ IntervalOpType,
566
565
  IValueOperation<IntervalCollection<T>>
567
566
  > {
568
- const rebase = (
569
- collection: IntervalCollection<T>,
570
- op: IValueTypeOperationValue,
571
- localOpMetadata: IMapMessageLocalMetadata,
567
+ const rebase: IValueOperation<IntervalCollection<T>>["rebase"] = (
568
+ collection,
569
+ op,
570
+ localOpMetadata,
572
571
  ) => {
573
572
  const { localSeq } = localOpMetadata;
574
573
  const rebasedValue = collection.rebaseLocalInterval(op.opName, op.value, localSeq);
574
+ if (rebasedValue === undefined) {
575
+ return undefined;
576
+ }
575
577
  const rebasedOp = { ...op, value: rebasedValue };
576
578
  return { rebasedOp, rebasedLocalOpMetadata: localOpMetadata };
577
579
  };
578
580
 
579
- return new Map<string, IValueOperation<IntervalCollection<T>>>([
581
+ return new Map<IntervalOpType, IValueOperation<IntervalCollection<T>>>([
580
582
  [
581
583
  IntervalOpType.ADD,
582
584
  {
@@ -624,7 +626,7 @@ export function makeOpsMap<T extends ISerializableInterval>(): Map<
624
626
  }
625
627
 
626
628
  /**
627
- * @public
629
+ * @alpha
628
630
  */
629
631
  export type DeserializeCallback = (properties: PropertySet) => void;
630
632
 
@@ -663,7 +665,7 @@ class IntervalCollectionIterator<TInterval extends ISerializableInterval>
663
665
 
664
666
  /**
665
667
  * Change events emitted by `IntervalCollection`s
666
- * @public
668
+ * @alpha
667
669
  */
668
670
  export interface IIntervalCollectionEvent<TInterval extends ISerializableInterval> extends IEvent {
669
671
  /**
@@ -688,7 +690,7 @@ export interface IIntervalCollectionEvent<TInterval extends ISerializableInterva
688
690
  op: ISequencedDocumentMessage | undefined,
689
691
  slide: boolean,
690
692
  ) => void,
691
- );
693
+ ): void;
692
694
  /**
693
695
  * This event is invoked whenever an interval is added or removed from the collection.
694
696
  * `local` reflects whether the change originated locally.
@@ -701,7 +703,7 @@ export interface IIntervalCollectionEvent<TInterval extends ISerializableInterva
701
703
  local: boolean,
702
704
  op: ISequencedDocumentMessage | undefined,
703
705
  ) => void,
704
- );
706
+ ): void;
705
707
  /**
706
708
  * This event is invoked whenever an interval's properties have changed.
707
709
  * `interval` reflects the state of the updated properties.
@@ -719,7 +721,7 @@ export interface IIntervalCollectionEvent<TInterval extends ISerializableInterva
719
721
  local: boolean,
720
722
  op: ISequencedDocumentMessage | undefined,
721
723
  ) => void,
722
- );
724
+ ): void;
723
725
  }
724
726
 
725
727
  // solely for type checking in the implementation of add - will be removed once
@@ -731,7 +733,7 @@ const isSequencePlace = (place: any): place is SequencePlace => {
731
733
  /**
732
734
  * Collection of intervals that supports addition, modification, removal, and efficient spatial querying.
733
735
  * Changes to this collection will be incur updates on collaborating clients (i.e. they are not local-only).
734
- * @public
736
+ * @alpha
735
737
  */
736
738
  export interface IIntervalCollection<TInterval extends ISerializableInterval>
737
739
  extends TypedEventEmitter<IIntervalCollectionEvent<TInterval>> {
@@ -863,19 +865,33 @@ export interface IIntervalCollection<TInterval extends ISerializableInterval>
863
865
  removeIntervalById(id: string): TInterval | undefined;
864
866
  /**
865
867
  * Changes the properties on an existing interval.
868
+ * @deprecated - call change with the id and and object containing the new properties
866
869
  * @param id - Id of the interval whose properties should be changed
867
870
  * @param props - Property set to apply to the interval. Shallow merging is used between any existing properties
868
871
  * and `prop`, i.e. the interval will end up with a property object equivalent to `{ ...oldProps, ...props }`.
869
872
  */
870
- changeProperties(id: string, props: PropertySet);
873
+ changeProperties(id: string, props: PropertySet): void;
871
874
  /**
872
875
  * Changes the endpoints of an existing interval.
876
+ * @deprecated - call change with the start and end parameters encapsulated in an object
873
877
  * @param id - Id of the interval to change
874
878
  * @param start - New start value. To leave the endpoint unchanged, pass the current value.
875
879
  * @param end - New end value. To leave the endpoint unchanged, pass the current value.
876
880
  * @returns the interval that was changed, if it existed in the collection.
877
881
  */
878
882
  change(id: string, start: SequencePlace, end: SequencePlace): TInterval | undefined;
883
+ /**
884
+ * Changes the endpoints, properties, or both of an existing interval.
885
+ * @param id - Id of the Interval to change
886
+ * @returns the interval that was changed, if it existed in the collection.
887
+ * Pass the desired new start position, end position, and/or properties in an object. Start and end positions must be changed
888
+ * simultaneously - they must either both be specified or both undefined. To only change the properties, leave both endpoints
889
+ * undefined. To only change the endpoints, leave the properties undefined.
890
+ */
891
+ change(
892
+ id: string,
893
+ { start, end, props }: { start?: SequencePlace; end?: SequencePlace; props?: PropertySet },
894
+ ): TInterval | undefined;
879
895
 
880
896
  attachDeserializer(onDeserialize: DeserializeCallback): void;
881
897
  /**
@@ -919,6 +935,14 @@ export interface IIntervalCollection<TInterval extends ISerializableInterval>
919
935
  ): void;
920
936
 
921
937
  /**
938
+ * @deprecated - Users must manually attach the corresponding interval index to utilize this functionality, for instance:
939
+ *
940
+ * ```typescript
941
+ * const overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString);
942
+ * collection.attachIndex(overlappingIntervalsIndex)
943
+ * const result = overlappingIntervalsIndex.findOverlappingIntervals(start, end);
944
+ * ```
945
+ *
922
946
  * @returns an array of all intervals in this collection that overlap with the interval
923
947
  * `[startPosition, endPosition]`.
924
948
  */
@@ -929,8 +953,29 @@ export interface IIntervalCollection<TInterval extends ISerializableInterval>
929
953
  */
930
954
  map(fn: (interval: TInterval) => void): void;
931
955
 
956
+ /**
957
+ * @deprecated - due to the forthcoming change where the endpointIndex will no longer be
958
+ * automatically added to the collection. Users are advised to independently attach the
959
+ * index to the collection and utilize the API accordingly, for instance:
960
+ * ```typescript
961
+ * const endpointIndex = createEndpointIndex(sharedString);
962
+ * collection.attachIndex(endpointIndex);
963
+ * const result1 = endpointIndex.previousInterval(pos);
964
+ * ```
965
+ * If an index is used repeatedly, applications should generally attach it once and store it in memory.
966
+ */
932
967
  previousInterval(pos: number): TInterval | undefined;
933
968
 
969
+ /**
970
+ * @deprecated - due to the forthcoming change where the endpointIndex will no longer be
971
+ * automatically added to the collection. Users are advised to independently attach the
972
+ * index to the collection and utilize the API accordingly, for instance:
973
+ * ```typescript
974
+ * const endpointIndex = createEndpointIndex(sharedString);
975
+ * collection.attachIndex(endpointIndex);
976
+ * const result2 = endpointIndex.nextInterval(pos);
977
+ * ```
978
+ */
934
979
  nextInterval(pos: number): TInterval | undefined;
935
980
  }
936
981
 
@@ -1359,70 +1404,83 @@ export class IntervalCollection<TInterval extends ISerializableInterval>
1359
1404
 
1360
1405
  /**
1361
1406
  * {@inheritdoc IIntervalCollection.changeProperties}
1407
+ * @deprecated - call change with the id and an object containing the new props values
1362
1408
  */
1363
1409
  public changeProperties(id: string, props: PropertySet) {
1364
- if (!this.attached) {
1365
- throw new LoggingError("Attach must be called before accessing intervals");
1366
- }
1367
- if (typeof id !== "string") {
1368
- throw new LoggingError("Change API requires an ID that is a string");
1369
- }
1370
- if (!props) {
1371
- throw new LoggingError("changeProperties should be called with a property set");
1372
- }
1373
- // prevent the overwriting of an interval label, it should remain unchanged
1374
- // once it has been inserted into the collection.
1375
- if (props[reservedRangeLabelsKey] !== undefined) {
1376
- throw new LoggingError(
1377
- "The label property should not be modified once inserted to the collection",
1378
- );
1379
- }
1380
-
1381
- const interval = this.getIntervalById(id);
1382
- if (interval) {
1383
- const deltaProps = interval.addProperties(
1384
- props,
1385
- true,
1386
- this.isCollaborating ? UnassignedSequenceNumber : UniversalSequenceNumber,
1387
- );
1388
- const serializedInterval: ISerializedInterval = interval.serialize();
1389
-
1390
- // Emit a change op that will only change properties. Add the ID to
1391
- // the property bag provided by the caller.
1392
- serializedInterval.start = undefined as any;
1393
- serializedInterval.end = undefined as any;
1394
-
1395
- serializedInterval.properties = props;
1396
- serializedInterval.properties[reservedIntervalIdKey] = interval.getIntervalId();
1397
- const localSeq = this.getNextLocalSeq();
1398
- this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
1399
- this.emitter.emit("change", undefined, serializedInterval, { localSeq });
1400
- this.emit("propertyChanged", interval, deltaProps, true, undefined);
1401
- }
1410
+ this.change(id, { props });
1402
1411
  }
1403
1412
 
1413
+ /**
1414
+ * {@inheritdoc IIntervalCollection.change}
1415
+ * @deprecated - call change with the id and an object containing the new start, end, and/or props values
1416
+ */
1417
+ public change(id: string, start: SequencePlace, end: SequencePlace): TInterval | undefined;
1404
1418
  /**
1405
1419
  * {@inheritdoc IIntervalCollection.change}
1406
1420
  */
1407
- public change(id: string, start: SequencePlace, end: SequencePlace) {
1421
+ public change(
1422
+ id: string,
1423
+ { start, end, props }: { start?: SequencePlace; end?: SequencePlace; props?: PropertySet },
1424
+ ): TInterval | undefined;
1425
+ public change(
1426
+ arg1: string,
1427
+ arg2: SequencePlace | { start?: SequencePlace; end?: SequencePlace; props?: PropertySet },
1428
+ arg3?: SequencePlace,
1429
+ ): TInterval | undefined {
1430
+ const id: string = arg1;
1431
+ let start: SequencePlace | undefined;
1432
+ let end: SequencePlace | undefined;
1433
+ let props: PropertySet | undefined;
1434
+ if (isSequencePlace(arg2)) {
1435
+ start = arg2;
1436
+ end = arg3;
1437
+ } else {
1438
+ start = arg2.start;
1439
+ end = arg2.end;
1440
+ props = arg2.props;
1441
+ }
1442
+
1408
1443
  if (!this.localCollection) {
1409
1444
  throw new LoggingError("Attach must be called before accessing intervals");
1410
1445
  }
1411
1446
 
1412
1447
  // Force id to be a string.
1413
1448
  if (typeof id !== "string") {
1414
- throw new LoggingError("Change API requires an ID that is a string");
1449
+ throw new UsageError("Change API requires an ID that is a string");
1450
+ }
1451
+
1452
+ // Ensure that both start and end are defined or both are undefined.
1453
+ if ((start === undefined) !== (end === undefined)) {
1454
+ throw new UsageError(
1455
+ "Change API requires both start and end to be defined or undefined",
1456
+ );
1457
+ }
1458
+
1459
+ // prevent the overwriting of an interval label, it should remain unchanged
1460
+ // once it has been inserted into the collection.
1461
+ if (props?.[reservedRangeLabelsKey] !== undefined) {
1462
+ throw new UsageError(
1463
+ "The label property should not be modified once inserted to the collection",
1464
+ );
1415
1465
  }
1416
1466
 
1417
1467
  const interval = this.getIntervalById(id);
1418
1468
  if (interval) {
1419
- const newInterval = this.localCollection.changeInterval(interval, start, end);
1420
- if (!newInterval) {
1421
- return undefined;
1469
+ let deltaProps: PropertySet | undefined;
1470
+ let newInterval: TInterval | undefined;
1471
+ if (props !== undefined) {
1472
+ deltaProps = interval.addProperties(
1473
+ props,
1474
+ true,
1475
+ this.isCollaborating ? UnassignedSequenceNumber : UniversalSequenceNumber,
1476
+ );
1422
1477
  }
1423
- if (!this.isCollaborating && newInterval instanceof SequenceInterval) {
1424
- setSlideOnRemove(newInterval.start);
1425
- setSlideOnRemove(newInterval.end);
1478
+ if (start !== undefined && end !== undefined) {
1479
+ newInterval = this.localCollection.changeInterval(interval, start, end);
1480
+ if (!this.isCollaborating && newInterval instanceof SequenceInterval) {
1481
+ setSlideOnRemove(newInterval.start);
1482
+ setSlideOnRemove(newInterval.end);
1483
+ }
1426
1484
  }
1427
1485
  const serializedInterval: SerializedIntervalDelta = interval.serialize();
1428
1486
  const { startPos, startSide, endPos, endSide } = endpointPosAndSide(start, end);
@@ -1432,15 +1490,21 @@ export class IntervalCollection<TInterval extends ISerializableInterval>
1432
1490
  serializedInterval.startSide = startSide;
1433
1491
  serializedInterval.endSide = endSide;
1434
1492
  serializedInterval.stickiness = stickiness;
1435
- // Emit a property bag containing only the ID, as we don't intend for this op to change any properties.
1493
+ // Emit a property bag containing the ID and the other (if any) properties changed
1436
1494
  serializedInterval.properties = {
1437
1495
  [reservedIntervalIdKey]: interval.getIntervalId(),
1496
+ ...props,
1438
1497
  };
1439
1498
  const localSeq = this.getNextLocalSeq();
1440
1499
  this.localSeqToSerializedInterval.set(localSeq, serializedInterval);
1441
1500
  this.emitter.emit("change", undefined, serializedInterval, { localSeq });
1442
- this.addPendingChange(id, serializedInterval);
1443
- this.emitChange(newInterval, interval, true, false);
1501
+ if (deltaProps !== undefined) {
1502
+ this.emit("propertyChanged", interval, deltaProps, true, undefined);
1503
+ }
1504
+ if (newInterval) {
1505
+ this.addPendingChange(id, serializedInterval);
1506
+ this.emitChange(newInterval, interval, true, false);
1507
+ }
1444
1508
  return newInterval;
1445
1509
  }
1446
1510
  // No interval to change
@@ -1867,7 +1931,7 @@ export class IntervalCollection<TInterval extends ISerializableInterval>
1867
1931
  ): void {
1868
1932
  if (local) {
1869
1933
  // Local ops were applied when the message was created and there's no "pending delete"
1870
- // state to bookkeep: remote operation application takes into account possibility of
1934
+ // state to book keep: remote operation application takes into account possibility of
1871
1935
  // locally deleted interval whenever a lookup happens.
1872
1936
  return;
1873
1937
  }
@@ -2032,7 +2096,7 @@ function setSlideOnRemove(lref: LocalReferencePosition) {
2032
2096
 
2033
2097
  /**
2034
2098
  * Information that identifies an interval within a `Sequence`.
2035
- * @public
2099
+ * @internal
2036
2100
  */
2037
2101
  export interface IntervalLocator {
2038
2102
  /**
@@ -2050,7 +2114,7 @@ export interface IntervalLocator {
2050
2114
  * @returns undefined if the reference position is not the endpoint of any interval (e.g. it was created
2051
2115
  * on the merge tree directly by app code), otherwise an {@link IntervalLocator} for the interval this
2052
2116
  * endpoint is a part of.
2053
- * @public
2117
+ * @internal
2054
2118
  */
2055
2119
  export function intervalLocatorFromEndpoint(
2056
2120
  potentialEndpoint: LocalReferencePosition,
@@ -20,7 +20,7 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
20
20
  * Collection of intervals.
21
21
  *
22
22
  * Provide additional APIs to support efficiently querying a collection of intervals whose endpoints fall within a specified range.
23
- * @public
23
+ * @internal
24
24
  */
25
25
  export interface IEndpointInRangeIndex<TInterval extends ISerializableInterval>
26
26
  extends IntervalIndex<TInterval> {
@@ -106,7 +106,7 @@ export class EndpointInRangeIndex<TInterval extends ISerializableInterval>
106
106
  }
107
107
 
108
108
  /**
109
- * @public
109
+ * @internal
110
110
  */
111
111
  export function createEndpointInRangeIndex(
112
112
  sharedString: SharedString,
@@ -16,7 +16,7 @@ import { SharedString } from "../sharedString";
16
16
  import { IntervalIndex } from "./intervalIndex";
17
17
 
18
18
  /**
19
- * @public
19
+ * @internal
20
20
  */
21
21
  export interface IEndpointIndex<TInterval extends ISerializableInterval>
22
22
  extends IntervalIndex<TInterval> {
@@ -83,7 +83,7 @@ export class EndpointIndex<TInterval extends ISerializableInterval>
83
83
  }
84
84
 
85
85
  /**
86
- * @public
86
+ * @internal
87
87
  */
88
88
  export function createEndpointIndex(sharedString: SharedString): IEndpointIndex<SequenceInterval> {
89
89
  const client = (sharedString as unknown as { client: Client }).client;
@@ -10,7 +10,7 @@ import { IntervalIndex } from "./intervalIndex";
10
10
  const reservedIntervalIdKey = "intervalId";
11
11
 
12
12
  /**
13
- * @public
13
+ * @internal
14
14
  */
15
15
  export interface IIdIntervalIndex<TInterval extends ISerializableInterval>
16
16
  extends IntervalIndex<TInterval>,
@@ -55,7 +55,7 @@ class IdIntervalIndex<TInterval extends ISerializableInterval>
55
55
  }
56
56
 
57
57
  /**
58
- * @public
58
+ * @internal
59
59
  */
60
60
  export function createIdIntervalIndex<
61
61
  TInterval extends ISerializableInterval,
@@ -13,7 +13,7 @@ import { ISerializableInterval } from "../intervals";
13
13
  * - "find all intervals with start endpoint between these two points"
14
14
  * - "find all intervals which overlap this range"
15
15
  * etc.
16
- * @public
16
+ * @alpha
17
17
  */
18
18
  export interface IntervalIndex<TInterval extends ISerializableInterval> {
19
19
  /**
@@ -18,7 +18,7 @@ import { SequencePlace, endpointPosAndSide } from "../intervalCollection";
18
18
  import { IntervalIndex } from "./intervalIndex";
19
19
 
20
20
  /**
21
- * @public
21
+ * @internal
22
22
  */
23
23
  export interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>
24
24
  extends IntervalIndex<TInterval> {
@@ -177,7 +177,7 @@ export class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>
177
177
  }
178
178
 
179
179
  /**
180
- * @public
180
+ * @internal
181
181
  */
182
182
  export function createOverlappingIntervalsIndex(
183
183
  sharedString: SharedString,
@@ -70,7 +70,7 @@ class OverlappingSequenceIntervalsIndex
70
70
  }
71
71
 
72
72
  /**
73
- * @public
73
+ * @internal
74
74
  */
75
75
  export function createOverlappingSequenceIntervalsIndex(
76
76
  sharedString: SharedString,
@@ -10,7 +10,7 @@ import { IOverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
10
10
  /**
11
11
  * This namespace contains specialiazations of indexes which support spatial queries
12
12
  * specifically for `SequenceInterval`s.
13
- * @public
13
+ * @internal
14
14
  */
15
15
  // eslint-disable-next-line @typescript-eslint/no-namespace
16
16
  export namespace SequenceIntervalIndexes {
@@ -18,6 +18,7 @@ export namespace SequenceIntervalIndexes {
18
18
  * Collection of intervals.
19
19
  *
20
20
  * Provides additional APIs to support efficiently querying a collection of intervals based on segments and offset.
21
+ * @internal
21
22
  */
22
23
  export interface Overlapping extends IOverlappingIntervalsIndex<SequenceInterval> {
23
24
  /**
@@ -20,7 +20,7 @@ import { HasComparisonOverride, compareOverrideables, forceCompare } from "./int
20
20
  * Collection of intervals.
21
21
  *
22
22
  * Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.
23
- * @public
23
+ * @internal
24
24
  */
25
25
  export interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>
26
26
  extends IntervalIndex<TInterval> {
@@ -104,7 +104,7 @@ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
104
104
  }
105
105
  }
106
106
  /**
107
- * @public
107
+ * @internal
108
108
  */
109
109
  export function createStartpointInRangeIndex(
110
110
  sharedString: SharedString,
@@ -4,7 +4,6 @@
4
4
  */
5
5
 
6
6
  import {
7
- IIntegerRange,
8
7
  RBNode,
9
8
  IRBAugmentation,
10
9
  IRBMatcher,
@@ -17,8 +16,6 @@ export interface AugmentedIntervalNode {
17
16
  minmax: IInterval;
18
17
  }
19
18
 
20
- export const integerRangeToString = (range: IIntegerRange) => `[${range.start},${range.end})`;
21
-
22
19
  const intervalComparer = (a: IInterval, b: IInterval) => a.compare(b);
23
20
 
24
21
  export type IntervalNode<T extends IInterval> = RBNode<T, AugmentedIntervalNode>;
@@ -5,7 +5,6 @@
5
5
  /* eslint-disable import/no-deprecated */
6
6
 
7
7
  import {
8
- ICombiningOp,
9
8
  PropertiesManager,
10
9
  PropertySet,
11
10
  createMap,
@@ -21,28 +20,27 @@ const reservedIntervalIdKey = "intervalId";
21
20
 
22
21
  /**
23
22
  * Serializable interval whose endpoints are plain-old numbers.
24
- * @public
23
+ * @internal
25
24
  */
26
25
  export class Interval implements ISerializableInterval {
27
26
  /**
28
27
  * {@inheritDoc ISerializableInterval.properties}
29
28
  */
30
- public properties: PropertySet;
31
- /** @internal */
29
+ public properties: PropertySet = createMap<any>();
30
+
31
+ /***/
32
32
  public auxProps: PropertySet[] | undefined;
33
+
33
34
  /**
34
35
  * {@inheritDoc ISerializableInterval.propertyManager}
35
- * @internal
36
36
  */
37
- public propertyManager: PropertiesManager;
37
+ public readonly propertyManager: PropertiesManager = new PropertiesManager();
38
+
38
39
  constructor(
39
40
  public start: number,
40
41
  public end: number,
41
42
  props?: PropertySet,
42
43
  ) {
43
- this.propertyManager = new PropertiesManager();
44
- this.properties = {};
45
-
46
44
  if (props) {
47
45
  this.addProperties(props);
48
46
  }
@@ -81,7 +79,6 @@ export class Interval implements ISerializableInterval {
81
79
 
82
80
  /**
83
81
  * {@inheritDoc ISerializableInterval.serialize}
84
- * @internal
85
82
  */
86
83
  public serialize(): ISerializedInterval {
87
84
  const serializedInterval: ISerializedInterval = {
@@ -152,7 +149,6 @@ export class Interval implements ISerializableInterval {
152
149
 
153
150
  /**
154
151
  * {@inheritDoc IInterval.union}
155
- * @internal
156
152
  */
157
153
  public union(b: Interval) {
158
154
  return new Interval(
@@ -168,20 +164,16 @@ export class Interval implements ISerializableInterval {
168
164
 
169
165
  /**
170
166
  * {@inheritDoc ISerializableInterval.addProperties}
171
- * @internal
172
167
  */
173
168
  public addProperties(
174
169
  newProps: PropertySet,
175
170
  collaborating: boolean = false,
176
171
  seq?: number,
177
- op?: ICombiningOp,
178
172
  ): PropertySet | undefined {
179
173
  if (newProps) {
180
- this.initializeProperties();
181
174
  return this.propertyManager.addProperties(
182
175
  this.properties,
183
176
  newProps,
184
- op,
185
177
  seq,
186
178
  collaborating,
187
179
  );
@@ -190,7 +182,6 @@ export class Interval implements ISerializableInterval {
190
182
 
191
183
  /**
192
184
  * {@inheritDoc IInterval.modify}
193
- * @internal
194
185
  */
195
186
  public modify(
196
187
  label: string,
@@ -213,7 +204,6 @@ export class Interval implements ISerializableInterval {
213
204
  }
214
205
  const newInterval = new Interval(startPos, endPos);
215
206
  if (this.properties) {
216
- newInterval.initializeProperties();
217
207
  this.propertyManager.copyTo(
218
208
  this.properties,
219
209
  newInterval.properties,
@@ -222,15 +212,6 @@ export class Interval implements ISerializableInterval {
222
212
  }
223
213
  return newInterval;
224
214
  }
225
-
226
- private initializeProperties(): void {
227
- if (!this.propertyManager) {
228
- this.propertyManager = new PropertiesManager();
229
- }
230
- if (!this.properties) {
231
- this.properties = createMap<any>();
232
- }
233
- }
234
215
  }
235
216
 
236
217
  export function createInterval(label: string, start: SequencePlace, end: SequencePlace): Interval {