@fluidframework/merge-tree 0.59.3000-66610 → 0.59.3000-67119

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 (61) hide show
  1. package/dist/client.d.ts +11 -2
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +21 -1
  4. package/dist/client.js.map +1 -1
  5. package/dist/collections.d.ts +7 -1
  6. package/dist/collections.d.ts.map +1 -1
  7. package/dist/collections.js +27 -1
  8. package/dist/collections.js.map +1 -1
  9. package/dist/localReference.d.ts +46 -8
  10. package/dist/localReference.d.ts.map +1 -1
  11. package/dist/localReference.js +92 -61
  12. package/dist/localReference.js.map +1 -1
  13. package/dist/mergeTree.d.ts +3 -0
  14. package/dist/mergeTree.d.ts.map +1 -1
  15. package/dist/mergeTree.js +28 -9
  16. package/dist/mergeTree.js.map +1 -1
  17. package/dist/referencePositions.d.ts +1 -0
  18. package/dist/referencePositions.d.ts.map +1 -1
  19. package/dist/referencePositions.js +8 -5
  20. package/dist/referencePositions.js.map +1 -1
  21. package/dist/snapshotlegacy.js +1 -1
  22. package/dist/snapshotlegacy.js.map +1 -1
  23. package/dist/sortedSegmentSet.js +1 -1
  24. package/dist/sortedSegmentSet.js.map +1 -1
  25. package/dist/textSegment.js +3 -2
  26. package/dist/textSegment.js.map +1 -1
  27. package/lib/client.d.ts +11 -2
  28. package/lib/client.d.ts.map +1 -1
  29. package/lib/client.js +21 -1
  30. package/lib/client.js.map +1 -1
  31. package/lib/collections.d.ts +7 -1
  32. package/lib/collections.d.ts.map +1 -1
  33. package/lib/collections.js +26 -1
  34. package/lib/collections.js.map +1 -1
  35. package/lib/localReference.d.ts +46 -8
  36. package/lib/localReference.d.ts.map +1 -1
  37. package/lib/localReference.js +93 -62
  38. package/lib/localReference.js.map +1 -1
  39. package/lib/mergeTree.d.ts +3 -0
  40. package/lib/mergeTree.d.ts.map +1 -1
  41. package/lib/mergeTree.js +29 -10
  42. package/lib/mergeTree.js.map +1 -1
  43. package/lib/referencePositions.d.ts +1 -0
  44. package/lib/referencePositions.d.ts.map +1 -1
  45. package/lib/referencePositions.js +6 -4
  46. package/lib/referencePositions.js.map +1 -1
  47. package/lib/snapshotlegacy.js +1 -1
  48. package/lib/snapshotlegacy.js.map +1 -1
  49. package/lib/sortedSegmentSet.js +1 -1
  50. package/lib/sortedSegmentSet.js.map +1 -1
  51. package/lib/textSegment.js +3 -2
  52. package/lib/textSegment.js.map +1 -1
  53. package/package.json +87 -9
  54. package/src/client.ts +27 -3
  55. package/src/collections.ts +29 -2
  56. package/src/localReference.ts +124 -67
  57. package/src/mergeTree.ts +36 -9
  58. package/src/referencePositions.ts +7 -3
  59. package/src/snapshotlegacy.ts +1 -1
  60. package/src/sortedSegmentSet.ts +1 -1
  61. package/src/textSegment.ts +2 -2
@@ -5,12 +5,14 @@
5
5
 
6
6
  import { assert } from "@fluidframework/common-utils";
7
7
  import { Client } from "./client";
8
+ import { List, ListMakeHead, ListRemoveEntry } from "./collections";
8
9
  import {
9
10
  ISegment,
10
11
  } from "./mergeTree";
11
12
  import { ICombiningOp, ReferenceType } from "./ops";
12
13
  import { addProperties, PropertySet } from "./properties";
13
- import { minReferencePosition,
14
+ import {
15
+ minReferencePosition,
14
16
  maxReferencePosition,
15
17
  compareReferencePositions,
16
18
  refHasTileLabels,
@@ -20,12 +22,13 @@ import { minReferencePosition,
20
22
  refGetTileLabels,
21
23
  refHasRangeLabel,
22
24
  refHasTileLabel,
25
+ refTypeIncludesFlag,
23
26
  } from "./referencePositions";
24
27
 
25
28
  /**
26
29
  * @deprecated - Use ReferencePosition
27
30
  */
28
- export class LocalReference implements ReferencePosition {
31
+ export class LocalReference implements ReferencePosition {
29
32
  /**
30
33
  * @deprecated - use DetachedReferencePosition
31
34
  */
@@ -50,7 +53,7 @@ import { minReferencePosition,
50
53
  /**
51
54
  * @deprecated - use getOffset
52
55
  */
53
- public offset = 0,
56
+ public offset: number = 0,
54
57
  public refType = ReferenceType.Simple,
55
58
  properties?: PropertySet,
56
59
  ) {
@@ -81,23 +84,19 @@ import { minReferencePosition,
81
84
  * @deprecated - use getLocalReferencePosition
82
85
  */
83
86
  public toPosition() {
84
- if (this.segment && this.segment.parent) {
85
- return this.getOffset() + this.client.getPosition(this.segment);
86
- } else {
87
- return LocalReference.DetachedPosition;
88
- }
87
+ return this.getClient().localReferencePositionToPosition(this);
89
88
  }
90
89
 
91
90
  /**
92
91
  * @deprecated - use refHasTileLabels
93
92
  */
94
- public hasTileLabels() {
93
+ public hasTileLabels(): boolean {
95
94
  return refHasTileLabels(this);
96
95
  }
97
96
  /**
98
97
  * @deprecated - use refHasRangeLabels
99
98
  */
100
- public hasRangeLabels() {
99
+ public hasRangeLabels(): boolean {
101
100
  return refHasRangeLabels(this);
102
101
  }
103
102
  /**
@@ -157,13 +156,17 @@ import { minReferencePosition,
157
156
  }
158
157
 
159
158
  interface IRefsAtOffset {
160
- before?: LocalReference[];
161
- at?: LocalReference[];
162
- after?: LocalReference[];
159
+ before?: List<LocalReference>;
160
+ at?: List<LocalReference>;
161
+ after?: List<LocalReference>;
162
+ }
163
+
164
+ function assertLocalReferences(lref: ReferencePosition | LocalReference): asserts lref is LocalReference {
165
+ assert(lref instanceof LocalReference, 0x2e0 /* "lref not a Local Reference" */);
163
166
  }
164
167
 
165
168
  /**
166
- * Represents a collection of {@link LocalReference}s associated with one segment in a merge-tree.
169
+ * Represents a collection of {@link ReferencePosition}s associated with one segment in a merge-tree.
167
170
  */
168
171
  export class LocalReferenceCollection {
169
172
  public static append(seg1: ISegment, seg2: ISegment) {
@@ -181,10 +184,18 @@ export class LocalReferenceCollection {
181
184
  }
182
185
  }
183
186
 
187
+ /**
188
+ *
189
+ * @internal - this method should only be called by mergeTree
190
+ */
184
191
  public hierRefCount: number = 0;
185
192
  private readonly refsByOffset: (IRefsAtOffset | undefined)[];
186
193
  private refCount: number = 0;
187
194
 
195
+ /**
196
+ *
197
+ * @internal - this method should only be called by mergeTree
198
+ */
188
199
  constructor(
189
200
  /** Segment this `LocalReferenceCollection` is associated to. */
190
201
  private readonly segment: ISegment,
@@ -195,6 +206,10 @@ export class LocalReferenceCollection {
195
206
  this.refsByOffset = initialRefsByfOffset;
196
207
  }
197
208
 
209
+ /**
210
+ *
211
+ * @internal - this method should only be called by mergeTree
212
+ */
198
213
  public [Symbol.iterator]() {
199
214
  const subiterators: IterableIterator<LocalReference>[] = [];
200
215
  for (const refs of this.refsByOffset) {
@@ -231,16 +246,20 @@ export class LocalReferenceCollection {
231
246
  return iterator;
232
247
  }
233
248
 
249
+ /**
250
+ *
251
+ * @internal - this method should only be called by mergeTree
252
+ */
234
253
  public clear() {
235
254
  this.refCount = 0;
236
255
  this.hierRefCount = 0;
237
- const detachSegments = (refs: LocalReference[] | undefined) => {
256
+ const detachSegments = (refs: List<LocalReference> | undefined) => {
238
257
  if (refs) {
239
- refs.forEach((r) => {
258
+ for (const r of refs) {
240
259
  if (r.segment === this.segment) {
241
260
  r.segment = undefined;
242
261
  }
243
- });
262
+ }
244
263
  }
245
264
  };
246
265
  for (let i = 0; i < this.refsByOffset.length; i++) {
@@ -254,41 +273,80 @@ export class LocalReferenceCollection {
254
273
  }
255
274
  }
256
275
 
276
+ /**
277
+ *
278
+ * @internal - this method should only be called by mergeTree
279
+ */
257
280
  public get empty() {
258
281
  return this.refCount === 0;
259
282
  }
260
283
 
261
- public addLocalRef(lref: LocalReference) {
262
- const refsAtOffset = this.refsByOffset[lref.offset];
263
- if (refsAtOffset === undefined) {
264
- this.refsByOffset[lref.offset] = {
265
- at: [lref],
266
- };
267
- } else if (refsAtOffset.at === undefined) {
268
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
269
- this.refsByOffset[lref.offset]!.at = [lref];
270
- } else {
271
- refsAtOffset.at.push(lref);
284
+ /**
285
+ *
286
+ * @internal - this method should only be called by mergeTree
287
+ */
288
+ public createLocalRef(
289
+ offset: number,
290
+ refType: ReferenceType,
291
+ properties: PropertySet | undefined,
292
+ client: Client): ReferencePosition {
293
+ const ref = new LocalReference(
294
+ client,
295
+ this.segment,
296
+ offset,
297
+ refType,
298
+ properties,
299
+ );
300
+ if (!refTypeIncludesFlag(ref, ReferenceType.Transient)) {
301
+ this.addLocalRef(ref);
272
302
  }
303
+ return ref;
304
+ }
273
305
 
274
- if (lref.hasRangeLabels() || lref.hasTileLabels()) {
306
+ /**
307
+ *
308
+ * @internal - this method should only be called by mergeTree
309
+ */
310
+ public addLocalRef(lref: LocalReference | ReferencePosition) {
311
+ assert(
312
+ !refTypeIncludesFlag(lref, ReferenceType.Transient),
313
+ 0x2df /* "transient references cannot be bound to segments" */);
314
+ assertLocalReferences(lref);
315
+ const refsAtOffset = this.refsByOffset[lref.getOffset()] =
316
+ this.refsByOffset[lref.getOffset()]
317
+ ?? { at: ListMakeHead() };
318
+ const atRefs = refsAtOffset.at =
319
+ refsAtOffset.at
320
+ ?? ListMakeHead();
321
+
322
+ atRefs.enqueue(lref);
323
+
324
+ if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
275
325
  this.hierRefCount++;
276
326
  }
277
327
  this.refCount++;
278
328
  }
279
329
 
280
- public removeLocalRef(lref: LocalReference) {
281
- const tryRemoveRef = (refs: LocalReference[] | undefined) => {
330
+ /**
331
+ *
332
+ * @internal - this method should only be called by mergeTree
333
+ */
334
+ public removeLocalRef(lref: LocalReference | ReferencePosition) {
335
+ assertLocalReferences(lref);
336
+ const tryRemoveRef = (refs: List<LocalReference> | undefined) => {
282
337
  if (refs) {
283
- const index = refs.indexOf(lref);
284
- if (index >= 0) {
285
- refs.splice(index, 1);
286
- if (lref.hasRangeLabels() || lref.hasTileLabels()) {
287
- this.hierRefCount--;
338
+ let node = refs;
339
+ do {
340
+ node = node.next;
341
+ if (node.data === lref) {
342
+ ListRemoveEntry(node);
343
+ if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
344
+ this.hierRefCount--;
345
+ }
346
+ this.refCount--;
347
+ return lref;
288
348
  }
289
- this.refCount--;
290
- return lref;
291
- }
349
+ } while (!node.isHead);
292
350
  }
293
351
  };
294
352
  const refAtOffset = this.refsByOffset[lref.offset];
@@ -311,6 +369,8 @@ export class LocalReferenceCollection {
311
369
  }
312
370
 
313
371
  /**
372
+ * @internal - this method should only be called by mergeTree
373
+ *
314
374
  * Called by 'append()' implementations to append local refs from the given 'other' segment to the
315
375
  * end of 'this' segment.
316
376
  *
@@ -334,6 +394,8 @@ export class LocalReferenceCollection {
334
394
  }
335
395
 
336
396
  /**
397
+ * @internal - this method should only be called by mergeTree
398
+ *
337
399
  * Splits this `LocalReferenceCollection` into the intervals [0, offset) and [offset, originalLength).
338
400
  * Local references in the former half of this split will remain associated with the segment used on construction.
339
401
  * Local references in the latter half of this split will be transferred to `splitSeg`,
@@ -353,7 +415,7 @@ export class LocalReferenceCollection {
353
415
  for (const lref of localRefs) {
354
416
  lref.segment = splitSeg;
355
417
  lref.offset -= offset;
356
- if (lref.hasRangeLabels() || lref.hasTileLabels()) {
418
+ if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
357
419
  this.hierRefCount--;
358
420
  localRefs.hierRefCount++;
359
421
  }
@@ -366,17 +428,17 @@ export class LocalReferenceCollection {
366
428
  }
367
429
  }
368
430
 
369
- public addBeforeTombstones(...refs: Iterable<LocalReference>[]) {
370
- const beforeRefs: LocalReference[] = [];
431
+ public addBeforeTombstones(...refs: Iterable<LocalReference | ReferencePosition>[]) {
432
+ const beforeRefs = this.refsByOffset[0]?.before ?? ListMakeHead();
371
433
 
372
434
  for (const iterable of refs) {
373
435
  for (const lref of iterable) {
374
- // eslint-disable-next-line no-bitwise
375
- if (lref.refType & ReferenceType.SlideOnRemove) {
436
+ assertLocalReferences(lref);
437
+ if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {
376
438
  beforeRefs.push(lref);
377
439
  lref.segment = this.segment;
378
440
  lref.offset = 0;
379
- if (lref.hasRangeLabels() || lref.hasTileLabels()) {
441
+ if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
380
442
  this.hierRefCount++;
381
443
  }
382
444
  this.refCount++;
@@ -385,28 +447,27 @@ export class LocalReferenceCollection {
385
447
  }
386
448
  }
387
449
  }
388
- if (beforeRefs.length > 0) {
389
- if (this.refsByOffset[0] === undefined) {
390
- this.refsByOffset[0] = { before: beforeRefs };
391
- } else if (this.refsByOffset[0].before === undefined) {
392
- this.refsByOffset[0].before = beforeRefs;
393
- } else {
394
- this.refsByOffset[0].before.unshift(...beforeRefs);
395
- }
450
+ if (!beforeRefs.empty() && this.refsByOffset[0]?.before === undefined) {
451
+ const refsAtOffset = this.refsByOffset[0] =
452
+ this.refsByOffset[0]
453
+ ?? { before: beforeRefs };
454
+ refsAtOffset.before = refsAtOffset.before ?? beforeRefs;
396
455
  }
397
456
  }
398
457
 
399
- public addAfterTombstones(...refs: Iterable<LocalReference>[]) {
400
- const afterRefs: LocalReference[] = [];
458
+ public addAfterTombstones(...refs: Iterable<LocalReference | ReferencePosition>[]) {
459
+ const lastOffset = this.refsByOffset.length - 1;
460
+ const afterRefs =
461
+ this.refsByOffset[lastOffset]?.after ?? ListMakeHead();
401
462
 
402
463
  for (const iterable of refs) {
403
464
  for (const lref of iterable) {
404
- // eslint-disable-next-line no-bitwise
405
- if (lref.refType & ReferenceType.SlideOnRemove) {
465
+ assertLocalReferences(lref);
466
+ if (refTypeIncludesFlag(lref, ReferenceType.SlideOnRemove)) {
406
467
  afterRefs.push(lref);
407
468
  lref.segment = this.segment;
408
469
  lref.offset = this.segment.cachedLength - 1;
409
- if (lref.hasRangeLabels() || lref.hasTileLabels()) {
470
+ if (refHasRangeLabels(lref) || refHasTileLabels(lref)) {
410
471
  this.hierRefCount++;
411
472
  }
412
473
  this.refCount++;
@@ -415,15 +476,11 @@ export class LocalReferenceCollection {
415
476
  }
416
477
  }
417
478
  }
418
- if (afterRefs.length > 0) {
419
- const refsAtOffset = this.refsByOffset[this.segment.cachedLength - 1];
420
- if (refsAtOffset === undefined) {
421
- this.refsByOffset[this.segment.cachedLength - 1] = { after: afterRefs };
422
- } else if (refsAtOffset.after === undefined) {
423
- refsAtOffset.after = afterRefs;
424
- } else {
425
- refsAtOffset.after.push(...afterRefs);
426
- }
479
+ if (!afterRefs.empty() && this.refsByOffset[lastOffset]?.after === undefined) {
480
+ const refsAtOffset = this.refsByOffset[lastOffset] =
481
+ this.refsByOffset[lastOffset]
482
+ ?? { after: afterRefs };
483
+ refsAtOffset.after = refsAtOffset.after ?? afterRefs;
427
484
  }
428
485
  }
429
486
  }
package/src/mergeTree.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
7
7
  /* eslint-disable @typescript-eslint/consistent-type-assertions */
8
8
 
9
- /* eslint-disable no-bitwise */
9
+ /* eslint-disable @typescript-eslint/prefer-optional-chain, no-bitwise */
10
10
 
11
11
  import { assert } from "@fluidframework/common-utils";
12
12
  import {
@@ -51,6 +51,7 @@ import {
51
51
  PropertySet,
52
52
  } from "./properties";
53
53
  import {
54
+ refTypeIncludesFlag,
54
55
  RangeStackMap,
55
56
  ReferencePosition,
56
57
  refGetRangeLabels,
@@ -62,6 +63,7 @@ import {
62
63
  } from "./referencePositions";
63
64
  import { SegmentGroupCollection } from "./segmentGroupCollection";
64
65
  import { PropertiesManager } from "./segmentPropertiesManager";
66
+ import { Client } from "./client";
65
67
 
66
68
  export interface IMergeNodeCommon {
67
69
  parent?: IMergeBlock;
@@ -294,14 +296,14 @@ function applyStackDelta(currentStackMap: RangeStackMap, deltaStackMap: RangeSta
294
296
  }
295
297
 
296
298
  function applyRangeReference(stack: Stack<ReferencePosition>, delta: ReferencePosition) {
297
- if (delta.refType & ReferenceType.NestBegin) {
299
+ if (refTypeIncludesFlag(delta, ReferenceType.NestBegin)) {
298
300
  stack.push(delta);
299
301
  return true;
300
302
  } else {
301
303
  // Assume delta is end reference
302
304
  const top = stack.top();
303
305
  // TODO: match end with begin
304
- if (top && (top.refType & ReferenceType.NestBegin)) {
306
+ if (top && (refTypeIncludesFlag(top, ReferenceType.NestBegin))) {
305
307
  stack.pop();
306
308
  } else {
307
309
  stack.push(delta);
@@ -332,7 +334,7 @@ function addNodeReferences(
332
334
  if (markerId) {
333
335
  mergeTree.mapIdToSegment(markerId, segment);
334
336
  }
335
- if (segment.refType & ReferenceType.Tile) {
337
+ if (refTypeIncludesFlag(segment, ReferenceType.Tile)) {
336
338
  addTile(segment, rightmostTiles);
337
339
  addTileIfNotPresent(segment, leftmostTiles);
338
340
  }
@@ -349,7 +351,7 @@ function addNodeReferences(
349
351
  if (baseSegment.localRefs && (baseSegment.localRefs.hierRefCount !== undefined) &&
350
352
  (baseSegment.localRefs.hierRefCount > 0)) {
351
353
  for (const lref of baseSegment.localRefs) {
352
- if (lref.refType & ReferenceType.Tile) {
354
+ if (refTypeIncludesFlag(lref, ReferenceType.Tile)) {
353
355
  addTile(lref, rightmostTiles);
354
356
  addTileIfNotPresent(lref, leftmostTiles);
355
357
  }
@@ -725,16 +727,16 @@ export class Marker extends BaseSegment implements ReferencePosition {
725
727
 
726
728
  toString() {
727
729
  let bbuf = "";
728
- if (this.refType & ReferenceType.Tile) {
730
+ if (refTypeIncludesFlag(this, ReferenceType.Tile)) {
729
731
  bbuf += "Tile";
730
732
  }
731
- if (this.refType & ReferenceType.NestBegin) {
733
+ if (refTypeIncludesFlag(this, ReferenceType.NestBegin)) {
732
734
  if (bbuf.length > 0) {
733
735
  bbuf += "; ";
734
736
  }
735
737
  bbuf += "RangeBegin";
736
738
  }
737
- if (this.refType & ReferenceType.NestEnd) {
739
+ if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {
738
740
  if (bbuf.length > 0) {
739
741
  bbuf += "; ";
740
742
  }
@@ -759,7 +761,7 @@ export class Marker extends BaseSegment implements ReferencePosition {
759
761
  const rangeLabels = refGetRangeLabels(this);
760
762
  if (rangeLabels) {
761
763
  let rangeKind = "begin";
762
- if (this.refType & ReferenceType.NestEnd) {
764
+ if (refTypeIncludesFlag(this, ReferenceType.NestEnd)) {
763
765
  rangeKind = "end";
764
766
  }
765
767
  if (tileLabels) {
@@ -2442,6 +2444,31 @@ export class MergeTree {
2442
2444
  }
2443
2445
  }
2444
2446
 
2447
+ public removeLocalReferencePosition(lref: ReferencePosition): ReferencePosition | undefined {
2448
+ const segment = lref.getSegment();
2449
+ if (segment) {
2450
+ const removedRefs = segment?.localRefs?.removeLocalRef(lref);
2451
+ if (removedRefs !== undefined) {
2452
+ this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,
2453
+ LocalClientId);
2454
+ }
2455
+ return removedRefs;
2456
+ }
2457
+ }
2458
+ public createLocalReferencePosition(
2459
+ segment: ISegment, offset: number, refType: ReferenceType, properties: PropertySet | undefined,
2460
+ client: Client,
2461
+ ): ReferencePosition {
2462
+ const localRefs = segment.localRefs ?? new LocalReferenceCollection(segment);
2463
+ segment.localRefs = localRefs;
2464
+
2465
+ const segRef = localRefs.createLocalRef(offset, refType, properties, client);
2466
+
2467
+ this.blockUpdatePathLengths(segment.parent, TreeMaintenanceSequenceNumber,
2468
+ LocalClientId);
2469
+ return segRef;
2470
+ }
2471
+
2445
2472
  /**
2446
2473
  * @deprecated - use removeLocalReferencePosition
2447
2474
  */
@@ -11,14 +11,18 @@ import { PropertySet, MapLike } from "./properties";
11
11
  export const reservedTileLabelsKey = "referenceTileLabels";
12
12
  export const reservedRangeLabelsKey = "referenceRangeLabels";
13
13
 
14
- export const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>
14
+ export function refTypeIncludesFlag(refPos: ReferencePosition, flags: ReferenceType): boolean {
15
15
  // eslint-disable-next-line no-bitwise
16
- (refPos.refType & ReferenceType.Tile)
16
+ return (refPos.refType & flags) !== 0;
17
+ }
18
+
19
+ export const refGetTileLabels = (refPos: ReferencePosition): string[] | undefined =>
20
+ refTypeIncludesFlag(refPos, ReferenceType.Tile)
17
21
  && refPos.properties ? refPos.properties[reservedTileLabelsKey] as string[] : undefined;
18
22
 
19
23
  export const refGetRangeLabels = (refPos: ReferencePosition): string[] | undefined =>
20
24
  // eslint-disable-next-line no-bitwise
21
- (refPos.refType & (ReferenceType.NestBegin | ReferenceType.NestEnd))
25
+ (refTypeIncludesFlag(refPos, ReferenceType.NestBegin | ReferenceType.NestEnd))
22
26
  && refPos.properties ? refPos.properties[reservedRangeLabelsKey] as string[] : undefined;
23
27
 
24
28
  export function refHasTileLabel(refPos: ReferencePosition, label: string): boolean {
@@ -157,7 +157,7 @@ export class SnapshotLegacy {
157
157
  if ((segment.seq !== UnassignedSequenceNumber) && (segment.seq! <= this.seq!) &&
158
158
  ((segment.removedSeq === undefined) || (segment.removedSeq === UnassignedSequenceNumber) ||
159
159
  (segment.removedSeq > this.seq!))) {
160
- if (prev && prev.canAppend(segment)
160
+ if (prev?.canAppend(segment)
161
161
  && matchProperties(prev.properties, segment.properties)
162
162
  ) {
163
163
  prev = prev.clone();
@@ -53,7 +53,7 @@ export class SortedSegmentSet<T extends ISegment | { readonly segment: ISegment;
53
53
 
54
54
  private getOrdinal(item: T): string {
55
55
  const maybeObject = item as { readonly segment: ISegment; };
56
- if (maybeObject && maybeObject.segment) {
56
+ if (maybeObject?.segment) {
57
57
  return maybeObject.segment.ordinal;
58
58
  }
59
59
 
@@ -204,10 +204,10 @@ export class MergeTreeTextHelper {
204
204
  const tags = [] as string[];
205
205
  const initTags = [] as string[];
206
206
 
207
- if (segment.properties && (segment.properties["font-weight"])) {
207
+ if (segment.properties?.["font-weight"]) {
208
208
  tags.push("b");
209
209
  }
210
- if (segment.properties && (segment.properties["text-decoration"])) {
210
+ if (segment.properties?.["text-decoration"]) {
211
211
  tags.push("u");
212
212
  }
213
213
  const remTags = [] as string[];