@fluidframework/sequence 2.0.0-internal.6.3.2 → 2.0.0-internal.6.4.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 (145) 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.map +1 -1
  5. package/dist/intervalCollection.d.ts +5 -5
  6. package/dist/intervalCollection.d.ts.map +1 -1
  7. package/dist/intervalCollection.js +26 -12
  8. package/dist/intervalCollection.js.map +1 -1
  9. package/dist/intervalIndex/endpointInRangeIndex.d.ts +13 -3
  10. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  11. package/dist/intervalIndex/endpointInRangeIndex.js +8 -5
  12. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  13. package/dist/intervalIndex/endpointIndex.d.ts +13 -2
  14. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  15. package/dist/intervalIndex/endpointIndex.js +6 -3
  16. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  17. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  18. package/dist/intervalIndex/index.d.ts +4 -4
  19. package/dist/intervalIndex/index.d.ts.map +1 -1
  20. package/dist/intervalIndex/index.js +5 -1
  21. package/dist/intervalIndex/index.js.map +1 -1
  22. package/dist/intervalIndex/intervalIndex.d.ts +2 -2
  23. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  24. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +3 -2
  25. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  26. package/dist/intervalIndex/overlappingIntervalsIndex.js +4 -2
  27. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  28. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
  29. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  30. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +3 -1
  31. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  32. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  33. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  34. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  35. package/dist/intervalIndex/startpointInRangeIndex.d.ts +13 -3
  36. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  37. package/dist/intervalIndex/startpointInRangeIndex.js +8 -5
  38. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  39. package/dist/intervals/interval.d.ts +1 -1
  40. package/dist/intervals/interval.d.ts.map +1 -1
  41. package/dist/intervals/interval.js +2 -1
  42. package/dist/intervals/interval.js.map +1 -1
  43. package/dist/intervals/intervalUtils.d.ts +3 -2
  44. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  45. package/dist/intervals/intervalUtils.js.map +1 -1
  46. package/dist/intervals/sequenceInterval.d.ts +8 -5
  47. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  48. package/dist/intervals/sequenceInterval.js +8 -4
  49. package/dist/intervals/sequenceInterval.js.map +1 -1
  50. package/dist/packageVersion.d.ts +1 -1
  51. package/dist/packageVersion.js +1 -1
  52. package/dist/packageVersion.js.map +1 -1
  53. package/dist/sequence.d.ts +2 -1
  54. package/dist/sequence.d.ts.map +1 -1
  55. package/dist/sequence.js +3 -2
  56. package/dist/sequence.js.map +1 -1
  57. package/dist/sequenceDeltaEvent.d.ts +8 -3
  58. package/dist/sequenceDeltaEvent.d.ts.map +1 -1
  59. package/dist/sequenceDeltaEvent.js.map +1 -1
  60. package/dist/sequenceFactory.js +1 -1
  61. package/dist/sequenceFactory.js.map +1 -1
  62. package/dist/sharedString.js +2 -1
  63. package/dist/sharedString.js.map +1 -1
  64. package/lib/index.d.ts +1 -1
  65. package/lib/index.d.ts.map +1 -1
  66. package/lib/index.js.map +1 -1
  67. package/lib/intervalCollection.d.ts +5 -5
  68. package/lib/intervalCollection.d.ts.map +1 -1
  69. package/lib/intervalCollection.js +28 -14
  70. package/lib/intervalCollection.js.map +1 -1
  71. package/lib/intervalIndex/endpointInRangeIndex.d.ts +13 -3
  72. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  73. package/lib/intervalIndex/endpointInRangeIndex.js +8 -6
  74. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  75. package/lib/intervalIndex/endpointIndex.d.ts +13 -2
  76. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  77. package/lib/intervalIndex/endpointIndex.js +6 -4
  78. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  79. package/lib/intervalIndex/idIntervalIndex.js.map +1 -1
  80. package/lib/intervalIndex/index.d.ts +4 -4
  81. package/lib/intervalIndex/index.d.ts.map +1 -1
  82. package/lib/intervalIndex/index.js +4 -4
  83. package/lib/intervalIndex/index.js.map +1 -1
  84. package/lib/intervalIndex/intervalIndex.d.ts +2 -2
  85. package/lib/intervalIndex/intervalIndex.js.map +1 -1
  86. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts +3 -2
  87. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  88. package/lib/intervalIndex/overlappingIntervalsIndex.js +5 -3
  89. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  90. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
  91. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  92. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js +3 -1
  93. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  94. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts +1 -1
  95. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  96. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  97. package/lib/intervalIndex/startpointInRangeIndex.d.ts +13 -3
  98. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  99. package/lib/intervalIndex/startpointInRangeIndex.js +8 -6
  100. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  101. package/lib/intervals/interval.d.ts +1 -1
  102. package/lib/intervals/interval.d.ts.map +1 -1
  103. package/lib/intervals/interval.js +2 -1
  104. package/lib/intervals/interval.js.map +1 -1
  105. package/lib/intervals/intervalUtils.d.ts +3 -2
  106. package/lib/intervals/intervalUtils.d.ts.map +1 -1
  107. package/lib/intervals/intervalUtils.js.map +1 -1
  108. package/lib/intervals/sequenceInterval.d.ts +8 -5
  109. package/lib/intervals/sequenceInterval.d.ts.map +1 -1
  110. package/lib/intervals/sequenceInterval.js +8 -4
  111. package/lib/intervals/sequenceInterval.js.map +1 -1
  112. package/lib/packageVersion.d.ts +1 -1
  113. package/lib/packageVersion.js +1 -1
  114. package/lib/packageVersion.js.map +1 -1
  115. package/lib/sequence.d.ts +2 -1
  116. package/lib/sequence.d.ts.map +1 -1
  117. package/lib/sequence.js +3 -2
  118. package/lib/sequence.js.map +1 -1
  119. package/lib/sequenceDeltaEvent.d.ts +8 -3
  120. package/lib/sequenceDeltaEvent.d.ts.map +1 -1
  121. package/lib/sequenceDeltaEvent.js.map +1 -1
  122. package/lib/sequenceFactory.js +1 -1
  123. package/lib/sequenceFactory.js.map +1 -1
  124. package/lib/sharedString.js +2 -1
  125. package/lib/sharedString.js.map +1 -1
  126. package/package.json +15 -17
  127. package/src/index.ts +1 -1
  128. package/src/intervalCollection.ts +39 -19
  129. package/src/intervalIndex/endpointInRangeIndex.ts +18 -10
  130. package/src/intervalIndex/endpointIndex.ts +15 -7
  131. package/src/intervalIndex/idIntervalIndex.ts +1 -1
  132. package/src/intervalIndex/index.ts +12 -3
  133. package/src/intervalIndex/intervalIndex.ts +2 -2
  134. package/src/intervalIndex/overlappingIntervalsIndex.ts +14 -6
  135. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +4 -1
  136. package/src/intervalIndex/sequenceIntervalIndexes.ts +1 -1
  137. package/src/intervalIndex/startpointInRangeIndex.ts +18 -10
  138. package/src/intervals/interval.ts +2 -1
  139. package/src/intervals/intervalUtils.ts +4 -2
  140. package/src/intervals/sequenceInterval.ts +8 -4
  141. package/src/packageVersion.ts +1 -1
  142. package/src/sequence.ts +3 -2
  143. package/src/sequenceDeltaEvent.ts +11 -3
  144. package/src/sequenceFactory.ts +1 -1
  145. package/src/sharedString.ts +2 -1
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import {
7
8
  Client,
@@ -16,6 +17,7 @@ import {
16
17
  SequenceInterval,
17
18
  createPositionReferenceFromSegoff,
18
19
  } from "../intervals";
20
+ import { SharedString } from "../sharedString";
19
21
  import { SequenceIntervalIndexes } from "./sequenceIntervalIndexes";
20
22
  import { OverlappingIntervalsIndex } from "./overlappingIntervalsIndex";
21
23
 
@@ -65,7 +67,8 @@ class OverlappingSequenceIntervalsIndex
65
67
  }
66
68
 
67
69
  export function createOverlappingSequenceIntervalsIndex(
68
- client: Client,
70
+ sharedString: SharedString,
69
71
  ): SequenceIntervalIndexes.Overlapping {
72
+ const client = (sharedString as unknown as { client: Client }).client;
70
73
  return new OverlappingSequenceIntervalsIndex(client);
71
74
  }
@@ -27,6 +27,6 @@ export namespace SequenceIntervalIndexes {
27
27
  findOverlappingIntervalsBySegoff(
28
28
  startSegoff: { segment: ISegment | undefined; offset: number | undefined },
29
29
  endSegoff: { segment: ISegment | undefined; offset: number | undefined },
30
- );
30
+ ): Iterable<SequenceInterval>;
31
31
  }
32
32
  }
@@ -2,10 +2,18 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import { Client, PropertyAction, RedBlackTree } from "@fluidframework/merge-tree";
7
8
  import { assert } from "@fluidframework/core-utils";
8
- import { IIntervalHelpers, ISerializableInterval, IntervalType } from "../intervals";
9
+ import {
10
+ IIntervalHelpers,
11
+ ISerializableInterval,
12
+ IntervalType,
13
+ SequenceInterval,
14
+ sequenceIntervalHelpers,
15
+ } from "../intervals";
16
+ import { SharedString } from "../sharedString";
9
17
  import { IntervalIndex } from "./intervalIndex";
10
18
  import { HasComparisonOverride, compareOverrideables, forceCompare } from "./intervalIndexUtils";
11
19
 
@@ -19,17 +27,17 @@ export interface IStartpointInRangeIndex<TInterval extends ISerializableInterval
19
27
  /**
20
28
  * @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)
21
29
  */
22
- findIntervalsWithStartpointInRange(start: number, end: number);
30
+ findIntervalsWithStartpointInRange(start: number, end: number): TInterval[];
23
31
  }
24
32
 
25
- class StartpointInRangeIndex<TInterval extends ISerializableInterval>
33
+ export class StartpointInRangeIndex<TInterval extends ISerializableInterval>
26
34
  implements IStartpointInRangeIndex<TInterval>
27
35
  {
28
36
  private readonly intervalTree;
29
37
 
30
38
  constructor(
31
- private readonly helpers: IIntervalHelpers<TInterval>,
32
39
  private readonly client: Client,
40
+ private readonly helpers: IIntervalHelpers<TInterval>,
33
41
  ) {
34
42
  this.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {
35
43
  assert(
@@ -66,7 +74,7 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
66
74
  this.intervalTree.remove(interval);
67
75
  }
68
76
 
69
- public findIntervalsWithStartpointInRange(start: number, end: number) {
77
+ public findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {
70
78
  if (start <= 0 || start > end || this.intervalTree.isEmpty()) {
71
79
  return [];
72
80
  }
@@ -101,9 +109,9 @@ class StartpointInRangeIndex<TInterval extends ISerializableInterval>
101
109
  }
102
110
  }
103
111
 
104
- export function createStartpointInRangeIndex<TInterval extends ISerializableInterval>(
105
- helpers: IIntervalHelpers<TInterval>,
106
- client: Client,
107
- ): IStartpointInRangeIndex<TInterval> {
108
- return new StartpointInRangeIndex<TInterval>(helpers, client);
112
+ export function createStartpointInRangeIndex(
113
+ sharedString: SharedString,
114
+ ): IStartpointInRangeIndex<SequenceInterval> {
115
+ const client = (sharedString as unknown as { client: Client }).client;
116
+ return new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);
109
117
  }
@@ -2,6 +2,7 @@
2
2
  * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
3
  * Licensed under the MIT License.
4
4
  */
5
+ /* eslint-disable import/no-deprecated */
5
6
 
6
7
  import {
7
8
  ICombiningOp,
@@ -60,7 +61,7 @@ export class Interval implements ISerializableInterval {
60
61
  * Adds an auxiliary set of properties to this interval.
61
62
  * These properties can be recovered using `getAdditionalPropertySets`
62
63
  * @param props - set of properties to add
63
- * @remarks - This gets called as part of the default conflict resolver for `IIntervalCollection<Interval>`
64
+ * @remarks This gets called as part of the default conflict resolver for `IIntervalCollection<Interval>`
64
65
  * (i.e. non-sequence-based interval collections). However, the additional properties don't get serialized.
65
66
  * This functionality seems half-baked.
66
67
  */
@@ -12,6 +12,7 @@ import {
12
12
  SlidingPreference,
13
13
  } from "@fluidframework/merge-tree";
14
14
  import { ISequencedDocumentMessage } from "@fluidframework/protocol-definitions";
15
+
15
16
  /**
16
17
  * Basic interval abstraction
17
18
  */
@@ -105,7 +106,7 @@ export interface ISerializedInterval {
105
106
  /**
106
107
  * Sequence number at which `start` and `end` should be interpreted
107
108
  *
108
- * @remarks - It's unclear that this is necessary to store here.
109
+ * @remarks It's unclear that this is necessary to store here.
109
110
  * This should just be the refSeq on the op that modified the interval, which should be available via other means.
110
111
  * At the time of writing, it's not plumbed through to the reconnect/rebase code, however, which does need it.
111
112
  */
@@ -138,7 +139,7 @@ export interface ISerializableInterval extends IInterval {
138
139
  * Gets the id associated with this interval.
139
140
  * When the interval is used as part of an interval collection, this id can be used to modify or remove the
140
141
  * interval.
141
- * @remarks - This signature includes `undefined` strictly for backwards-compatibility reasons, as older versions
142
+ * @remarks This signature includes `undefined` strictly for backwards-compatibility reasons, as older versions
142
143
  * of Fluid didn't always write interval ids.
143
144
  */
144
145
  getIntervalId(): string | undefined;
@@ -166,6 +167,7 @@ export type CompressedSerializedInterval =
166
167
 
167
168
  /**
168
169
  * @sealed
170
+ * @deprecated The methods within have substitutions
169
171
  */
170
172
  export interface IIntervalHelpers<TInterval extends ISerializableInterval> {
171
173
  /**
@@ -4,6 +4,7 @@
4
4
  */
5
5
 
6
6
  /* eslint-disable no-bitwise */
7
+ /* eslint-disable import/no-deprecated */
7
8
 
8
9
  import {
9
10
  Client,
@@ -43,7 +44,7 @@ const reservedIntervalIdKey = "intervalId";
43
44
  * As such, when content is inserted into the middle of the interval, the interval expands to
44
45
  * include that content.
45
46
  *
46
- * @remarks - The endpoint's position should be treated exclusively to get reasonable behavior--i.e.
47
+ * @remarks The endpoint's position should be treated exclusively to get reasonable behavior--i.e.
47
48
  * an interval referring to "hello" in "hello world" should have a start position of 0 and an end
48
49
  * position of 5.
49
50
  *
@@ -74,12 +75,12 @@ export class SequenceInterval implements ISerializableInterval {
74
75
  private readonly client: Client,
75
76
  /**
76
77
  * Start endpoint of this interval.
77
- * @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.
78
+ * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.
78
79
  */
79
80
  public start: LocalReferencePosition,
80
81
  /**
81
82
  * End endpoint of this interval.
82
- * @remarks - This endpoint can be resolved into a character position using the SharedString it's a part of.
83
+ * @remarks This endpoint can be resolved into a character position using the SharedString it's a part of.
83
84
  */
84
85
  public end: LocalReferencePosition,
85
86
  public intervalType: IntervalType,
@@ -435,7 +436,7 @@ export function createSequenceInterval(
435
436
  // All non-transient interval references must eventually be SlideOnRemove
436
437
  // To ensure eventual consistency, they must start as StayOnRemove when
437
438
  // pending (created locally and creation op is not acked)
438
- if (op || fromSnapshot) {
439
+ if (op ?? fromSnapshot) {
439
440
  beginRefType |= ReferenceType.SlideOnRemove;
440
441
  endRefType |= ReferenceType.SlideOnRemove;
441
442
  } else {
@@ -487,6 +488,9 @@ export const compareSequenceIntervalEnds = (a: SequenceInterval, b: SequenceInte
487
488
  export const compareSequenceIntervalStarts = (a: SequenceInterval, b: SequenceInterval): number =>
488
489
  compareReferencePositions(a.start, b.start);
489
490
 
491
+ /**
492
+ * @deprecated The methods within have substitutions
493
+ */
490
494
  export const sequenceIntervalHelpers: IIntervalHelpers<SequenceInterval> = {
491
495
  compareEnds: compareSequenceIntervalEnds,
492
496
  compareStarts: compareSequenceIntervalStarts,
@@ -6,4 +6,4 @@
6
6
  */
7
7
 
8
8
  export const pkgName = "@fluidframework/sequence";
9
- export const pkgVersion = "2.0.0-internal.6.3.2";
9
+ export const pkgVersion = "2.0.0-internal.6.4.0";
package/src/sequence.ts CHANGED
@@ -452,7 +452,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
452
452
  }
453
453
 
454
454
  /**
455
- * @returns - The most recent sequence number which has been acked by the server and processed by this
455
+ * @returns The most recent sequence number which has been acked by the server and processed by this
456
456
  * SharedSegmentSequence.
457
457
  */
458
458
  public getCurrentSeq() {
@@ -489,6 +489,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
489
489
  * @returns An iterable object that enumerates the IntervalCollection labels.
490
490
  *
491
491
  * @example
492
+ *
492
493
  * ```typescript
493
494
  * const iter = this.getIntervalCollectionKeys();
494
495
  * for (key of iter)
@@ -704,7 +705,7 @@ export abstract class SharedSegmentSequence<T extends ISegment>
704
705
  * {@inheritDoc @fluidframework/shared-object-base#SharedObjectCore.applyStashedOp}
705
706
  */
706
707
  protected applyStashedOp(content: any): unknown {
707
- return this.client.applyStashedOp(content);
708
+ return this.client.applyStashedOp(parseHandles(content, this.serializer));
708
709
  }
709
710
 
710
711
  private summarizeMergeTree(serializer: IFluidSerializer): ISummaryTreeWithStats {
@@ -147,25 +147,33 @@ export interface ISequenceDeltaRange<
147
147
  > {
148
148
  /**
149
149
  * The type of operation that changed this range.
150
- * @remarks - Consuming code should typically compare this to the enum values defined in
150
+ *
151
+ * @remarks Consuming code should typically compare this to the enum values defined in
151
152
  * `MergeTreeDeltaOperationTypes`.
152
153
  */
153
154
  operation: TOperation;
155
+
154
156
  /**
155
157
  * The index of the start of the range.
156
158
  */
157
159
  position: number;
160
+
158
161
  /**
159
162
  * The segment that corresponds to the range.
160
163
  */
161
164
  segment: ISegment;
165
+
162
166
  /**
163
167
  * Deltas object which contains all modified properties with their previous values.
164
168
  * Since `undefined` doesn't survive a round-trip through JSON serialization, the old value being absent
165
169
  * is instead encoded with `null`.
166
- * @remarks - This object is motivated by undo/redo scenarios, and provides a convenient "inverse op" to apply to
170
+ *
171
+ * @remarks This object is motivated by undo/redo scenarios, and provides a convenient "inverse op" to apply to
167
172
  * undo a property change.
168
- * @example - If a segment initially had properties `{ foo: "1", bar: 2 }` and it was annotated with
173
+ *
174
+ * @example
175
+ *
176
+ * If a segment initially had properties `{ foo: "1", bar: 2 }` and it was annotated with
169
177
  * `{ foo: 3, baz: 5 }`, the corresponding event would have a `propertyDeltas` of `{ foo: "1", baz: null }`.
170
178
  */
171
179
  propertyDeltas: PropertySet;
@@ -15,7 +15,7 @@ import { SharedString, SharedStringSegment } from "./sharedString";
15
15
 
16
16
  export class SharedStringFactory implements IChannelFactory {
17
17
  // TODO rename back to https://graph.microsoft.com/types/mergeTree/string once paparazzi is able to dynamically
18
- // load code
18
+ // load code (UPDATE: paparazzi is gone... anything to do here?)
19
19
  public static Type = "https://graph.microsoft.com/types/mergeTree";
20
20
 
21
21
  public static readonly Attributes: IChannelAttributes = {
@@ -406,7 +406,8 @@ const gatherTextAndMarkers: ISegmentAction<ITextAndMarkerAccumulator> = (
406
406
  if (placeholder && placeholder.length > 0) {
407
407
  const placeholderText =
408
408
  placeholder === "*"
409
- ? `\n${segment.toString()}`
409
+ ? // eslint-disable-next-line @typescript-eslint/no-base-to-string
410
+ `\n${segment.toString()}`
410
411
  : placeholder.repeat(segment.cachedLength);
411
412
  textSegment.text += placeholderText;
412
413
  } else {