@fluidframework/sequence 2.0.0-dev-rc.2.0.0.245554 → 2.0.0-dev-rc.2.0.0.246488

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/intervalCollection.d.ts.map +1 -1
  2. package/dist/intervalCollection.js +4 -0
  3. package/dist/intervalCollection.js.map +1 -1
  4. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  5. package/dist/intervalIndex/endpointInRangeIndex.js +1 -1
  6. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  7. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  8. package/dist/intervalIndex/endpointIndex.js +1 -1
  9. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  10. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  11. package/dist/intervalIndex/overlappingIntervalsIndex.js +0 -1
  12. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  13. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  14. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +1 -1
  15. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  16. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  17. package/dist/intervalIndex/startpointInRangeIndex.js +1 -1
  18. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  19. package/dist/intervals/interval.d.ts.map +1 -1
  20. package/dist/intervals/interval.js +1 -1
  21. package/dist/intervals/interval.js.map +1 -1
  22. package/dist/packageVersion.d.ts +1 -1
  23. package/dist/packageVersion.js +1 -1
  24. package/dist/packageVersion.js.map +1 -1
  25. package/lib/intervalCollection.d.ts.map +1 -1
  26. package/lib/intervalCollection.js +4 -0
  27. package/lib/intervalCollection.js.map +1 -1
  28. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  29. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -1
  30. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -1
  31. package/lib/intervalIndex/endpointIndex.js.map +1 -1
  32. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  33. package/lib/intervalIndex/overlappingIntervalsIndex.js +0 -1
  34. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  35. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  36. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  37. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  38. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -1
  39. package/lib/intervals/interval.d.ts.map +1 -1
  40. package/lib/intervals/interval.js.map +1 -1
  41. package/lib/packageVersion.d.ts +1 -1
  42. package/lib/packageVersion.js +1 -1
  43. package/lib/packageVersion.js.map +1 -1
  44. package/lib/test/fuzz/fuzzUtils.js.map +1 -1
  45. package/lib/test/intervalCollection.detached.spec.js +4 -2
  46. package/lib/test/intervalCollection.detached.spec.js.map +1 -1
  47. package/lib/test/intervalCollection.snapshot.spec.js.map +1 -1
  48. package/lib/test/intervalIndexTestUtils.js.map +1 -1
  49. package/lib/test/intervalStashedOps.spec.js.map +1 -1
  50. package/lib/test/revertibles.spec.js +50 -2
  51. package/lib/test/revertibles.spec.js.map +1 -1
  52. package/lib/test/sharedIntervalCollection.spec.js.map +1 -1
  53. package/package.json +15 -15
  54. package/src/intervalCollection.ts +4 -0
  55. package/src/intervalIndex/endpointInRangeIndex.ts +1 -0
  56. package/src/intervalIndex/endpointIndex.ts +1 -0
  57. package/src/intervalIndex/overlappingIntervalsIndex.ts +1 -0
  58. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +1 -0
  59. package/src/intervalIndex/startpointInRangeIndex.ts +1 -0
  60. package/src/intervals/interval.ts +1 -0
  61. package/src/packageVersion.ts +1 -1
@@ -2,7 +2,6 @@
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 */
6
5
  import { IntervalType, sequenceIntervalHelpers, } from "../intervals/index.js";
7
6
  import { IntervalTree } from "../intervalTree.js";
8
7
  import { endpointPosAndSide } from "../intervalCollection.js";
@@ -1 +1 @@
1
- {"version":3,"file":"overlappingIntervalsIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/overlappingIntervalsIndex.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable import/no-deprecated */\n\nimport { Client } from \"@fluidframework/merge-tree\";\nimport {\n\tIntervalType,\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tsequenceIntervalHelpers,\n\tSequenceInterval,\n} from \"../intervals/index.js\";\nimport { IntervalNode, IntervalTree } from \"../intervalTree.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequencePlace, endpointPosAndSide } from \"../intervalCollection.js\";\nimport { IntervalIndex } from \"./intervalIndex.js\";\n\n/**\n * @alpha\n */\nexport interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>\n\textends IntervalIndex<TInterval> {\n\t/**\n\t * @returns an array of all intervals contained in this collection that overlap the range\n\t * `[start end]`.\n\t */\n\tfindOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[];\n\n\t/**\n\t * Gathers the interval results based on specified parameters.\n\t */\n\tgatherIterationResults(\n\t\tresults: TInterval[],\n\t\titeratesForward: boolean,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t): void;\n}\n\nexport class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>\n\timplements IOverlappingIntervalsIndex<TInterval>\n{\n\tprotected readonly intervalTree = new IntervalTree<TInterval>();\n\tprotected readonly client: Client;\n\tprotected readonly helpers: IIntervalHelpers<TInterval>;\n\n\tconstructor(client: Client, helpers: IIntervalHelpers<TInterval>) {\n\t\tthis.client = client;\n\t\tthis.helpers = helpers;\n\t}\n\n\tpublic map(fn: (interval: TInterval) => void) {\n\t\tthis.intervalTree.map(fn);\n\t}\n\n\tpublic mapUntil(fn: (interval: TInterval) => boolean) {\n\t\tthis.intervalTree.mapUntil(fn);\n\t}\n\n\tpublic gatherIterationResults(\n\t\tresults: TInterval[],\n\t\titeratesForward: boolean,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t): void {\n\t\tif (this.intervalTree.intervals.isEmpty()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (start === undefined && end === undefined) {\n\t\t\t// No start/end provided. Gather the whole tree in the specified order.\n\t\t\tif (iteratesForward) {\n\t\t\t\tthis.intervalTree.map((interval: TInterval) => {\n\t\t\t\t\tresults.push(interval);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.intervalTree.mapBackward((interval: TInterval) => {\n\t\t\t\t\tresults.push(interval);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst transientInterval: TInterval = this.helpers.create(\n\t\t\t\t\"transient\",\n\t\t\t\tstart ?? \"start\",\n\t\t\t\tend ?? \"end\",\n\t\t\t\tthis.client,\n\t\t\t\tIntervalType.Transient,\n\t\t\t);\n\n\t\t\tif (start === undefined) {\n\t\t\t\t// Only end position provided. Since the tree is not sorted by end position,\n\t\t\t\t// walk the whole tree in the specified order, gathering intervals that match the end.\n\t\t\t\tif (iteratesForward) {\n\t\t\t\t\tthis.intervalTree.map((interval: TInterval) => {\n\t\t\t\t\t\tif (transientInterval.compareEnd(interval) === 0) {\n\t\t\t\t\t\t\tresults.push(interval);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.intervalTree.mapBackward((interval: TInterval) => {\n\t\t\t\t\t\tif (transientInterval.compareEnd(interval) === 0) {\n\t\t\t\t\t\t\tresults.push(interval);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Start and (possibly) end provided. Walk the subtrees that may contain\n\t\t\t\t// this start position.\n\t\t\t\tconst compareFn =\n\t\t\t\t\tend === undefined\n\t\t\t\t\t\t? (node: IntervalNode<TInterval>) => {\n\t\t\t\t\t\t\t\treturn transientInterval.compareStart(node.key);\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: (node: IntervalNode<TInterval>) => {\n\t\t\t\t\t\t\t\treturn transientInterval.compare(node.key);\n\t\t\t\t\t\t };\n\t\t\t\tconst continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n\t\t\t\tconst continueRightFn = (cmpResult: number) => cmpResult >= 0;\n\t\t\t\tconst actionFn = (node: IntervalNode<TInterval>) => {\n\t\t\t\t\tresults.push(node.key);\n\t\t\t\t};\n\n\t\t\t\tif (iteratesForward) {\n\t\t\t\t\tthis.intervalTree.intervals.walkExactMatchesForward(\n\t\t\t\t\t\tcompareFn,\n\t\t\t\t\t\tactionFn,\n\t\t\t\t\t\tcontinueLeftFn,\n\t\t\t\t\t\tcontinueRightFn,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.intervalTree.intervals.walkExactMatchesBackward(\n\t\t\t\t\t\tcompareFn,\n\t\t\t\t\t\tactionFn,\n\t\t\t\t\t\tcontinueLeftFn,\n\t\t\t\t\t\tcontinueRightFn,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[] {\n\t\tconst { startPos, endPos } = endpointPosAndSide(start, end);\n\n\t\tif (\n\t\t\tstartPos === undefined ||\n\t\t\tendPos === undefined ||\n\t\t\t(typeof startPos === \"number\" && typeof endPos === \"number\" && endPos < startPos) ||\n\t\t\t(startPos === \"end\" && endPos !== \"end\") ||\n\t\t\t(startPos !== \"start\" && endPos === \"start\") ||\n\t\t\tthis.intervalTree.intervals.isEmpty()\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\t\tconst transientInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tthis.client,\n\t\t\tIntervalType.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\tpublic remove(interval: TInterval) {\n\t\tthis.intervalTree.removeExisting(interval);\n\t}\n\n\tpublic add(interval: TInterval) {\n\t\tthis.intervalTree.put(interval);\n\t}\n}\n\n/**\n * @alpha\n */\nexport function createOverlappingIntervalsIndex(\n\tsharedString: SharedString,\n): IOverlappingIntervalsIndex<SequenceInterval> {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingIntervalsIndex<SequenceInterval>(client, sequenceIntervalHelpers);\n}\n"]}
1
+ {"version":3,"file":"overlappingIntervalsIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/overlappingIntervalsIndex.ts"],"names":[],"mappings":"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","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 { Client } from \"@fluidframework/merge-tree\";\nimport {\n\tIntervalType,\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tsequenceIntervalHelpers,\n\tSequenceInterval,\n} from \"../intervals/index.js\";\nimport { IntervalNode, IntervalTree } from \"../intervalTree.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequencePlace, endpointPosAndSide } from \"../intervalCollection.js\";\nimport { IntervalIndex } from \"./intervalIndex.js\";\n\n/**\n * @alpha\n */\nexport interface IOverlappingIntervalsIndex<TInterval extends ISerializableInterval>\n\textends IntervalIndex<TInterval> {\n\t/**\n\t * @returns an array of all intervals contained in this collection that overlap the range\n\t * `[start end]`.\n\t */\n\tfindOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[];\n\n\t/**\n\t * Gathers the interval results based on specified parameters.\n\t */\n\tgatherIterationResults(\n\t\tresults: TInterval[],\n\t\titeratesForward: boolean,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t): void;\n}\n\nexport class OverlappingIntervalsIndex<TInterval extends ISerializableInterval>\n\timplements IOverlappingIntervalsIndex<TInterval>\n{\n\tprotected readonly intervalTree = new IntervalTree<TInterval>();\n\tprotected readonly client: Client;\n\tprotected readonly helpers: IIntervalHelpers<TInterval>;\n\n\tconstructor(client: Client, helpers: IIntervalHelpers<TInterval>) {\n\t\tthis.client = client;\n\t\tthis.helpers = helpers;\n\t}\n\n\tpublic map(fn: (interval: TInterval) => void) {\n\t\tthis.intervalTree.map(fn);\n\t}\n\n\tpublic mapUntil(fn: (interval: TInterval) => boolean) {\n\t\tthis.intervalTree.mapUntil(fn);\n\t}\n\n\tpublic gatherIterationResults(\n\t\tresults: TInterval[],\n\t\titeratesForward: boolean,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t): void {\n\t\tif (this.intervalTree.intervals.isEmpty()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (start === undefined && end === undefined) {\n\t\t\t// No start/end provided. Gather the whole tree in the specified order.\n\t\t\tif (iteratesForward) {\n\t\t\t\tthis.intervalTree.map((interval: TInterval) => {\n\t\t\t\t\tresults.push(interval);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.intervalTree.mapBackward((interval: TInterval) => {\n\t\t\t\t\tresults.push(interval);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst transientInterval: TInterval = this.helpers.create(\n\t\t\t\t\"transient\",\n\t\t\t\tstart ?? \"start\",\n\t\t\t\tend ?? \"end\",\n\t\t\t\tthis.client,\n\t\t\t\tIntervalType.Transient,\n\t\t\t);\n\n\t\t\tif (start === undefined) {\n\t\t\t\t// Only end position provided. Since the tree is not sorted by end position,\n\t\t\t\t// walk the whole tree in the specified order, gathering intervals that match the end.\n\t\t\t\tif (iteratesForward) {\n\t\t\t\t\tthis.intervalTree.map((interval: TInterval) => {\n\t\t\t\t\t\tif (transientInterval.compareEnd(interval) === 0) {\n\t\t\t\t\t\t\tresults.push(interval);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.intervalTree.mapBackward((interval: TInterval) => {\n\t\t\t\t\t\tif (transientInterval.compareEnd(interval) === 0) {\n\t\t\t\t\t\t\tresults.push(interval);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Start and (possibly) end provided. Walk the subtrees that may contain\n\t\t\t\t// this start position.\n\t\t\t\tconst compareFn =\n\t\t\t\t\tend === undefined\n\t\t\t\t\t\t? (node: IntervalNode<TInterval>) => {\n\t\t\t\t\t\t\t\treturn transientInterval.compareStart(node.key);\n\t\t\t\t\t\t }\n\t\t\t\t\t\t: (node: IntervalNode<TInterval>) => {\n\t\t\t\t\t\t\t\treturn transientInterval.compare(node.key);\n\t\t\t\t\t\t };\n\t\t\t\tconst continueLeftFn = (cmpResult: number) => cmpResult <= 0;\n\t\t\t\tconst continueRightFn = (cmpResult: number) => cmpResult >= 0;\n\t\t\t\tconst actionFn = (node: IntervalNode<TInterval>) => {\n\t\t\t\t\tresults.push(node.key);\n\t\t\t\t};\n\n\t\t\t\tif (iteratesForward) {\n\t\t\t\t\tthis.intervalTree.intervals.walkExactMatchesForward(\n\t\t\t\t\t\tcompareFn,\n\t\t\t\t\t\tactionFn,\n\t\t\t\t\t\tcontinueLeftFn,\n\t\t\t\t\t\tcontinueRightFn,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tthis.intervalTree.intervals.walkExactMatchesBackward(\n\t\t\t\t\t\tcompareFn,\n\t\t\t\t\t\tactionFn,\n\t\t\t\t\t\tcontinueLeftFn,\n\t\t\t\t\t\tcontinueRightFn,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic findOverlappingIntervals(start: SequencePlace, end: SequencePlace): TInterval[] {\n\t\tconst { startPos, endPos } = endpointPosAndSide(start, end);\n\n\t\tif (\n\t\t\tstartPos === undefined ||\n\t\t\tendPos === undefined ||\n\t\t\t(typeof startPos === \"number\" && typeof endPos === \"number\" && endPos < startPos) ||\n\t\t\t(startPos === \"end\" && endPos !== \"end\") ||\n\t\t\t(startPos !== \"start\" && endPos === \"start\") ||\n\t\t\tthis.intervalTree.intervals.isEmpty()\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\t\tconst transientInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tthis.client,\n\t\t\tIntervalType.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\tpublic remove(interval: TInterval) {\n\t\tthis.intervalTree.removeExisting(interval);\n\t}\n\n\tpublic add(interval: TInterval) {\n\t\tthis.intervalTree.put(interval);\n\t}\n}\n\n/**\n * @alpha\n */\nexport function createOverlappingIntervalsIndex(\n\tsharedString: SharedString,\n): IOverlappingIntervalsIndex<SequenceInterval> {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingIntervalsIndex<SequenceInterval>(client, sequenceIntervalHelpers);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAmDvE;;GAEG;AACH,wBAAgB,uCAAuC,CACtD,YAAY,EAAE,YAAY,GACxB,uBAAuB,CAAC,WAAW,CAGrC"}
1
+ {"version":3,"file":"overlappingSequenceIntervalsIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAmDvE;;GAEG;AACH,wBAAgB,uCAAuC,CACtD,YAAY,EAAE,YAAY,GACxB,uBAAuB,CAAC,WAAW,CAGrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"overlappingSequenceIntervalsIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/overlappingSequenceIntervalsIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,yCAAyC;AAEzC,OAAO,EAGN,aAAa,EACb,yBAAyB,EACzB,sBAAsB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;GAEG;AACH,MAAM,iCACL,SAAQ,yBAA2C;IAGnD,YAAY,MAAc;QACzB,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACxC,CAAC;IAEM,gCAAgC,CACtC,WAA0E,EAC1E,SAAwE;QAExE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YAC1C,OAAO,EAAE,CAAC;SACV;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;YACtD,OAAO,EAAE,CAAC;SACV;QAED,MAAM,iBAAiB,GAAG,IAAI,gBAAgB,CAC7C,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,YAA0B;IAE1B,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/* eslint-disable import/no-deprecated */\n\nimport {\n\tClient,\n\tISegment,\n\tReferenceType,\n\tcompareReferencePositions,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree\";\nimport {\n\tsequenceIntervalHelpers,\n\tIntervalType,\n\tSequenceInterval,\n\tcreatePositionReferenceFromSegoff,\n} from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequenceIntervalIndexes } from \"./sequenceIntervalIndexes.js\";\nimport { OverlappingIntervalsIndex } from \"./overlappingIntervalsIndex.js\";\n\n/**\n * @public\n */\nclass OverlappingSequenceIntervalsIndex\n\textends OverlappingIntervalsIndex<SequenceInterval>\n\timplements SequenceIntervalIndexes.Overlapping\n{\n\tconstructor(client: Client) {\n\t\tsuper(client, sequenceIntervalHelpers);\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 SequenceInterval(\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: SharedString,\n): SequenceIntervalIndexes.Overlapping {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingSequenceIntervalsIndex(client);\n}\n"]}
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,4BAA4B,CAAC;AACpC,OAAO,EACN,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,iCAAiC,GACjC,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E;;GAEG;AACH,MAAM,iCACL,SAAQ,yBAA2C;IAGnD,YAAY,MAAc;QACzB,KAAK,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACxC,CAAC;IAEM,gCAAgC,CACtC,WAA0E,EAC1E,SAAwE;QAExE,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE;YAC1C,OAAO,EAAE,CAAC;SACV;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;YACtD,OAAO,EAAE,CAAC;SACV;QAED,MAAM,iBAAiB,GAAG,IAAI,gBAAgB,CAC7C,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,YAA0B;IAE1B,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\";\nimport {\n\tsequenceIntervalHelpers,\n\tIntervalType,\n\tSequenceInterval,\n\tcreatePositionReferenceFromSegoff,\n} from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequenceIntervalIndexes } from \"./sequenceIntervalIndexes.js\";\nimport { OverlappingIntervalsIndex } from \"./overlappingIntervalsIndex.js\";\n\n/**\n * @public\n */\nclass OverlappingSequenceIntervalsIndex\n\textends OverlappingIntervalsIndex<SequenceInterval>\n\timplements SequenceIntervalIndexes.Overlapping\n{\n\tconstructor(client: Client) {\n\t\tsuper(client, sequenceIntervalHelpers);\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 SequenceInterval(\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: SharedString,\n): SequenceIntervalIndexes.Overlapping {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new OverlappingSequenceIntervalsIndex(client);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"startpointInRangeIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/startpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAgC,MAAM,4BAA4B,CAAC;AAClF,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EAErB,gBAAgB,EAEhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB,CAAC,SAAS,SAAS,qBAAqB,CAC/E,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChC;;OAEG;IACH,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAC5E;AAED,qBAAa,sBAAsB,CAAC,SAAS,SAAS,qBAAqB,CAC1E,YAAW,uBAAuB,CAAC,SAAS,CAAC;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAGZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAwB/C,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAI9B,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAIjC,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE;CAiClF;AACD;;GAEG;AACH,wBAAgB,4BAA4B,CAC3C,YAAY,EAAE,YAAY,GACxB,uBAAuB,CAAC,gBAAgB,CAAC,CAG3C"}
1
+ {"version":3,"file":"startpointInRangeIndex.d.ts","sourceRoot":"","sources":["../../src/intervalIndex/startpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAgC,MAAM,4BAA4B,CAAC;AAClF,OAAO,EACN,gBAAgB,EAChB,qBAAqB,EAErB,gBAAgB,EAEhB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB,CAAC,SAAS,SAAS,qBAAqB,CAC/E,SAAQ,aAAa,CAAC,SAAS,CAAC;IAChC;;OAEG;IACH,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CAC5E;AAED,qBAAa,sBAAsB,CAAC,SAAS,SAAS,qBAAqB,CAC1E,YAAW,uBAAuB,CAAC,SAAS,CAAC;IAK5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAGZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC;IAwB/C,GAAG,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAI9B,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAIjC,kCAAkC,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE;CAiClF;AACD;;GAEG;AACH,wBAAgB,4BAA4B,CAC3C,YAAY,EAAE,YAAY,GACxB,uBAAuB,CAAC,gBAAgB,CAAC,CAG3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"startpointInRangeIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/startpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,yCAAyC;AAEzC,OAAO,EAA0B,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAGN,YAAY,EAEZ,uBAAuB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAyB,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgBpG,MAAM,OAAO,sBAAsB;IAKlC,YACkB,MAAc,EACd,OAAoC;QADpC,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAA6B;QAErD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAuB,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE;YACzF,MAAM,mBAAmB,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,mBAAmB,KAAK,CAAC,EAAE;gBAC9B,OAAO,mBAAmB,CAAC;aAC3B;YAED,MAAM,uBAAuB,GAAG,oBAAoB,CACnD,CAAmC,EACnC,CAAmC,CACnC,CAAC;YACF,IAAI,uBAAuB,KAAK,CAAC,EAAE;gBAClC,OAAO,uBAAuB,CAAC;aAC/B;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC3C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aAC9B;YACD,OAAO,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,GAAG,CAAC,QAAmB;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,QAAmB;QAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,kCAAkC,CAAC,KAAa,EAAE,GAAW;QACnE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE;YAC7D,OAAO,EAAE,CAAC;SACV;QACD,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,MAAM,GAAyC,CAAC,IAAI,EAAE,EAAE;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACjD,WAAW,EACX,KAAK,EACL,KAAK,EACL,IAAI,CAAC,MAAM,EACX,YAAY,CAAC,SAAS,CACtB,CAAC;QAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAC/C,WAAW,EACX,GAAG,EACH,GAAG,EACH,IAAI,CAAC,MAAM,EACX,YAAY,CAAC,SAAS,CACtB,CAAC;QAEF,sDAAsD;QACrD,sBAAyD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,oBAAuD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AACD;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC3C,YAA0B;IAE1B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,sBAAsB,CAAmB,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACtF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable import/no-deprecated */\n\nimport { Client, PropertyAction, RedBlackTree } from \"@fluidframework/merge-tree\";\nimport {\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tIntervalType,\n\tSequenceInterval,\n\tsequenceIntervalHelpers,\n} from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { IntervalIndex } from \"./intervalIndex.js\";\nimport { HasComparisonOverride, compareOverrideables, forceCompare } from \"./intervalIndexUtils.js\";\n\n/**\n * Collection of intervals.\n *\n * Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.\n * @internal\n */\nexport interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>\n\textends IntervalIndex<TInterval> {\n\t/**\n\t * @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)\n\t */\n\tfindIntervalsWithStartpointInRange(start: number, end: number): TInterval[];\n}\n\nexport class StartpointInRangeIndex<TInterval extends ISerializableInterval>\n\timplements IStartpointInRangeIndex<TInterval>\n{\n\tprivate readonly intervalTree;\n\n\tconstructor(\n\t\tprivate readonly client: Client,\n\t\tprivate readonly helpers: IIntervalHelpers<TInterval>,\n\t) {\n\t\tthis.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {\n\t\t\tconst compareStartsResult = a.compareStart(b);\n\t\t\tif (compareStartsResult !== 0) {\n\t\t\t\treturn compareStartsResult;\n\t\t\t}\n\n\t\t\tconst overrideablesComparison = compareOverrideables(\n\t\t\t\ta as Partial<HasComparisonOverride>,\n\t\t\t\tb as Partial<HasComparisonOverride>,\n\t\t\t);\n\t\t\tif (overrideablesComparison !== 0) {\n\t\t\t\treturn overrideablesComparison;\n\t\t\t}\n\t\t\tconst aId = a.getIntervalId();\n\t\t\tconst bId = b.getIntervalId();\n\t\t\tif (aId !== undefined && bId !== undefined) {\n\t\t\t\treturn aId.localeCompare(bId);\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t}\n\n\tpublic add(interval: TInterval): void {\n\t\tthis.intervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: TInterval): void {\n\t\tthis.intervalTree.remove(interval);\n\t}\n\n\tpublic findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {\n\t\tif (start <= 0 || start > end || this.intervalTree.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst results: TInterval[] = [];\n\t\tconst action: PropertyAction<TInterval, TInterval> = (node) => {\n\t\t\tresults.push(node.data);\n\t\t\treturn true;\n\t\t};\n\n\t\tconst transientStartInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tstart,\n\t\t\tstart,\n\t\t\tthis.client,\n\t\t\tIntervalType.Transient,\n\t\t);\n\n\t\tconst transientEndInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tend,\n\t\t\tend,\n\t\t\tthis.client,\n\t\t\tIntervalType.Transient,\n\t\t);\n\n\t\t// Add comparison overrides to the transient intervals\n\t\t(transientStartInterval as Partial<HasComparisonOverride>)[forceCompare] = -1;\n\t\t(transientEndInterval as Partial<HasComparisonOverride>)[forceCompare] = 1;\n\n\t\tthis.intervalTree.mapRange(action, results, transientStartInterval, transientEndInterval);\n\t\treturn results;\n\t}\n}\n/**\n * @internal\n */\nexport function createStartpointInRangeIndex(\n\tsharedString: SharedString,\n): IStartpointInRangeIndex<SequenceInterval> {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);\n}\n"]}
1
+ {"version":3,"file":"startpointInRangeIndex.js","sourceRoot":"","sources":["../../src/intervalIndex/startpointInRangeIndex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yCAAyC;AAEzC,OAAO,EAA0B,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAGN,YAAY,EAEZ,uBAAuB,GACvB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAyB,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgBpG,MAAM,OAAO,sBAAsB;IAKlC,YACkB,MAAc,EACd,OAAoC;QADpC,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAA6B;QAErD,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAuB,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE;YACzF,MAAM,mBAAmB,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,mBAAmB,KAAK,CAAC,EAAE;gBAC9B,OAAO,mBAAmB,CAAC;aAC3B;YAED,MAAM,uBAAuB,GAAG,oBAAoB,CACnD,CAAmC,EACnC,CAAmC,CACnC,CAAC;YACF,IAAI,uBAAuB,KAAK,CAAC,EAAE;gBAClC,OAAO,uBAAuB,CAAC;aAC/B;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE;gBAC3C,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aAC9B;YACD,OAAO,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,GAAG,CAAC,QAAmB;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEM,MAAM,CAAC,QAAmB;QAChC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEM,kCAAkC,CAAC,KAAa,EAAE,GAAW;QACnE,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE;YAC7D,OAAO,EAAE,CAAC;SACV;QACD,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,MAAM,GAAyC,CAAC,IAAI,EAAE,EAAE;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CACjD,WAAW,EACX,KAAK,EACL,KAAK,EACL,IAAI,CAAC,MAAM,EACX,YAAY,CAAC,SAAS,CACtB,CAAC;QAEF,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAC/C,WAAW,EACX,GAAG,EACH,GAAG,EACH,IAAI,CAAC,MAAM,EACX,YAAY,CAAC,SAAS,CACtB,CAAC;QAEF,sDAAsD;QACrD,sBAAyD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,oBAAuD,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC;IAChB,CAAC;CACD;AACD;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC3C,YAA0B;IAE1B,MAAM,MAAM,GAAI,YAA8C,CAAC,MAAM,CAAC;IACtE,OAAO,IAAI,sBAAsB,CAAmB,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACtF,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 { Client, PropertyAction, RedBlackTree } from \"@fluidframework/merge-tree\";\nimport {\n\tIIntervalHelpers,\n\tISerializableInterval,\n\tIntervalType,\n\tSequenceInterval,\n\tsequenceIntervalHelpers,\n} from \"../intervals/index.js\";\nimport { SharedString } from \"../sharedString.js\";\nimport { IntervalIndex } from \"./intervalIndex.js\";\nimport { HasComparisonOverride, compareOverrideables, forceCompare } from \"./intervalIndexUtils.js\";\n\n/**\n * Collection of intervals.\n *\n * Provide additional APIs to support efficiently querying a collection of intervals whose startpoints fall within a specified range.\n * @internal\n */\nexport interface IStartpointInRangeIndex<TInterval extends ISerializableInterval>\n\textends IntervalIndex<TInterval> {\n\t/**\n\t * @returns an array of all intervals contained in this collection whose startpoints locate in the range [start, end] (includes both ends)\n\t */\n\tfindIntervalsWithStartpointInRange(start: number, end: number): TInterval[];\n}\n\nexport class StartpointInRangeIndex<TInterval extends ISerializableInterval>\n\timplements IStartpointInRangeIndex<TInterval>\n{\n\tprivate readonly intervalTree;\n\n\tconstructor(\n\t\tprivate readonly client: Client,\n\t\tprivate readonly helpers: IIntervalHelpers<TInterval>,\n\t) {\n\t\tthis.intervalTree = new RedBlackTree<TInterval, TInterval>((a: TInterval, b: TInterval) => {\n\t\t\tconst compareStartsResult = a.compareStart(b);\n\t\t\tif (compareStartsResult !== 0) {\n\t\t\t\treturn compareStartsResult;\n\t\t\t}\n\n\t\t\tconst overrideablesComparison = compareOverrideables(\n\t\t\t\ta as Partial<HasComparisonOverride>,\n\t\t\t\tb as Partial<HasComparisonOverride>,\n\t\t\t);\n\t\t\tif (overrideablesComparison !== 0) {\n\t\t\t\treturn overrideablesComparison;\n\t\t\t}\n\t\t\tconst aId = a.getIntervalId();\n\t\t\tconst bId = b.getIntervalId();\n\t\t\tif (aId !== undefined && bId !== undefined) {\n\t\t\t\treturn aId.localeCompare(bId);\n\t\t\t}\n\t\t\treturn 0;\n\t\t});\n\t}\n\n\tpublic add(interval: TInterval): void {\n\t\tthis.intervalTree.put(interval, interval);\n\t}\n\n\tpublic remove(interval: TInterval): void {\n\t\tthis.intervalTree.remove(interval);\n\t}\n\n\tpublic findIntervalsWithStartpointInRange(start: number, end: number): TInterval[] {\n\t\tif (start <= 0 || start > end || this.intervalTree.isEmpty()) {\n\t\t\treturn [];\n\t\t}\n\t\tconst results: TInterval[] = [];\n\t\tconst action: PropertyAction<TInterval, TInterval> = (node) => {\n\t\t\tresults.push(node.data);\n\t\t\treturn true;\n\t\t};\n\n\t\tconst transientStartInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tstart,\n\t\t\tstart,\n\t\t\tthis.client,\n\t\t\tIntervalType.Transient,\n\t\t);\n\n\t\tconst transientEndInterval = this.helpers.create(\n\t\t\t\"transient\",\n\t\t\tend,\n\t\t\tend,\n\t\t\tthis.client,\n\t\t\tIntervalType.Transient,\n\t\t);\n\n\t\t// Add comparison overrides to the transient intervals\n\t\t(transientStartInterval as Partial<HasComparisonOverride>)[forceCompare] = -1;\n\t\t(transientEndInterval as Partial<HasComparisonOverride>)[forceCompare] = 1;\n\n\t\tthis.intervalTree.mapRange(action, results, transientStartInterval, transientEndInterval);\n\t\treturn results;\n\t}\n}\n/**\n * @internal\n */\nexport function createStartpointInRangeIndex(\n\tsharedString: SharedString,\n): IStartpointInRangeIndex<SequenceInterval> {\n\tconst client = (sharedString as unknown as { client: Client }).client;\n\treturn new StartpointInRangeIndex<SequenceInterval>(client, sequenceIntervalHelpers);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interval.d.ts","sourceRoot":"","sources":["../../src/intervals/interval.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACN,iBAAiB,EACjB,WAAW,EAGX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAAE,aAAa,EAAyB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG;;;GAGG;AACH,qBAAa,QAAS,YAAW,qBAAqB;IAe7C,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IAfnB;;OAEG;IACI,UAAU,EAAE,WAAW,CAAoB;IAElD,KAAK;IACE,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,SAAgB,eAAe,EAAE,iBAAiB,CAA2B;gBAGrE,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,WAAW;IAOpB;;OAEG;IACI,aAAa,IAAI,MAAM;IAM9B;;OAEG;IACI,yBAAyB,IAAI,WAAW,EAAE;IAIjD;;;;;;;OAOG;IACI,cAAc,CAAC,KAAK,EAAE,WAAW;IAOxC;;OAEG;IACI,SAAS,IAAI,mBAAmB;IAavC;;OAEG;IACI,KAAK;IAIZ;;OAEG;IACI,OAAO,CAAC,CAAC,EAAE,QAAQ;IAsB1B;;OAEG;IACI,YAAY,CAAC,CAAC,EAAE,QAAQ;IAI/B;;OAEG;IACI,UAAU,CAAC,CAAC,EAAE,QAAQ;IAI7B;;OAEG;IACI,QAAQ,CAAC,CAAC,EAAE,QAAQ;IAK3B;;OAEG;IACI,KAAK,CAAC,CAAC,EAAE,QAAQ;IAQjB,aAAa;IAIpB;;OAEG;IACI,aAAa,CACnB,QAAQ,EAAE,WAAW,EACrB,aAAa,GAAE,OAAe,EAC9B,GAAG,CAAC,EAAE,MAAM,GACV,WAAW,GAAG,SAAS;IAW1B;;OAEG;IACI,MAAM,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,EACnB,EAAE,CAAC,EAAE,yBAAyB;CAyB/B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,QAAQ,CAiBhG;AAED,eAAO,MAAM,eAAe,EAAE,gBAAgB,CAAC,QAAQ,CAEtD,CAAC"}
1
+ {"version":3,"file":"interval.d.ts","sourceRoot":"","sources":["../../src/intervals/interval.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACN,iBAAiB,EACjB,WAAW,EAGX,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAGjF,OAAO,EAAE,aAAa,EAAyB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElG;;;GAGG;AACH,qBAAa,QAAS,YAAW,qBAAqB;IAe7C,KAAK,EAAE,MAAM;IACb,GAAG,EAAE,MAAM;IAfnB;;OAEG;IACI,UAAU,EAAE,WAAW,CAAoB;IAElD,KAAK;IACE,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IAE3C;;OAEG;IACH,SAAgB,eAAe,EAAE,iBAAiB,CAA2B;gBAGrE,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,WAAW;IAOpB;;OAEG;IACI,aAAa,IAAI,MAAM;IAM9B;;OAEG;IACI,yBAAyB,IAAI,WAAW,EAAE;IAIjD;;;;;;;OAOG;IACI,cAAc,CAAC,KAAK,EAAE,WAAW;IAOxC;;OAEG;IACI,SAAS,IAAI,mBAAmB;IAavC;;OAEG;IACI,KAAK;IAIZ;;OAEG;IACI,OAAO,CAAC,CAAC,EAAE,QAAQ;IAsB1B;;OAEG;IACI,YAAY,CAAC,CAAC,EAAE,QAAQ;IAI/B;;OAEG;IACI,UAAU,CAAC,CAAC,EAAE,QAAQ;IAI7B;;OAEG;IACI,QAAQ,CAAC,CAAC,EAAE,QAAQ;IAK3B;;OAEG;IACI,KAAK,CAAC,CAAC,EAAE,QAAQ;IAQjB,aAAa;IAIpB;;OAEG;IACI,aAAa,CACnB,QAAQ,EAAE,WAAW,EACrB,aAAa,GAAE,OAAe,EAC9B,GAAG,CAAC,EAAE,MAAM,GACV,WAAW,GAAG,SAAS;IAW1B;;OAEG;IACI,MAAM,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,aAAa,EACrB,GAAG,CAAC,EAAE,aAAa,EACnB,EAAE,CAAC,EAAE,yBAAyB;CAyB/B;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,QAAQ,CAiBhG;AAED,eAAO,MAAM,eAAe,EAAE,gBAAgB,CAAC,QAAQ,CAEtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"interval.js","sourceRoot":"","sources":["../../src/intervals/interval.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n/* eslint-disable import/no-deprecated */\n\nimport {\n\tPropertiesManager,\n\tPropertySet,\n\tcreateMap,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport { SequencePlace, reservedIntervalIdKey } from \"../intervalCollection.js\";\nimport { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from \"./intervalUtils.js\";\n\n/**\n * Serializable interval whose endpoints are plain-old numbers.\n * @internal\n */\nexport class Interval implements ISerializableInterval {\n\t/**\n\t * {@inheritDoc ISerializableInterval.properties}\n\t */\n\tpublic properties: PropertySet = createMap<any>();\n\n\t/***/\n\tpublic auxProps: PropertySet[] | undefined;\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.propertyManager}\n\t */\n\tpublic readonly propertyManager: PropertiesManager = new PropertiesManager();\n\n\tconstructor(\n\t\tpublic start: number,\n\t\tpublic end: number,\n\t\tprops?: PropertySet,\n\t) {\n\t\tif (props) {\n\t\t\tthis.addProperties(props);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.getIntervalId}\n\t */\n\tpublic getIntervalId(): string {\n\t\tconst id = this.properties?.[reservedIntervalIdKey];\n\t\tassert(id !== undefined, 0x5e1 /* interval ID should not be undefined */);\n\t\treturn `${id}`;\n\t}\n\n\t/**\n\t * @returns an array containing any auxiliary property sets added with `addPropertySet`.\n\t */\n\tpublic getAdditionalPropertySets(): PropertySet[] {\n\t\treturn this.auxProps ?? [];\n\t}\n\n\t/**\n\t * Adds an auxiliary set of properties to this interval.\n\t * These properties can be recovered using `getAdditionalPropertySets`\n\t * @param props - set of properties to add\n\t * @remarks This gets called as part of the default conflict resolver for `IIntervalCollection<Interval>`\n\t * (i.e. non-sequence-based interval collections). However, the additional properties don't get serialized.\n\t * This functionality seems half-baked.\n\t */\n\tpublic addPropertySet(props: PropertySet) {\n\t\tif (this.auxProps === undefined) {\n\t\t\tthis.auxProps = [];\n\t\t}\n\t\tthis.auxProps.push(props);\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.serialize}\n\t */\n\tpublic serialize(): ISerializedInterval {\n\t\tconst serializedInterval: ISerializedInterval = {\n\t\t\tend: this.end,\n\t\t\tintervalType: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tstart: this.start,\n\t\t};\n\t\tif (this.properties) {\n\t\t\tserializedInterval.properties = this.properties;\n\t\t}\n\t\treturn serializedInterval;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.clone}\n\t */\n\tpublic clone() {\n\t\treturn new Interval(this.start, this.end, this.properties);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compare}\n\t */\n\tpublic compare(b: Interval) {\n\t\tconst startResult = this.compareStart(b);\n\t\tif (startResult === 0) {\n\t\t\tconst endResult = this.compareEnd(b);\n\t\t\tif (endResult === 0) {\n\t\t\t\tconst thisId = this.getIntervalId();\n\t\t\t\tif (thisId) {\n\t\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\t\tif (bId) {\n\t\t\t\t\t\treturn thisId > bId ? 1 : thisId < bId ? -1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn endResult;\n\t\t\t}\n\t\t} else {\n\t\t\treturn startResult;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareStart}\n\t */\n\tpublic compareStart(b: Interval) {\n\t\treturn this.start - b.start;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareEnd}\n\t */\n\tpublic compareEnd(b: Interval) {\n\t\treturn this.end - b.end;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.overlaps}\n\t */\n\tpublic overlaps(b: Interval) {\n\t\tconst result = this.start <= b.end && this.end >= b.start;\n\t\treturn result;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.union}\n\t */\n\tpublic union(b: Interval) {\n\t\treturn new Interval(\n\t\t\tMath.min(this.start, b.start),\n\t\t\tMath.max(this.end, b.end),\n\t\t\tthis.properties,\n\t\t);\n\t}\n\n\tpublic getProperties() {\n\t\treturn this.properties;\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.addProperties}\n\t */\n\tpublic addProperties(\n\t\tnewProps: PropertySet,\n\t\tcollaborating: boolean = false,\n\t\tseq?: number,\n\t): PropertySet | undefined {\n\t\tif (newProps) {\n\t\t\treturn this.propertyManager.addProperties(\n\t\t\t\tthis.properties,\n\t\t\t\tnewProps,\n\t\t\t\tseq,\n\t\t\t\tcollaborating,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.modify}\n\t */\n\tpublic modify(\n\t\tlabel: string,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t\top?: ISequencedDocumentMessage,\n\t) {\n\t\tif (typeof start === \"string\" || typeof end === \"string\") {\n\t\t\tthrow new UsageError(\n\t\t\t\t\"The start and end positions of a plain interval may not be on the special endpoint segments.\",\n\t\t\t);\n\t\t}\n\n\t\tconst startPos = typeof start === \"number\" ? start : start?.pos ?? this.start;\n\t\tconst endPos = typeof end === \"number\" ? end : end?.pos ?? this.end;\n\n\t\tif (this.start === startPos && this.end === endPos) {\n\t\t\t// Return undefined to indicate that no change is necessary.\n\t\t\treturn;\n\t\t}\n\t\tconst newInterval = new Interval(startPos, endPos);\n\t\tif (this.properties) {\n\t\t\tthis.propertyManager.copyTo(\n\t\t\t\tthis.properties,\n\t\t\t\tnewInterval.properties,\n\t\t\t\tnewInterval.propertyManager,\n\t\t\t);\n\t\t}\n\t\treturn newInterval;\n\t}\n}\n\nexport function createInterval(label: string, start: SequencePlace, end: SequencePlace): Interval {\n\tif (typeof start === \"string\" || typeof end === \"string\") {\n\t\tthrow new UsageError(\n\t\t\t\"The start and end positions of a plain interval may not be on the special endpoint segments.\",\n\t\t);\n\t}\n\n\tconst rangeProp: PropertySet = {};\n\n\tif (label && label.length > 0) {\n\t\trangeProp[reservedRangeLabelsKey] = [label];\n\t}\n\n\tconst startPos = typeof start === \"number\" ? start : start.pos;\n\tconst endPos = typeof end === \"number\" ? end : end.pos;\n\n\treturn new Interval(startPos, endPos, rangeProp);\n}\n\nexport const intervalHelpers: IIntervalHelpers<Interval> = {\n\tcreate: createInterval,\n};\n"]}
1
+ {"version":3,"file":"interval.js","sourceRoot":"","sources":["../../src/intervals/interval.ts"],"names":[],"mappings":"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","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\tPropertiesManager,\n\tPropertySet,\n\tcreateMap,\n\treservedRangeLabelsKey,\n} from \"@fluidframework/merge-tree\";\nimport { ISequencedDocumentMessage } from \"@fluidframework/protocol-definitions\";\nimport { assert } from \"@fluidframework/core-utils\";\nimport { UsageError } from \"@fluidframework/telemetry-utils\";\nimport { SequencePlace, reservedIntervalIdKey } from \"../intervalCollection.js\";\nimport { IIntervalHelpers, ISerializableInterval, ISerializedInterval } from \"./intervalUtils.js\";\n\n/**\n * Serializable interval whose endpoints are plain-old numbers.\n * @internal\n */\nexport class Interval implements ISerializableInterval {\n\t/**\n\t * {@inheritDoc ISerializableInterval.properties}\n\t */\n\tpublic properties: PropertySet = createMap<any>();\n\n\t/***/\n\tpublic auxProps: PropertySet[] | undefined;\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.propertyManager}\n\t */\n\tpublic readonly propertyManager: PropertiesManager = new PropertiesManager();\n\n\tconstructor(\n\t\tpublic start: number,\n\t\tpublic end: number,\n\t\tprops?: PropertySet,\n\t) {\n\t\tif (props) {\n\t\t\tthis.addProperties(props);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.getIntervalId}\n\t */\n\tpublic getIntervalId(): string {\n\t\tconst id = this.properties?.[reservedIntervalIdKey];\n\t\tassert(id !== undefined, 0x5e1 /* interval ID should not be undefined */);\n\t\treturn `${id}`;\n\t}\n\n\t/**\n\t * @returns an array containing any auxiliary property sets added with `addPropertySet`.\n\t */\n\tpublic getAdditionalPropertySets(): PropertySet[] {\n\t\treturn this.auxProps ?? [];\n\t}\n\n\t/**\n\t * Adds an auxiliary set of properties to this interval.\n\t * These properties can be recovered using `getAdditionalPropertySets`\n\t * @param props - set of properties to add\n\t * @remarks This gets called as part of the default conflict resolver for `IIntervalCollection<Interval>`\n\t * (i.e. non-sequence-based interval collections). However, the additional properties don't get serialized.\n\t * This functionality seems half-baked.\n\t */\n\tpublic addPropertySet(props: PropertySet) {\n\t\tif (this.auxProps === undefined) {\n\t\t\tthis.auxProps = [];\n\t\t}\n\t\tthis.auxProps.push(props);\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.serialize}\n\t */\n\tpublic serialize(): ISerializedInterval {\n\t\tconst serializedInterval: ISerializedInterval = {\n\t\t\tend: this.end,\n\t\t\tintervalType: 0,\n\t\t\tsequenceNumber: 0,\n\t\t\tstart: this.start,\n\t\t};\n\t\tif (this.properties) {\n\t\t\tserializedInterval.properties = this.properties;\n\t\t}\n\t\treturn serializedInterval;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.clone}\n\t */\n\tpublic clone() {\n\t\treturn new Interval(this.start, this.end, this.properties);\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compare}\n\t */\n\tpublic compare(b: Interval) {\n\t\tconst startResult = this.compareStart(b);\n\t\tif (startResult === 0) {\n\t\t\tconst endResult = this.compareEnd(b);\n\t\t\tif (endResult === 0) {\n\t\t\t\tconst thisId = this.getIntervalId();\n\t\t\t\tif (thisId) {\n\t\t\t\t\tconst bId = b.getIntervalId();\n\t\t\t\t\tif (bId) {\n\t\t\t\t\t\treturn thisId > bId ? 1 : thisId < bId ? -1 : 0;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn endResult;\n\t\t\t}\n\t\t} else {\n\t\t\treturn startResult;\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareStart}\n\t */\n\tpublic compareStart(b: Interval) {\n\t\treturn this.start - b.start;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.compareEnd}\n\t */\n\tpublic compareEnd(b: Interval) {\n\t\treturn this.end - b.end;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.overlaps}\n\t */\n\tpublic overlaps(b: Interval) {\n\t\tconst result = this.start <= b.end && this.end >= b.start;\n\t\treturn result;\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.union}\n\t */\n\tpublic union(b: Interval) {\n\t\treturn new Interval(\n\t\t\tMath.min(this.start, b.start),\n\t\t\tMath.max(this.end, b.end),\n\t\t\tthis.properties,\n\t\t);\n\t}\n\n\tpublic getProperties() {\n\t\treturn this.properties;\n\t}\n\n\t/**\n\t * {@inheritDoc ISerializableInterval.addProperties}\n\t */\n\tpublic addProperties(\n\t\tnewProps: PropertySet,\n\t\tcollaborating: boolean = false,\n\t\tseq?: number,\n\t): PropertySet | undefined {\n\t\tif (newProps) {\n\t\t\treturn this.propertyManager.addProperties(\n\t\t\t\tthis.properties,\n\t\t\t\tnewProps,\n\t\t\t\tseq,\n\t\t\t\tcollaborating,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * {@inheritDoc IInterval.modify}\n\t */\n\tpublic modify(\n\t\tlabel: string,\n\t\tstart?: SequencePlace,\n\t\tend?: SequencePlace,\n\t\top?: ISequencedDocumentMessage,\n\t) {\n\t\tif (typeof start === \"string\" || typeof end === \"string\") {\n\t\t\tthrow new UsageError(\n\t\t\t\t\"The start and end positions of a plain interval may not be on the special endpoint segments.\",\n\t\t\t);\n\t\t}\n\n\t\tconst startPos = typeof start === \"number\" ? start : start?.pos ?? this.start;\n\t\tconst endPos = typeof end === \"number\" ? end : end?.pos ?? this.end;\n\n\t\tif (this.start === startPos && this.end === endPos) {\n\t\t\t// Return undefined to indicate that no change is necessary.\n\t\t\treturn;\n\t\t}\n\t\tconst newInterval = new Interval(startPos, endPos);\n\t\tif (this.properties) {\n\t\t\tthis.propertyManager.copyTo(\n\t\t\t\tthis.properties,\n\t\t\t\tnewInterval.properties,\n\t\t\t\tnewInterval.propertyManager,\n\t\t\t);\n\t\t}\n\t\treturn newInterval;\n\t}\n}\n\nexport function createInterval(label: string, start: SequencePlace, end: SequencePlace): Interval {\n\tif (typeof start === \"string\" || typeof end === \"string\") {\n\t\tthrow new UsageError(\n\t\t\t\"The start and end positions of a plain interval may not be on the special endpoint segments.\",\n\t\t);\n\t}\n\n\tconst rangeProp: PropertySet = {};\n\n\tif (label && label.length > 0) {\n\t\trangeProp[reservedRangeLabelsKey] = [label];\n\t}\n\n\tconst startPos = typeof start === \"number\" ? start : start.pos;\n\tconst endPos = typeof end === \"number\" ? end : end.pos;\n\n\treturn new Interval(startPos, endPos, rangeProp);\n}\n\nexport const intervalHelpers: IIntervalHelpers<Interval> = {\n\tcreate: createInterval,\n};\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/sequence";
8
- export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export declare const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/sequence";
8
- export const pkgVersion = "2.0.0-dev-rc.2.0.0.245554";
8
+ export const pkgVersion = "2.0.0-dev-rc.2.0.0.246488";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.245554\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/sequence\";\nexport const pkgVersion = \"2.0.0-dev-rc.2.0.0.246488\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"fuzzUtils.js","sourceRoot":"","sources":["../../../src/test/fuzz/fuzzUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport * as path from \"path\";\nimport { strict as assert } from \"assert\";\nimport {\n\tAcceptanceCondition,\n\tcombineReducersAsync,\n\tAsyncReducer,\n\tAsyncGenerator,\n\tcreateWeightedAsyncGenerator,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { DDSFuzzModel, DDSFuzzSuiteOptions, DDSFuzzTestState } from \"@fluid-private/test-dds-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport { revertSharedStringRevertibles, SharedStringRevertible } from \"../../revertibles.js\";\nimport { SharedStringFactory } from \"../../sequenceFactory.js\";\nimport { SharedString } from \"../../sharedString.js\";\nimport { Side, type IIntervalCollection } from \"../../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"../intervalTestUtils.js\";\nimport { _dirname } from \"../dirname.cjs\";\nimport type { SequenceInterval } from \"../../index.js\";\n\nexport type RevertibleSharedString = SharedString & {\n\trevertibles: SharedStringRevertible[];\n\t// This field prevents change events that are emitted while in the process of a revert from\n\t// being added into the revertibles stack.\n\tisCurrentRevert: boolean;\n};\nexport function isRevertibleSharedString(s: SharedString): s is RevertibleSharedString {\n\treturn (s as RevertibleSharedString).revertibles !== undefined;\n}\n\nexport interface RangeSpec {\n\tstart: number;\n\tend: number;\n}\n\nexport interface IntervalCollectionSpec {\n\tcollectionName: string;\n}\n\nexport interface AddText {\n\ttype: \"addText\";\n\tindex: number;\n\tcontent: string;\n}\n\nexport interface RemoveRange extends RangeSpec {\n\ttype: \"removeRange\";\n}\n\nexport interface ObliterateRange extends RangeSpec {\n\ttype: \"obliterateRange\";\n}\n\n// For non-interval collection fuzzing, annotating text would also be useful.\nexport interface AddInterval extends IntervalCollectionSpec, RangeSpec {\n\ttype: \"addInterval\";\n\t// Normally interval ids get autogenerated, but including it here allows tracking\n\t// what happened to an interval over the course of its lifetime based on the history\n\t// file, which is useful for debugging test failures.\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n}\n\nexport interface ChangeInterval extends IntervalCollectionSpec {\n\ttype: \"changeInterval\";\n\tstart: number | undefined;\n\tend: number | undefined;\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n\tproperties: PropertySet | undefined;\n}\n\nexport interface DeleteInterval extends IntervalCollectionSpec {\n\ttype: \"deleteInterval\";\n\tid: string;\n}\n\nexport interface RevertSharedStringRevertibles {\n\ttype: \"revertSharedStringRevertibles\";\n\teditsToRevert: number;\n}\n\nexport interface RevertibleWeights {\n\trevertWeight: number;\n\taddText: number;\n\tremoveRange: number;\n\tobliterateRange: number;\n\taddInterval: number;\n\tdeleteInterval: number;\n\tchangeInterval: number;\n}\n\nexport type IntervalOperation = AddInterval | ChangeInterval | DeleteInterval;\nexport type OperationWithRevert = IntervalOperation | RevertSharedStringRevertibles;\nexport type TextOperation = AddText | RemoveRange | ObliterateRange;\n\nexport type ClientOperation = IntervalOperation | TextOperation;\n\nexport type RevertOperation = OperationWithRevert | TextOperation;\nexport type Operation = RevertOperation;\n\nexport type FuzzTestState = DDSFuzzTestState<SharedStringFactory>;\n\nexport interface SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum length of the SharedString (locally) before no further AddText operations are generated.\n\t * Note due to concurrency, during test execution the actual length of the string may exceed this.\n\t */\n\tmaxStringLength?: number;\n\tmaxInsertLength?: number;\n\tweights?: {\n\t\taddText: number;\n\t\tremoveRange: number;\n\t\tobliterateRange: number;\n\t};\n}\n\nexport interface IntervalOperationGenerationConfig extends SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum number of intervals (locally) before no further AddInterval operations are generated.\n\t * Note due to concurrency, during test execution the actual number of intervals may exceed this.\n\t */\n\tmaxIntervals?: number;\n\tintervalCollectionNamePool?: string[];\n\tpropertyNamePool?: string[];\n\tvalidateInterval?: number;\n\tweights?: RevertibleWeights & SharedStringOperationGenerationConfig[\"weights\"];\n}\n\nexport const defaultSharedStringOperationGenerationConfig: Required<SharedStringOperationGenerationConfig> =\n\t{\n\t\tmaxStringLength: 1000,\n\t\tmaxInsertLength: 10,\n\t\tweights: {\n\t\t\taddText: 2,\n\t\t\tremoveRange: 1,\n\t\t\tobliterateRange: 1,\n\t\t},\n\t};\nexport const defaultIntervalOperationGenerationConfig: Required<IntervalOperationGenerationConfig> =\n\t{\n\t\t...defaultSharedStringOperationGenerationConfig,\n\t\tmaxIntervals: 100,\n\t\tintervalCollectionNamePool: [\"comments\"],\n\t\tpropertyNamePool: [\"prop1\", \"prop2\", \"prop3\"],\n\t\tvalidateInterval: 100,\n\t\tweights: {\n\t\t\t...defaultSharedStringOperationGenerationConfig.weights,\n\t\t\trevertWeight: 2,\n\t\t\taddInterval: 2,\n\t\t\tdeleteInterval: 2,\n\t\t\tchangeInterval: 2,\n\t\t\tobliterateRange: 0,\n\t\t},\n\t};\n\nexport interface LoggingInfo {\n\t/** id of the interval to track over time */\n\tintervalId: string;\n\t/** Clients to print */\n\tclientIds: string[];\n}\n\nfunction logCurrentState(state: FuzzTestState, loggingInfo: LoggingInfo): void {\n\tfor (const id of loggingInfo.clientIds) {\n\t\tconst { channel } = state.clients.find((s) => s.containerRuntime.clientId === id) ?? {};\n\t\tassert(channel);\n\t\tconst labels = channel.getIntervalCollectionLabels();\n\t\tconst interval = Array.from(labels)\n\t\t\t.map((label) =>\n\t\t\t\tchannel.getIntervalCollection(label).getIntervalById(loggingInfo.intervalId),\n\t\t\t)\n\t\t\t.find((result) => result !== undefined);\n\n\t\tconsole.log(`Client ${id}:`);\n\t\tif (interval !== undefined) {\n\t\t\tconst start = channel.localReferencePositionToPosition(interval.start);\n\t\t\tconst end = channel.localReferencePositionToPosition(interval.end);\n\t\t\tif (end === start) {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}x`);\n\t\t\t} else {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}[${\" \".repeat(end - start - 1)}]`);\n\t\t\t}\n\t\t}\n\t\tconsole.log(channel.getText());\n\t\tconsole.log(\"\\n\");\n\t}\n}\n\ntype ClientOpState = FuzzTestState;\n\nexport function makeReducer(\n\tloggingInfo?: LoggingInfo,\n): AsyncReducer<Operation | RevertOperation, ClientOpState> {\n\tconst withLogging =\n\t\t<T>(baseReducer: AsyncReducer<T, ClientOpState>): AsyncReducer<T, ClientOpState> =>\n\t\tasync (state, operation) => {\n\t\t\tif (loggingInfo !== undefined) {\n\t\t\t\tlogCurrentState(state, loggingInfo);\n\t\t\t\tconsole.log(\"-\".repeat(20));\n\t\t\t\tconsole.log(\"Next operation:\", JSON.stringify(operation, undefined, 4));\n\t\t\t}\n\t\t\tawait baseReducer(state, operation);\n\t\t};\n\n\tconst reducer = combineReducersAsync<Operation | RevertOperation, ClientOpState>({\n\t\taddText: async ({ client }, { index, content }) => {\n\t\t\tclient.channel.insertText(index, content);\n\t\t},\n\t\tremoveRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.removeRange(start, end);\n\t\t},\n\t\tobliterateRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.obliterateRange(start, end);\n\t\t},\n\t\taddInterval: async ({ client }, { start, end, collectionName, id, startSide, endSide }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.add({\n\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\tprops: { intervalId: id },\n\t\t\t});\n\t\t},\n\t\tdeleteInterval: async ({ client }, { id, collectionName }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.removeIntervalById(id);\n\t\t},\n\t\tchangeInterval: async (\n\t\t\t{ client },\n\t\t\t{ id, start, end, collectionName, startSide, endSide, properties },\n\t\t) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tif (start !== undefined && end !== undefined) {\n\t\t\t\tcollection.change(id, {\n\t\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\t\tprops: properties,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcollection.change(id, { props: properties });\n\t\t\t}\n\t\t},\n\t\trevertSharedStringRevertibles: async ({ client }, { editsToRevert }) => {\n\t\t\tassert(isRevertibleSharedString(client.channel));\n\t\t\tclient.channel.isCurrentRevert = true;\n\t\t\tconst few = client.channel.revertibles.splice(-editsToRevert, editsToRevert);\n\t\t\trevertSharedStringRevertibles(client.channel, few);\n\t\t\tclient.channel.isCurrentRevert = false;\n\t\t},\n\t});\n\n\treturn withLogging(reducer);\n}\n\nexport function createSharedStringGeneratorOperations(\n\toptionsParam?: SharedStringOperationGenerationConfig,\n) {\n\tconst options = { ...defaultSharedStringOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\t// All subsequent helper functions are generators; note that they don't actually apply any operations.\n\tfunction startPosition({ random, client }: ClientOpState): number {\n\t\treturn random.integer(0, Math.max(0, client.channel.getLength() - 1));\n\t}\n\n\tfunction exclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength());\n\t\treturn { start, end };\n\t}\n\n\tfunction exclusiveRangeLeaveChar(state: ClientOpState): RangeSpec {\n\t\tconst start = state.random.integer(0, state.client.channel.getLength() - 2);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength() - 1);\n\t\treturn { start, end };\n\t}\n\n\tasync function addText(state: ClientOpState): Promise<AddText> {\n\t\tconst { random, client } = state;\n\t\treturn {\n\t\t\ttype: \"addText\",\n\t\t\tindex: random.integer(0, client.channel.getLength()),\n\t\t\tcontent: random.string(random.integer(1, options.maxInsertLength)),\n\t\t};\n\t}\n\n\tasync function obliterateRange(state: ClientOpState): Promise<ObliterateRange> {\n\t\treturn {\n\t\t\ttype: \"obliterateRange\",\n\t\t\t...exclusiveRange(state),\n\t\t};\n\t}\n\n\tasync function removeRange(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRange(state) };\n\t}\n\n\tasync function removeRangeLeaveChar(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRangeLeaveChar(state) };\n\t}\n\n\tconst lengthSatisfies =\n\t\t(criteria: (length: number) => boolean): AcceptanceCondition<ClientOpState> =>\n\t\t({ client }) =>\n\t\t\tcriteria(client.channel.getLength());\n\tconst hasNonzeroLength = lengthSatisfies((length) => length > 0);\n\tconst isShorterThanMaxLength = lengthSatisfies((length) => length < options.maxStringLength);\n\n\treturn {\n\t\tstartPosition,\n\t\texclusiveRange,\n\t\texclusiveRangeLeaveChar,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t};\n}\n\nexport class SharedStringFuzzFactory extends SharedStringFactory {\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<SharedString> {\n\t\truntime.options.intervalStickinessEnabled = true;\n\t\truntime.options.mergeTreeEnableObliterate = true;\n\t\treturn super.load(runtime, id, services, attributes);\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): SharedString {\n\t\tdocument.options.intervalStickinessEnabled = true;\n\t\tdocument.options.mergeTreeEnableObliterate = true;\n\t\treturn super.create(document, id);\n\t}\n}\n\nexport const baseModel: Omit<\n\tDDSFuzzModel<SharedStringFactory, Operation, FuzzTestState>,\n\t\"workloadName\" | \"generatorFactory\"\n> = {\n\treducer:\n\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t// { intervalId: \"00000000-0000-0000-0000-000000000000\", clientIds: [\"A\", \"B\", \"C\"] }\n\t\tmakeReducer(),\n\tvalidateConsistency: assertEquivalentSharedStrings,\n\tfactory: new SharedStringFuzzFactory(),\n\tminimizationTransforms: [\n\t\t(op) => {\n\t\t\tif (op.type !== \"addText\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\top.content = op.content.slice(1);\n\t\t},\n\t\t(op) => {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"addText\":\n\t\t\t\t\tif (op.index > 0) {\n\t\t\t\t\t\top.index -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removeRange\":\n\t\t\t\tcase \"addInterval\":\n\t\t\t\tcase \"changeInterval\":\n\t\t\t\t\tif (op.start !== undefined && op.start > 0) {\n\t\t\t\t\t\top.start -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\t\t\top.end -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t(op) => {\n\t\t\tif (\n\t\t\t\top.type !== \"removeRange\" &&\n\t\t\t\top.type !== \"addInterval\" &&\n\t\t\t\top.type !== \"changeInterval\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\top.end -= 1;\n\t\t\t}\n\t\t},\n\t],\n};\n\nexport const defaultFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\tvalidationStrategy: { type: \"fixedInterval\", interval: 10 },\n\treconnectProbability: 0.1,\n\tnumberOfClients: 3,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0.1,\n\t},\n\tdefaultTestCount: 100,\n\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/fuzz/results\") },\n\tparseOperations: (serialized: string) => {\n\t\tconst operations: Operation[] = JSON.parse(serialized);\n\t\t// Replace this value with some other interval ID and uncomment to filter replay of the test\n\t\t// suite to only include interval operations with this ID.\n\t\t// const filterIntervalId = \"00000000-0000-0000-0000-000000000000\";\n\t\t// if (filterIntervalId) {\n\t\t// \treturn operations.filter((entry) =>\n\t\t// \t\t[undefined, filterIntervalId].includes((entry as any).id),\n\t\t// \t);\n\t\t// }\n\t\treturn operations;\n\t},\n};\n\nexport function makeIntervalOperationGenerator(\n\toptionsParam?: IntervalOperationGenerationConfig,\n\talwaysLeaveChar: boolean = false,\n): AsyncGenerator<Operation, ClientOpState> {\n\tconst {\n\t\tstartPosition,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t} = createSharedStringGeneratorOperations(optionsParam);\n\n\tconst options = { ...defaultIntervalOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\tfunction isNonEmpty(collection: IIntervalCollection<SequenceInterval>): boolean {\n\t\tfor (const _ of collection) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction inclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(\n\t\t\tstart,\n\t\t\tMath.max(start, state.client.channel.getLength() - 1),\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\tfunction inclusiveRangeWithUndefined(\n\t\tstate: ClientOpState,\n\t): RangeSpec | { start: undefined; end: undefined } {\n\t\treturn state.random.bool() ? inclusiveRange(state) : { start: undefined, end: undefined };\n\t}\n\n\tfunction propertySet(state: ClientOpState): PropertySet {\n\t\tconst propNamesShuffled = [...options.propertyNamePool];\n\t\tstate.random.shuffle(propNamesShuffled);\n\t\tconst propsToChange = propNamesShuffled.slice(\n\t\t\t0,\n\t\t\tstate.random.integer(1, propNamesShuffled.length),\n\t\t);\n\t\tconst propSet: PropertySet = {};\n\t\tfor (const name of propsToChange) {\n\t\t\tpropSet[name] = state.random.string(5);\n\t\t}\n\t\treturn propSet;\n\t}\n\n\tfunction propertySetWithUndefined(state: ClientOpState): PropertySet | undefined {\n\t\treturn state.random.bool() ? propertySet(state) : undefined;\n\t}\n\n\tfunction nonEmptyIntervalCollection({ client, random }: ClientOpState): string {\n\t\tconst nonEmptyLabels = Array.from(client.channel.getIntervalCollectionLabels()).filter(\n\t\t\t(label) => {\n\t\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\t\treturn isNonEmpty(collection);\n\t\t\t},\n\t\t);\n\t\treturn random.pick(nonEmptyLabels);\n\t}\n\n\tfunction interval(state: ClientOpState): { collectionName: string; id: string } {\n\t\tconst collectionName = nonEmptyIntervalCollection(state);\n\t\tconst intervals = Array.from(state.client.channel.getIntervalCollection(collectionName));\n\t\tconst id = state.random.pick(intervals)?.getIntervalId();\n\t\tassert(id);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tcollectionName,\n\t\t};\n\t}\n\n\tasync function addInterval(state: ClientOpState): Promise<AddInterval> {\n\t\treturn {\n\t\t\ttype: \"addInterval\",\n\t\t\t...inclusiveRange(state),\n\t\t\tcollectionName: state.random.pick(options.intervalCollectionNamePool),\n\t\t\tid: state.random.uuid4(),\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t};\n\t}\n\n\tasync function deleteInterval(state: ClientOpState): Promise<DeleteInterval> {\n\t\treturn {\n\t\t\ttype: \"deleteInterval\",\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tasync function changeInterval(state: ClientOpState): Promise<ChangeInterval> {\n\t\tconst { start, end } = inclusiveRangeWithUndefined(state);\n\t\tconst properties = propertySetWithUndefined(state);\n\t\treturn {\n\t\t\ttype: \"changeInterval\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tproperties,\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tconst hasAnInterval = ({ client }: ClientOpState): boolean =>\n\t\tArray.from(client.channel.getIntervalCollectionLabels()).some((label) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\treturn isNonEmpty(collection);\n\t\t});\n\n\tconst hasNotTooManyIntervals: AcceptanceCondition<ClientOpState> = ({ client }) => {\n\t\tlet intervalCount = 0;\n\t\tfor (const label of client.channel.getIntervalCollectionLabels()) {\n\t\t\tfor (const _ of client.channel.getIntervalCollection(label)) {\n\t\t\t\tintervalCount++;\n\t\t\t\tif (intervalCount >= options.maxIntervals) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst all =\n\t\t<T>(...clauses: AcceptanceCondition<T>[]): AcceptanceCondition<T> =>\n\t\t(t: T) =>\n\t\t\tclauses.reduce<boolean>((prev, cond) => prev && cond(t), true);\n\tconst usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;\n\treturn createWeightedAsyncGenerator<Operation, ClientOpState>([\n\t\t[addText, usableWeights.addText, isShorterThanMaxLength],\n\t\t[\n\t\t\talwaysLeaveChar ? removeRangeLeaveChar : removeRange,\n\t\t\tusableWeights.removeRange,\n\t\t\talwaysLeaveChar\n\t\t\t\t? lengthSatisfies((length) => {\n\t\t\t\t\t\treturn length > 1;\n\t\t\t\t })\n\t\t\t\t: hasNonzeroLength,\n\t\t],\n\t\t[obliterateRange, usableWeights.obliterateRange, hasNonzeroLength],\n\t\t[addInterval, usableWeights.addInterval, all(hasNotTooManyIntervals, hasNonzeroLength)],\n\t\t[deleteInterval, usableWeights.deleteInterval, hasAnInterval],\n\t\t[changeInterval, usableWeights.changeInterval, all(hasAnInterval, hasNonzeroLength)],\n\t]);\n}\n"]}
1
+ {"version":3,"file":"fuzzUtils.js","sourceRoot":"","sources":["../../../src/test/fuzz/fuzzUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport * as path from \"path\";\nimport { strict as assert } from \"assert\";\nimport {\n\tAcceptanceCondition,\n\tcombineReducersAsync,\n\tAsyncReducer,\n\tAsyncGenerator,\n\tcreateWeightedAsyncGenerator,\n} from \"@fluid-private/stochastic-test-utils\";\nimport { DDSFuzzModel, DDSFuzzSuiteOptions, DDSFuzzTestState } from \"@fluid-private/test-dds-utils\";\nimport {\n\tIChannelAttributes,\n\tIChannelServices,\n\tIFluidDataStoreRuntime,\n} from \"@fluidframework/datastore-definitions\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport { revertSharedStringRevertibles, SharedStringRevertible } from \"../../revertibles.js\";\nimport { SharedStringFactory } from \"../../sequenceFactory.js\";\nimport { SharedString } from \"../../sharedString.js\";\nimport { Side, type IIntervalCollection } from \"../../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"../intervalTestUtils.js\";\nimport { _dirname } from \"../dirname.cjs\";\nimport type { SequenceInterval } from \"../../index.js\";\n\nexport type RevertibleSharedString = SharedString & {\n\trevertibles: SharedStringRevertible[];\n\t// This field prevents change events that are emitted while in the process of a revert from\n\t// being added into the revertibles stack.\n\tisCurrentRevert: boolean;\n};\nexport function isRevertibleSharedString(s: SharedString): s is RevertibleSharedString {\n\treturn (s as RevertibleSharedString).revertibles !== undefined;\n}\n\nexport interface RangeSpec {\n\tstart: number;\n\tend: number;\n}\n\nexport interface IntervalCollectionSpec {\n\tcollectionName: string;\n}\n\nexport interface AddText {\n\ttype: \"addText\";\n\tindex: number;\n\tcontent: string;\n}\n\nexport interface RemoveRange extends RangeSpec {\n\ttype: \"removeRange\";\n}\n\nexport interface ObliterateRange extends RangeSpec {\n\ttype: \"obliterateRange\";\n}\n\n// For non-interval collection fuzzing, annotating text would also be useful.\nexport interface AddInterval extends IntervalCollectionSpec, RangeSpec {\n\ttype: \"addInterval\";\n\t// Normally interval ids get autogenerated, but including it here allows tracking\n\t// what happened to an interval over the course of its lifetime based on the history\n\t// file, which is useful for debugging test failures.\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n}\n\nexport interface ChangeInterval extends IntervalCollectionSpec {\n\ttype: \"changeInterval\";\n\tstart: number | undefined;\n\tend: number | undefined;\n\tid: string;\n\tstartSide: Side;\n\tendSide: Side;\n\tproperties: PropertySet | undefined;\n}\n\nexport interface DeleteInterval extends IntervalCollectionSpec {\n\ttype: \"deleteInterval\";\n\tid: string;\n}\n\nexport interface RevertSharedStringRevertibles {\n\ttype: \"revertSharedStringRevertibles\";\n\teditsToRevert: number;\n}\n\nexport interface RevertibleWeights {\n\trevertWeight: number;\n\taddText: number;\n\tremoveRange: number;\n\tobliterateRange: number;\n\taddInterval: number;\n\tdeleteInterval: number;\n\tchangeInterval: number;\n}\n\nexport type IntervalOperation = AddInterval | ChangeInterval | DeleteInterval;\nexport type OperationWithRevert = IntervalOperation | RevertSharedStringRevertibles;\nexport type TextOperation = AddText | RemoveRange | ObliterateRange;\n\nexport type ClientOperation = IntervalOperation | TextOperation;\n\nexport type RevertOperation = OperationWithRevert | TextOperation;\nexport type Operation = RevertOperation;\n\nexport type FuzzTestState = DDSFuzzTestState<SharedStringFactory>;\n\nexport interface SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum length of the SharedString (locally) before no further AddText operations are generated.\n\t * Note due to concurrency, during test execution the actual length of the string may exceed this.\n\t */\n\tmaxStringLength?: number;\n\tmaxInsertLength?: number;\n\tweights?: {\n\t\taddText: number;\n\t\tremoveRange: number;\n\t\tobliterateRange: number;\n\t};\n}\n\nexport interface IntervalOperationGenerationConfig extends SharedStringOperationGenerationConfig {\n\t/**\n\t * Maximum number of intervals (locally) before no further AddInterval operations are generated.\n\t * Note due to concurrency, during test execution the actual number of intervals may exceed this.\n\t */\n\tmaxIntervals?: number;\n\tintervalCollectionNamePool?: string[];\n\tpropertyNamePool?: string[];\n\tvalidateInterval?: number;\n\tweights?: RevertibleWeights & SharedStringOperationGenerationConfig[\"weights\"];\n}\n\nexport const defaultSharedStringOperationGenerationConfig: Required<SharedStringOperationGenerationConfig> =\n\t{\n\t\tmaxStringLength: 1000,\n\t\tmaxInsertLength: 10,\n\t\tweights: {\n\t\t\taddText: 2,\n\t\t\tremoveRange: 1,\n\t\t\tobliterateRange: 1,\n\t\t},\n\t};\nexport const defaultIntervalOperationGenerationConfig: Required<IntervalOperationGenerationConfig> =\n\t{\n\t\t...defaultSharedStringOperationGenerationConfig,\n\t\tmaxIntervals: 100,\n\t\tintervalCollectionNamePool: [\"comments\"],\n\t\tpropertyNamePool: [\"prop1\", \"prop2\", \"prop3\"],\n\t\tvalidateInterval: 100,\n\t\tweights: {\n\t\t\t...defaultSharedStringOperationGenerationConfig.weights,\n\t\t\trevertWeight: 2,\n\t\t\taddInterval: 2,\n\t\t\tdeleteInterval: 2,\n\t\t\tchangeInterval: 2,\n\t\t\tobliterateRange: 0,\n\t\t},\n\t};\n\nexport interface LoggingInfo {\n\t/** id of the interval to track over time */\n\tintervalId: string;\n\t/** Clients to print */\n\tclientIds: string[];\n}\n\nfunction logCurrentState(state: FuzzTestState, loggingInfo: LoggingInfo): void {\n\tfor (const id of loggingInfo.clientIds) {\n\t\tconst { channel } = state.clients.find((s) => s.containerRuntime.clientId === id) ?? {};\n\t\tassert(channel);\n\t\tconst labels = channel.getIntervalCollectionLabels();\n\t\tconst interval = Array.from(labels)\n\t\t\t.map((label) =>\n\t\t\t\tchannel.getIntervalCollection(label).getIntervalById(loggingInfo.intervalId),\n\t\t\t)\n\t\t\t.find((result) => result !== undefined);\n\n\t\tconsole.log(`Client ${id}:`);\n\t\tif (interval !== undefined) {\n\t\t\tconst start = channel.localReferencePositionToPosition(interval.start);\n\t\t\tconst end = channel.localReferencePositionToPosition(interval.end);\n\t\t\tif (end === start) {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}x`);\n\t\t\t} else {\n\t\t\t\tconsole.log(`${\" \".repeat(start)}[${\" \".repeat(end - start - 1)}]`);\n\t\t\t}\n\t\t}\n\t\tconsole.log(channel.getText());\n\t\tconsole.log(\"\\n\");\n\t}\n}\n\ntype ClientOpState = FuzzTestState;\n\nexport function makeReducer(\n\tloggingInfo?: LoggingInfo,\n): AsyncReducer<Operation | RevertOperation, ClientOpState> {\n\tconst withLogging =\n\t\t<T>(baseReducer: AsyncReducer<T, ClientOpState>): AsyncReducer<T, ClientOpState> =>\n\t\tasync (state, operation) => {\n\t\t\tif (loggingInfo !== undefined) {\n\t\t\t\tlogCurrentState(state, loggingInfo);\n\t\t\t\tconsole.log(\"-\".repeat(20));\n\t\t\t\tconsole.log(\"Next operation:\", JSON.stringify(operation, undefined, 4));\n\t\t\t}\n\t\t\tawait baseReducer(state, operation);\n\t\t};\n\n\tconst reducer = combineReducersAsync<Operation | RevertOperation, ClientOpState>({\n\t\taddText: async ({ client }, { index, content }) => {\n\t\t\tclient.channel.insertText(index, content);\n\t\t},\n\t\tremoveRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.removeRange(start, end);\n\t\t},\n\t\tobliterateRange: async ({ client }, { start, end }) => {\n\t\t\tclient.channel.obliterateRange(start, end);\n\t\t},\n\t\taddInterval: async ({ client }, { start, end, collectionName, id, startSide, endSide }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.add({\n\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\tprops: { intervalId: id },\n\t\t\t});\n\t\t},\n\t\tdeleteInterval: async ({ client }, { id, collectionName }) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tcollection.removeIntervalById(id);\n\t\t},\n\t\tchangeInterval: async (\n\t\t\t{ client },\n\t\t\t{ id, start, end, collectionName, startSide, endSide, properties },\n\t\t) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(collectionName);\n\t\t\tif (start !== undefined && end !== undefined) {\n\t\t\t\tcollection.change(id, {\n\t\t\t\t\tstart: { pos: start, side: startSide },\n\t\t\t\t\tend: { pos: end, side: endSide },\n\t\t\t\t\tprops: properties,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tcollection.change(id, { props: properties });\n\t\t\t}\n\t\t},\n\t\trevertSharedStringRevertibles: async ({ client }, { editsToRevert }) => {\n\t\t\tassert(isRevertibleSharedString(client.channel));\n\t\t\tclient.channel.isCurrentRevert = true;\n\t\t\tconst few = client.channel.revertibles.splice(-editsToRevert, editsToRevert);\n\t\t\trevertSharedStringRevertibles(client.channel, few);\n\t\t\tclient.channel.isCurrentRevert = false;\n\t\t},\n\t});\n\n\treturn withLogging(reducer);\n}\n\nexport function createSharedStringGeneratorOperations(\n\toptionsParam?: SharedStringOperationGenerationConfig,\n) {\n\tconst options = { ...defaultSharedStringOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\t// All subsequent helper functions are generators; note that they don't actually apply any operations.\n\tfunction startPosition({ random, client }: ClientOpState): number {\n\t\treturn random.integer(0, Math.max(0, client.channel.getLength() - 1));\n\t}\n\n\tfunction exclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength());\n\t\treturn { start, end };\n\t}\n\n\tfunction exclusiveRangeLeaveChar(state: ClientOpState): RangeSpec {\n\t\tconst start = state.random.integer(0, state.client.channel.getLength() - 2);\n\t\tconst end = state.random.integer(start + 1, state.client.channel.getLength() - 1);\n\t\treturn { start, end };\n\t}\n\n\tasync function addText(state: ClientOpState): Promise<AddText> {\n\t\tconst { random, client } = state;\n\t\treturn {\n\t\t\ttype: \"addText\",\n\t\t\tindex: random.integer(0, client.channel.getLength()),\n\t\t\tcontent: random.string(random.integer(1, options.maxInsertLength)),\n\t\t};\n\t}\n\n\tasync function obliterateRange(state: ClientOpState): Promise<ObliterateRange> {\n\t\treturn {\n\t\t\ttype: \"obliterateRange\",\n\t\t\t...exclusiveRange(state),\n\t\t};\n\t}\n\n\tasync function removeRange(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRange(state) };\n\t}\n\n\tasync function removeRangeLeaveChar(state: ClientOpState): Promise<RemoveRange> {\n\t\treturn { type: \"removeRange\", ...exclusiveRangeLeaveChar(state) };\n\t}\n\n\tconst lengthSatisfies =\n\t\t(criteria: (length: number) => boolean): AcceptanceCondition<ClientOpState> =>\n\t\t({ client }) =>\n\t\t\tcriteria(client.channel.getLength());\n\tconst hasNonzeroLength = lengthSatisfies((length) => length > 0);\n\tconst isShorterThanMaxLength = lengthSatisfies((length) => length < options.maxStringLength);\n\n\treturn {\n\t\tstartPosition,\n\t\texclusiveRange,\n\t\texclusiveRangeLeaveChar,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t};\n}\n\nexport class SharedStringFuzzFactory extends SharedStringFactory {\n\tpublic async load(\n\t\truntime: IFluidDataStoreRuntime,\n\t\tid: string,\n\t\tservices: IChannelServices,\n\t\tattributes: IChannelAttributes,\n\t): Promise<SharedString> {\n\t\truntime.options.intervalStickinessEnabled = true;\n\t\truntime.options.mergeTreeEnableObliterate = true;\n\t\treturn super.load(runtime, id, services, attributes);\n\t}\n\n\tpublic create(document: IFluidDataStoreRuntime, id: string): SharedString {\n\t\tdocument.options.intervalStickinessEnabled = true;\n\t\tdocument.options.mergeTreeEnableObliterate = true;\n\t\treturn super.create(document, id);\n\t}\n}\n\nexport const baseModel: Omit<\n\tDDSFuzzModel<SharedStringFactory, Operation, FuzzTestState>,\n\t\"workloadName\" | \"generatorFactory\"\n> = {\n\treducer:\n\t\t// makeReducer supports a param for logging output which tracks the provided intervalId over time:\n\t\t// { intervalId: \"00000000-0000-0000-0000-000000000000\", clientIds: [\"A\", \"B\", \"C\"] }\n\t\tmakeReducer(),\n\tvalidateConsistency: assertEquivalentSharedStrings,\n\tfactory: new SharedStringFuzzFactory(),\n\tminimizationTransforms: [\n\t\t(op) => {\n\t\t\tif (op.type !== \"addText\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\top.content = op.content.slice(1);\n\t\t},\n\t\t(op) => {\n\t\t\tswitch (op.type) {\n\t\t\t\tcase \"addText\":\n\t\t\t\t\tif (op.index > 0) {\n\t\t\t\t\t\top.index -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removeRange\":\n\t\t\t\tcase \"addInterval\":\n\t\t\t\tcase \"changeInterval\":\n\t\t\t\t\tif (op.start !== undefined && op.start > 0) {\n\t\t\t\t\t\top.start -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\t\t\top.end -= 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t},\n\t\t(op) => {\n\t\t\tif (\n\t\t\t\top.type !== \"removeRange\" &&\n\t\t\t\top.type !== \"addInterval\" &&\n\t\t\t\top.type !== \"changeInterval\"\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (op.end !== undefined && op.end > 0) {\n\t\t\t\top.end -= 1;\n\t\t\t}\n\t\t},\n\t],\n};\n\nexport const defaultFuzzOptions: Partial<DDSFuzzSuiteOptions> = {\n\tvalidationStrategy: { type: \"fixedInterval\", interval: 10 },\n\treconnectProbability: 0.1,\n\tnumberOfClients: 3,\n\tclientJoinOptions: {\n\t\tmaxNumberOfClients: 6,\n\t\tclientAddProbability: 0.1,\n\t},\n\tdefaultTestCount: 100,\n\tsaveFailures: { directory: path.join(_dirname, \"../../src/test/fuzz/results\") },\n\tparseOperations: (serialized: string) => {\n\t\tconst operations: Operation[] = JSON.parse(serialized);\n\t\t// Replace this value with some other interval ID and uncomment to filter replay of the test\n\t\t// suite to only include interval operations with this ID.\n\t\t// const filterIntervalId = \"00000000-0000-0000-0000-000000000000\";\n\t\t// if (filterIntervalId) {\n\t\t// \treturn operations.filter((entry) =>\n\t\t// \t\t[undefined, filterIntervalId].includes((entry as any).id),\n\t\t// \t);\n\t\t// }\n\t\treturn operations;\n\t},\n};\n\nexport function makeIntervalOperationGenerator(\n\toptionsParam?: IntervalOperationGenerationConfig,\n\talwaysLeaveChar: boolean = false,\n): AsyncGenerator<Operation, ClientOpState> {\n\tconst {\n\t\tstartPosition,\n\t\taddText,\n\t\tobliterateRange,\n\t\tremoveRange,\n\t\tremoveRangeLeaveChar,\n\t\tlengthSatisfies,\n\t\thasNonzeroLength,\n\t\tisShorterThanMaxLength,\n\t} = createSharedStringGeneratorOperations(optionsParam);\n\n\tconst options = { ...defaultIntervalOperationGenerationConfig, ...(optionsParam ?? {}) };\n\n\tfunction isNonEmpty(collection: IIntervalCollection<SequenceInterval>): boolean {\n\t\tfor (const _ of collection) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction inclusiveRange(state: ClientOpState): RangeSpec {\n\t\tconst start = startPosition(state);\n\t\tconst end = state.random.integer(\n\t\t\tstart,\n\t\t\tMath.max(start, state.client.channel.getLength() - 1),\n\t\t);\n\t\treturn { start, end };\n\t}\n\n\tfunction inclusiveRangeWithUndefined(\n\t\tstate: ClientOpState,\n\t): RangeSpec | { start: undefined; end: undefined } {\n\t\treturn state.random.bool() ? inclusiveRange(state) : { start: undefined, end: undefined };\n\t}\n\n\tfunction propertySet(state: ClientOpState): PropertySet {\n\t\tconst propNamesShuffled = [...options.propertyNamePool];\n\t\tstate.random.shuffle(propNamesShuffled);\n\t\tconst propsToChange = propNamesShuffled.slice(\n\t\t\t0,\n\t\t\tstate.random.integer(1, propNamesShuffled.length),\n\t\t);\n\t\tconst propSet: PropertySet = {};\n\t\tfor (const name of propsToChange) {\n\t\t\tpropSet[name] = state.random.string(5);\n\t\t}\n\t\treturn propSet;\n\t}\n\n\tfunction propertySetWithUndefined(state: ClientOpState): PropertySet | undefined {\n\t\treturn state.random.bool() ? propertySet(state) : undefined;\n\t}\n\n\tfunction nonEmptyIntervalCollection({ client, random }: ClientOpState): string {\n\t\tconst nonEmptyLabels = Array.from(client.channel.getIntervalCollectionLabels()).filter(\n\t\t\t(label) => {\n\t\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\t\treturn isNonEmpty(collection);\n\t\t\t},\n\t\t);\n\t\treturn random.pick(nonEmptyLabels);\n\t}\n\n\tfunction interval(state: ClientOpState): { collectionName: string; id: string } {\n\t\tconst collectionName = nonEmptyIntervalCollection(state);\n\t\tconst intervals = Array.from(state.client.channel.getIntervalCollection(collectionName));\n\t\tconst id = state.random.pick(intervals)?.getIntervalId();\n\t\tassert(id);\n\n\t\treturn {\n\t\t\tid,\n\t\t\tcollectionName,\n\t\t};\n\t}\n\n\tasync function addInterval(state: ClientOpState): Promise<AddInterval> {\n\t\treturn {\n\t\t\ttype: \"addInterval\",\n\t\t\t...inclusiveRange(state),\n\t\t\tcollectionName: state.random.pick(options.intervalCollectionNamePool),\n\t\t\tid: state.random.uuid4(),\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t};\n\t}\n\n\tasync function deleteInterval(state: ClientOpState): Promise<DeleteInterval> {\n\t\treturn {\n\t\t\ttype: \"deleteInterval\",\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tasync function changeInterval(state: ClientOpState): Promise<ChangeInterval> {\n\t\tconst { start, end } = inclusiveRangeWithUndefined(state);\n\t\tconst properties = propertySetWithUndefined(state);\n\t\treturn {\n\t\t\ttype: \"changeInterval\",\n\t\t\tstart,\n\t\t\tend,\n\t\t\tstartSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tendSide: state.random.pick([Side.Before, Side.After]),\n\t\t\tproperties,\n\t\t\t...interval(state),\n\t\t};\n\t}\n\n\tconst hasAnInterval = ({ client }: ClientOpState): boolean =>\n\t\tArray.from(client.channel.getIntervalCollectionLabels()).some((label) => {\n\t\t\tconst collection = client.channel.getIntervalCollection(label);\n\t\t\treturn isNonEmpty(collection);\n\t\t});\n\n\tconst hasNotTooManyIntervals: AcceptanceCondition<ClientOpState> = ({ client }) => {\n\t\tlet intervalCount = 0;\n\t\tfor (const label of client.channel.getIntervalCollectionLabels()) {\n\t\t\tfor (const _ of client.channel.getIntervalCollection(label)) {\n\t\t\t\tintervalCount++;\n\t\t\t\tif (intervalCount >= options.maxIntervals) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t};\n\n\tconst all =\n\t\t<T>(...clauses: AcceptanceCondition<T>[]): AcceptanceCondition<T> =>\n\t\t(t: T) =>\n\t\t\tclauses.reduce<boolean>((prev, cond) => prev && cond(t), true);\n\tconst usableWeights = optionsParam?.weights ?? defaultIntervalOperationGenerationConfig.weights;\n\treturn createWeightedAsyncGenerator<Operation, ClientOpState>([\n\t\t[addText, usableWeights.addText, isShorterThanMaxLength],\n\t\t[\n\t\t\talwaysLeaveChar ? removeRangeLeaveChar : removeRange,\n\t\t\tusableWeights.removeRange,\n\t\t\talwaysLeaveChar\n\t\t\t\t? lengthSatisfies((length) => {\n\t\t\t\t\t\treturn length > 1;\n\t\t\t\t })\n\t\t\t\t: hasNonzeroLength,\n\t\t],\n\t\t[obliterateRange, usableWeights.obliterateRange, hasNonzeroLength],\n\t\t[addInterval, usableWeights.addInterval, all(hasNotTooManyIntervals, hasNonzeroLength)],\n\t\t[deleteInterval, usableWeights.deleteInterval, hasAnInterval],\n\t\t[changeInterval, usableWeights.changeInterval, all(hasAnInterval, hasNonzeroLength)],\n\t]);\n}\n"]}
@@ -61,9 +61,11 @@ describe("IntervalCollection detached", () => {
61
61
  describe("interval changed while detached", () => {
62
62
  it("slides immediately on segment removal", () => {
63
63
  sharedString.insertText(0, "0123");
64
- const interval = collection.add({ start: 0, end: 2 });
65
- collection.change(interval.getIntervalId(), { start: 0, end: 0 });
64
+ const id = collection.add({ start: 0, end: 2 }).getIntervalId();
65
+ collection.change(id, { start: 0, end: 0 });
66
66
  sharedString.removeText(0, 1);
67
+ const interval = collection.getIntervalById(id);
68
+ assert(interval !== undefined, "interval should be defined");
67
69
  assert.equal(interval.start.getSegment()?.text, "123");
68
70
  assert.equal(interval.end.getSegment()?.text, "123");
69
71
  });
@@ -1 +1 @@
1
- {"version":3,"file":"intervalCollection.detached.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.detached.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { TextSegment } from \"@fluidframework/merge-tree\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"./intervalTestUtils.js\";\n\ndescribe(\"IntervalCollection detached\", () => {\n\tconst factory = SharedString.getFactory();\n\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\tlet sharedString: SharedString;\n\tlet collection: IIntervalCollection<SequenceInterval>;\n\tbeforeEach(() => {\n\t\tdataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tsharedString = factory.create(dataStoreRuntime, \"A\");\n\t\tcollection = sharedString.getIntervalCollection(\"intervals\");\n\t});\n\n\tconst attachAndLoadSecondSharedString = async (): Promise<{\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tsharedString2: SharedString;\n\t}> => {\n\t\tassert.equal(sharedString.isAttached(), false);\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst attachSummary = sharedString.getAttachSummary().summary;\n\t\tsharedString.connect({\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(),\n\t\t});\n\n\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\tconst sharedString2 = await factory.load(\n\t\t\tdataStoreRuntime2,\n\t\t\t\"B\",\n\t\t\t{\n\t\t\t\tdeltaConnection: containerRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(attachSummary),\n\t\t\t},\n\t\t\tfactory.attributes,\n\t\t);\n\t\treturn { sharedString2, containerRuntimeFactory };\n\t};\n\n\tdescribe(\"interval created while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tsharedString.removeText(2, 3);\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"3\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tcollection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(2, 3);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval changed while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tsharedString.removeText(0, 1);\n\t\t\tassert.equal((interval.start.getSegment() as TextSegment)?.text, \"123\");\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"123\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(0, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval with properties changed while detached\", () => {\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"a2\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { props: { foo: \"b1\" } });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"b1\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"intervals deleted while detached\", () => {\n\t\tit(\"aren't added to the remote client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst id = interval.getIntervalId();\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tconst { sharedString2 } = await attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t\tassert.equal(collection2.getIntervalById(id), undefined);\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"intervalCollection.detached.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.detached.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EACzB,WAAW,GACX,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEvE,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,gBAA2C,CAAC;IAChD,IAAI,YAA0B,CAAC;IAC/B,IAAI,UAAiD,CAAC;IACtD,UAAU,CAAC,GAAG,EAAE;QACf,gBAAgB,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACnD,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACrD,UAAU,GAAG,YAAY,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,MAAM,+BAA+B,GAAG,KAAK,IAG1C,EAAE;QACJ,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,uBAAuB,GAAG,IAAI,2BAA2B,EAAE,CAAC;QAClE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;QAC1F,MAAM,aAAa,GAAG,YAAY,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC;QAC9D,YAAY,CAAC,OAAO,CAAC;YACpB,eAAe,EAAE,gBAAgB,CAAC,qBAAqB,EAAE;YACzD,aAAa,EAAE,IAAI,WAAW,EAAE;SAChC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;QAC1D,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QAC5F,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,IAAI,CACvC,iBAAiB,EACjB,GAAG,EACH;YACC,eAAe,EAAE,iBAAiB,CAAC,qBAAqB,EAAE;YAC1D,aAAa,EAAE,WAAW,CAAC,iBAAiB,CAAC,aAAa,CAAC;SAC3D,EACD,OAAO,CAAC,UAAU,CAClB,CAAC;QACF,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,CAAC;IACnD,CAAC,CAAC;IAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAChD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAkB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAChD,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAChD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;YAChE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,4BAA4B,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAkB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAE,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAkB,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,aAAa,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAChE,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACzD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5E,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAC7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,UAAU,CAAC,GAAG,EACpE,IAAI,CACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5E,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,MAAM,EAAE,aAAa,EAAE,uBAAuB,EAAE,GAC/C,MAAM,+BAA+B,EAAE,CAAC;YAEzC,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACrE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACvE,uBAAuB,CAAC,kBAAkB,EAAE,CAAC;YAE7C,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CACX,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAE,UAAU,CAAC,GAAG,EACpE,IAAI,CACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACjD,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YAClD,YAAY,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;YACpC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;YAClC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,+BAA+B,EAAE,CAAC;YAElE,MAAM,WAAW,GAAG,aAAa,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;YACrE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACzD,6BAA6B,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport {\n\tMockContainerRuntimeFactory,\n\tMockFluidDataStoreRuntime,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { TextSegment } from \"@fluidframework/merge-tree\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { assertEquivalentSharedStrings } from \"./intervalTestUtils.js\";\n\ndescribe(\"IntervalCollection detached\", () => {\n\tconst factory = SharedString.getFactory();\n\tlet dataStoreRuntime: MockFluidDataStoreRuntime;\n\tlet sharedString: SharedString;\n\tlet collection: IIntervalCollection<SequenceInterval>;\n\tbeforeEach(() => {\n\t\tdataStoreRuntime = new MockFluidDataStoreRuntime();\n\t\tsharedString = factory.create(dataStoreRuntime, \"A\");\n\t\tcollection = sharedString.getIntervalCollection(\"intervals\");\n\t});\n\n\tconst attachAndLoadSecondSharedString = async (): Promise<{\n\t\tcontainerRuntimeFactory: MockContainerRuntimeFactory;\n\t\tsharedString2: SharedString;\n\t}> => {\n\t\tassert.equal(sharedString.isAttached(), false);\n\t\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\t\tconst attachSummary = sharedString.getAttachSummary().summary;\n\t\tsharedString.connect({\n\t\t\tdeltaConnection: containerRuntime.createDeltaConnection(),\n\t\t\tobjectStorage: new MockStorage(),\n\t\t});\n\n\t\tconst dataStoreRuntime2 = new MockFluidDataStoreRuntime();\n\t\tconst containerRuntime2 = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime2);\n\t\tconst sharedString2 = await factory.load(\n\t\t\tdataStoreRuntime2,\n\t\t\t\"B\",\n\t\t\t{\n\t\t\t\tdeltaConnection: containerRuntime2.createDeltaConnection(),\n\t\t\t\tobjectStorage: MockStorage.createFromSummary(attachSummary),\n\t\t\t},\n\t\t\tfactory.attributes,\n\t\t);\n\t\treturn { sharedString2, containerRuntimeFactory };\n\t};\n\n\tdescribe(\"interval created while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tsharedString.removeText(2, 3);\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"3\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tcollection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(2, 3);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval changed while detached\", () => {\n\t\tit(\"slides immediately on segment removal\", () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst id = collection.add({ start: 0, end: 2 }).getIntervalId();\n\t\t\tcollection.change(id, { start: 0, end: 0 });\n\t\t\tsharedString.removeText(0, 1);\n\t\t\tconst interval = collection.getIntervalById(id);\n\t\t\tassert(interval !== undefined, \"interval should be defined\");\n\t\t\tassert.equal((interval.start.getSegment() as TextSegment)?.text, \"123\");\n\t\t\tassert.equal((interval.end.getSegment() as TextSegment)?.text, \"123\");\n\t\t});\n\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tsharedString2.removeText(0, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tcollection.change(interval.getIntervalId(), { start: 0, end: 0 });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { start: 1, end: 1 });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n\n\tdescribe(\"interval with properties changed while detached\", () => {\n\t\tit(\"synchronizes correctly on another client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"a2\",\n\t\t\t);\n\t\t});\n\n\t\tit(\"can be changed by another client after attaching\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2, props: { foo: \"a1\" } });\n\t\t\tcollection.change(interval.getIntervalId(), { props: { foo: \"a2\" } });\n\t\t\tconst { sharedString2, containerRuntimeFactory } =\n\t\t\t\tawait attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tcollection2.change(interval.getIntervalId(), { props: { foo: \"b1\" } });\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t\tassert.equal(\n\t\t\t\tcollection.getIntervalById(interval.getIntervalId())?.properties.foo,\n\t\t\t\t\"b1\",\n\t\t\t);\n\t\t});\n\t});\n\n\tdescribe(\"intervals deleted while detached\", () => {\n\t\tit(\"aren't added to the remote client\", async () => {\n\t\t\tsharedString.insertText(0, \"0123\");\n\t\t\tconst interval = collection.add({ start: 0, end: 2 });\n\t\t\tconst id = interval.getIntervalId();\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tconst { sharedString2 } = await attachAndLoadSecondSharedString();\n\n\t\t\tconst collection2 = sharedString2.getIntervalCollection(\"intervals\");\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t\tassert.equal(collection2.getIntervalById(id), undefined);\n\t\t\tassertEquivalentSharedStrings(sharedString, sharedString2);\n\t\t});\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"intervalCollection.snapshot.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.snapshot.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { strict as assert } from \"assert\";\nimport { ReferenceType, SlidingPreference } from \"@fluidframework/merge-tree\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { IIntervalCollection, intervalLocatorFromEndpoint, Side } from \"../intervalCollection.js\";\nimport { IntervalStickiness, SequenceInterval } from \"../intervals/index.js\";\nimport { assertSequenceIntervals } from \"./intervalTestUtils.js\";\n\nasync function loadSharedString(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory,\n\tid: string,\n\tsummary: ISummaryTree,\n): Promise<SharedString> {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tdataStoreRuntime.deltaManager.lastSequenceNumber = containerRuntimeFactory.sequenceNumber;\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: MockStorage.createFromSummary(summary),\n\t};\n\tconst sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);\n\tawait sharedString.load(services);\n\tawait sharedString.loaded;\n\treturn sharedString;\n}\n\nasync function getSingleIntervalSummary(): Promise<{ summary: ISummaryTree; seq: number }> {\n\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\tdataStoreRuntime.options = {\n\t\tintervalStickinessEnabled: true,\n\t};\n\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tconst sharedString = new SharedString(dataStoreRuntime, \"\", SharedStringFactory.Attributes);\n\tsharedString.initializeLocal();\n\tsharedString.connect(services);\n\tsharedString.insertText(0, \"ABCDEF\");\n\tconst collection = sharedString.getIntervalCollection(\"test\");\n\tcollection.add({ start: 0, end: 2 });\n\tconst collectionStartSticky = sharedString.getIntervalCollection(\"start-sticky\");\n\tconst startStickyInterval = collectionStartSticky.add({\n\t\tstart: { pos: 0, side: Side.After },\n\t\tend: { pos: 2, side: Side.After },\n\t});\n\tassert.equal(startStickyInterval.stickiness, IntervalStickiness.START);\n\tconst collectionEndSticky = sharedString.getIntervalCollection(\"end-sticky\");\n\tconst endStickyInterval = collectionEndSticky.add({\n\t\tstart: { pos: 0, side: Side.Before },\n\t\tend: { pos: 2, side: Side.Before },\n\t});\n\tassert.equal(endStickyInterval.stickiness, IntervalStickiness.END);\n\tcontainerRuntimeFactory.processAllMessages();\n\tconst { summary } = await sharedString.summarize();\n\treturn { summary, seq: containerRuntimeFactory.sequenceNumber };\n}\n\ndescribe(\"IntervalCollection snapshotting\", () => {\n\tlet summary: ISummaryTree;\n\tlet seq: number;\n\tbefore(async () => {\n\t\t({ summary, seq } = await getSingleIntervalSummary());\n\t});\n\n\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\tbeforeEach(() => {\n\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tcontainerRuntimeFactory.sequenceNumber = seq;\n\t});\n\n\tit(\"creates the correct reference type on reload\", async () => {\n\t\t// This is a direct regression test for an issue with interval collection deserialization logic.\n\t\t// It manifested in later failures demonstrated by the \"enable operations on reload\" suite.\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"test\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\t/* eslint-disable no-bitwise */\n\t\tassert(interval.start.refType === (ReferenceType.RangeBegin | ReferenceType.SlideOnRemove));\n\t\tassert(interval.end.refType === (ReferenceType.RangeEnd | ReferenceType.SlideOnRemove));\n\t\t/* eslint-enable no-bitwise */\n\t});\n\n\tit(\"start stickiness is persisted\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"start-sticky\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\tassert.equal(interval.stickiness, IntervalStickiness.START);\n\t\tassert.equal(interval.start.slidingPreference, SlidingPreference.BACKWARD);\n\t\tassert.equal(interval.end.slidingPreference, SlidingPreference.BACKWARD);\n\t});\n\n\tit(\"end stickiness is stored as undefined\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"end-sticky\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\tassert.equal(interval.stickiness, IntervalStickiness.END);\n\t\tassert.equal(interval.start.slidingPreference, SlidingPreference.FORWARD);\n\t\tassert.equal(interval.end.slidingPreference, SlidingPreference.FORWARD);\n\t});\n\n\tit(\"supports detached intervals\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tsharedString.removeRange(0, sharedString.getLength());\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tconst { summary: detachedSummary } = await sharedString.summarize();\n\t\tconst stringLoadedWithDetachedInterval = await loadSharedString(\n\t\t\tcontainerRuntimeFactory,\n\t\t\t\"2\",\n\t\t\tdetachedSummary,\n\t\t);\n\t\tconst collection = stringLoadedWithDetachedInterval.getIntervalCollection(\"test\");\n\t\tassertSequenceIntervals(stringLoadedWithDetachedInterval, collection, [\n\t\t\t{ start: -1, end: -1 },\n\t\t]);\n\t});\n\n\tdescribe(\"enables operations on reload\", () => {\n\t\tlet sharedString: SharedString;\n\t\tlet sharedString2: SharedString;\n\t\tlet collection: IIntervalCollection<SequenceInterval>;\n\t\tlet collection2: IIntervalCollection<SequenceInterval>;\n\t\tlet id: string;\n\t\tbeforeEach(async () => {\n\t\t\tsharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\t\tsharedString2 = await loadSharedString(containerRuntimeFactory, \"2\", summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcollection = sharedString.getIntervalCollection(\"test\");\n\t\t\tcollection2 = sharedString2.getIntervalCollection(\"test\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst intervals = Array.from(collection);\n\t\t\tassert.equal(intervals.length, 1);\n\t\t\tconst interval = intervals[0] ?? assert.fail(\"collection should have interval\");\n\t\t\tid = interval.getIntervalId() ?? assert.fail(\"interval should have id\");\n\t\t});\n\n\t\tit(\"reloaded interval can be changed\", async () => {\n\t\t\tcollection.change(id, { start: 1, end: 3 });\n\t\t\tassertSequenceIntervals(sharedString, collection, [{ start: 1, end: 3 }]);\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 1, end: 3 }]);\n\t\t});\n\n\t\tit(\"reloaded interval can be deleted\", async () => {\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tassert.equal(Array.from(collection).length, 0);\n\t\t\tassert.equal(Array.from(collection2).length, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t});\n\n\t\tit(\"new interval can be added after reload\", async () => {\n\t\t\tcollection.add({ start: 2, end: 4 });\n\t\t\tassertSequenceIntervals(sharedString, collection, [\n\t\t\t\t{ start: 0, end: 2 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t]);\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [\n\t\t\t\t{ start: 0, end: 2 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"intervals can be retrieved from endpoints\", async () => {\n\t\t\tconst interval1 =\n\t\t\t\tcollection.getIntervalById(id) ?? assert.fail(\"collection should have interval\");\n\t\t\tconst locator1 = intervalLocatorFromEndpoint(interval1.start);\n\t\t\tassert.deepEqual(locator1, { interval: interval1, label: \"test\" });\n\t\t\tconst interval2 = collection.add({ start: 1, end: 2 });\n\t\t\tconst locator2 = intervalLocatorFromEndpoint(interval2.start);\n\t\t\tassert.deepEqual(locator2, { interval: interval2, label: \"test\" });\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"intervalCollection.snapshot.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.snapshot.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { ReferenceType, SlidingPreference } from \"@fluidframework/merge-tree\";\nimport {\n\tMockFluidDataStoreRuntime,\n\tMockContainerRuntimeFactory,\n\tMockStorage,\n} from \"@fluidframework/test-runtime-utils\";\nimport { ISummaryTree } from \"@fluidframework/protocol-definitions\";\nimport { AttachState } from \"@fluidframework/container-definitions\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { IIntervalCollection, intervalLocatorFromEndpoint, Side } from \"../intervalCollection.js\";\nimport { IntervalStickiness, SequenceInterval } from \"../intervals/index.js\";\nimport { assertSequenceIntervals } from \"./intervalTestUtils.js\";\n\nasync function loadSharedString(\n\tcontainerRuntimeFactory: MockContainerRuntimeFactory,\n\tid: string,\n\tsummary: ISummaryTree,\n): Promise<SharedString> {\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tconst containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tdataStoreRuntime.deltaManager.lastSequenceNumber = containerRuntimeFactory.sequenceNumber;\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: MockStorage.createFromSummary(summary),\n\t};\n\tconst sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);\n\tawait sharedString.load(services);\n\tawait sharedString.loaded;\n\treturn sharedString;\n}\n\nasync function getSingleIntervalSummary(): Promise<{ summary: ISummaryTree; seq: number }> {\n\tconst containerRuntimeFactory = new MockContainerRuntimeFactory();\n\tconst dataStoreRuntime = new MockFluidDataStoreRuntime();\n\tdataStoreRuntime.setAttachState(AttachState.Attached);\n\tdataStoreRuntime.options = {\n\t\tintervalStickinessEnabled: true,\n\t};\n\tcontainerRuntimeFactory.createContainerRuntime(dataStoreRuntime);\n\tconst services = {\n\t\tdeltaConnection: dataStoreRuntime.createDeltaConnection(),\n\t\tobjectStorage: new MockStorage(),\n\t};\n\tconst sharedString = new SharedString(dataStoreRuntime, \"\", SharedStringFactory.Attributes);\n\tsharedString.initializeLocal();\n\tsharedString.connect(services);\n\tsharedString.insertText(0, \"ABCDEF\");\n\tconst collection = sharedString.getIntervalCollection(\"test\");\n\tcollection.add({ start: 0, end: 2 });\n\tconst collectionStartSticky = sharedString.getIntervalCollection(\"start-sticky\");\n\tconst startStickyInterval = collectionStartSticky.add({\n\t\tstart: { pos: 0, side: Side.After },\n\t\tend: { pos: 2, side: Side.After },\n\t});\n\tassert.equal(startStickyInterval.stickiness, IntervalStickiness.START);\n\tconst collectionEndSticky = sharedString.getIntervalCollection(\"end-sticky\");\n\tconst endStickyInterval = collectionEndSticky.add({\n\t\tstart: { pos: 0, side: Side.Before },\n\t\tend: { pos: 2, side: Side.Before },\n\t});\n\tassert.equal(endStickyInterval.stickiness, IntervalStickiness.END);\n\tcontainerRuntimeFactory.processAllMessages();\n\tconst { summary } = await sharedString.summarize();\n\treturn { summary, seq: containerRuntimeFactory.sequenceNumber };\n}\n\ndescribe(\"IntervalCollection snapshotting\", () => {\n\tlet summary: ISummaryTree;\n\tlet seq: number;\n\tbefore(async () => {\n\t\t({ summary, seq } = await getSingleIntervalSummary());\n\t});\n\n\tlet containerRuntimeFactory: MockContainerRuntimeFactory;\n\tbeforeEach(() => {\n\t\tcontainerRuntimeFactory = new MockContainerRuntimeFactory();\n\t\tcontainerRuntimeFactory.sequenceNumber = seq;\n\t});\n\n\tit(\"creates the correct reference type on reload\", async () => {\n\t\t// This is a direct regression test for an issue with interval collection deserialization logic.\n\t\t// It manifested in later failures demonstrated by the \"enable operations on reload\" suite.\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"test\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\t/* eslint-disable no-bitwise */\n\t\tassert(interval.start.refType === (ReferenceType.RangeBegin | ReferenceType.SlideOnRemove));\n\t\tassert(interval.end.refType === (ReferenceType.RangeEnd | ReferenceType.SlideOnRemove));\n\t\t/* eslint-enable no-bitwise */\n\t});\n\n\tit(\"start stickiness is persisted\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"start-sticky\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\tassert.equal(interval.stickiness, IntervalStickiness.START);\n\t\tassert.equal(interval.start.slidingPreference, SlidingPreference.BACKWARD);\n\t\tassert.equal(interval.end.slidingPreference, SlidingPreference.BACKWARD);\n\t});\n\n\tit(\"end stickiness is stored as undefined\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tconst collection = sharedString.getIntervalCollection(\"end-sticky\");\n\t\tconst intervals = Array.from(collection);\n\t\tassert.equal(intervals.length, 1);\n\t\tconst interval = intervals[0] ?? assert.fail();\n\t\tassert.equal(interval.stickiness, IntervalStickiness.END);\n\t\tassert.equal(interval.start.slidingPreference, SlidingPreference.FORWARD);\n\t\tassert.equal(interval.end.slidingPreference, SlidingPreference.FORWARD);\n\t});\n\n\tit(\"supports detached intervals\", async () => {\n\t\tconst sharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\tsharedString.removeRange(0, sharedString.getLength());\n\t\tcontainerRuntimeFactory.processAllMessages();\n\t\tconst { summary: detachedSummary } = await sharedString.summarize();\n\t\tconst stringLoadedWithDetachedInterval = await loadSharedString(\n\t\t\tcontainerRuntimeFactory,\n\t\t\t\"2\",\n\t\t\tdetachedSummary,\n\t\t);\n\t\tconst collection = stringLoadedWithDetachedInterval.getIntervalCollection(\"test\");\n\t\tassertSequenceIntervals(stringLoadedWithDetachedInterval, collection, [\n\t\t\t{ start: -1, end: -1 },\n\t\t]);\n\t});\n\n\tdescribe(\"enables operations on reload\", () => {\n\t\tlet sharedString: SharedString;\n\t\tlet sharedString2: SharedString;\n\t\tlet collection: IIntervalCollection<SequenceInterval>;\n\t\tlet collection2: IIntervalCollection<SequenceInterval>;\n\t\tlet id: string;\n\t\tbeforeEach(async () => {\n\t\t\tsharedString = await loadSharedString(containerRuntimeFactory, \"1\", summary);\n\t\t\tsharedString2 = await loadSharedString(containerRuntimeFactory, \"2\", summary);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tcollection = sharedString.getIntervalCollection(\"test\");\n\t\t\tcollection2 = sharedString2.getIntervalCollection(\"test\");\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tconst intervals = Array.from(collection);\n\t\t\tassert.equal(intervals.length, 1);\n\t\t\tconst interval = intervals[0] ?? assert.fail(\"collection should have interval\");\n\t\t\tid = interval.getIntervalId() ?? assert.fail(\"interval should have id\");\n\t\t});\n\n\t\tit(\"reloaded interval can be changed\", async () => {\n\t\t\tcollection.change(id, { start: 1, end: 3 });\n\t\t\tassertSequenceIntervals(sharedString, collection, [{ start: 1, end: 3 }]);\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 1, end: 3 }]);\n\t\t});\n\n\t\tit(\"reloaded interval can be deleted\", async () => {\n\t\t\tcollection.removeIntervalById(id);\n\t\t\tassert.equal(Array.from(collection).length, 0);\n\t\t\tassert.equal(Array.from(collection2).length, 1);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassert.equal(Array.from(collection2).length, 0);\n\t\t});\n\n\t\tit(\"new interval can be added after reload\", async () => {\n\t\t\tcollection.add({ start: 2, end: 4 });\n\t\t\tassertSequenceIntervals(sharedString, collection, [\n\t\t\t\t{ start: 0, end: 2 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t]);\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);\n\t\t\tcontainerRuntimeFactory.processAllMessages();\n\t\t\tassertSequenceIntervals(sharedString2, collection2, [\n\t\t\t\t{ start: 0, end: 2 },\n\t\t\t\t{ start: 2, end: 4 },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"intervals can be retrieved from endpoints\", async () => {\n\t\t\tconst interval1 =\n\t\t\t\tcollection.getIntervalById(id) ?? assert.fail(\"collection should have interval\");\n\t\t\tconst locator1 = intervalLocatorFromEndpoint(interval1.start);\n\t\t\tassert.deepEqual(locator1, { interval: interval1, label: \"test\" });\n\t\t\tconst interval2 = collection.add({ start: 1, end: 2 });\n\t\t\tconst locator2 = intervalLocatorFromEndpoint(interval2.start);\n\t\t\tassert.deepEqual(locator2, { interval: interval2, label: \"test\" });\n\t\t});\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"intervalIndexTestUtils.js","sourceRoot":"","sources":["../../src/test/intervalIndexTestUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAS3C;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACzC,OAAmB,EACnB,iBAAgE;IAEhE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;KACzE;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,GAAW;IAC5D,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAExC,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAA8B;IACrE,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzB;IAED,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\nimport { strict as assert } from \"assert\";\nimport { v4 as uuid } from \"uuid\";\nimport { IRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport { Interval } from \"../intervals/index.js\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\nexport interface RandomIntervalOptions {\n\trandom: IRandom;\n\tcount: number;\n\tmin: number;\n\tmax: number;\n}\n\n/**\n * Asserts that the results match the expected endpoints or intervals.\n * @param results - The generated intervals to compare.\n * @param expectedEndpoints - The expected start and end points or intervals.\n */\nexport function assertPlainNumberIntervals(\n\tresults: Interval[],\n\texpectedEndpoints: { start: number; end: number }[] | Interval[],\n): void {\n\tassert.equal(results.length, expectedEndpoints.length, \"Mismatched result count\");\n\tfor (let i = 0; i < results.length; ++i) {\n\t\tassert(results[i]);\n\t\tassert.equal(results[i].start, expectedEndpoints[i].start, \"mismatched start\");\n\t\tassert.equal(results[i].end, expectedEndpoints[i].end, \"mismatched end\");\n\t}\n}\n\n/**\n * Creates a new (regular) Interval object with the specified start and end values.\n * @param start - The start value of the interval.\n * @param end - The end value of the interval.\n * @returns The created Interval object.\n */\nexport function createTestInterval(start: number, end: number): Interval {\n\tconst props: PropertySet = {};\n\tprops[reservedIntervalIdKey] = [uuid()];\n\n\treturn new Interval(start, end, props);\n}\n\n/**\n * Generates random intervals based on the randomness-related options.\n * @param options - The options for generating random intervals.\n * @returns An array of generated Interval objects.\n */\nexport function generateRandomIntervals(options: RandomIntervalOptions) {\n\tconst intervals: Interval[] = [];\n\tconst { random, count, min, max } = options;\n\n\tfor (let i = 0; i < count; ++i) {\n\t\tconst start = random.integer(min, max);\n\t\tconst end = random.integer(start, max);\n\t\tconst interval = createTestInterval(start, end);\n\t\tintervals.push(interval);\n\t}\n\n\treturn intervals;\n}\n"]}
1
+ {"version":3,"file":"intervalIndexTestUtils.js","sourceRoot":"","sources":["../../src/test/intervalIndexTestUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAGlC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,MAAM,qBAAqB,GAAG,YAAY,CAAC;AAS3C;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CACzC,OAAmB,EACnB,iBAAgE;IAEhE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QAC/E,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;KACzE;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,GAAW;IAC5D,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAExC,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAA8B;IACrE,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzB;IAED,OAAO,SAAS,CAAC;AAClB,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"assert\";\nimport { v4 as uuid } from \"uuid\";\nimport { IRandom } from \"@fluid-private/stochastic-test-utils\";\nimport { PropertySet } from \"@fluidframework/merge-tree\";\nimport { Interval } from \"../intervals/index.js\";\n\nconst reservedIntervalIdKey = \"intervalId\";\n\nexport interface RandomIntervalOptions {\n\trandom: IRandom;\n\tcount: number;\n\tmin: number;\n\tmax: number;\n}\n\n/**\n * Asserts that the results match the expected endpoints or intervals.\n * @param results - The generated intervals to compare.\n * @param expectedEndpoints - The expected start and end points or intervals.\n */\nexport function assertPlainNumberIntervals(\n\tresults: Interval[],\n\texpectedEndpoints: { start: number; end: number }[] | Interval[],\n): void {\n\tassert.equal(results.length, expectedEndpoints.length, \"Mismatched result count\");\n\tfor (let i = 0; i < results.length; ++i) {\n\t\tassert(results[i]);\n\t\tassert.equal(results[i].start, expectedEndpoints[i].start, \"mismatched start\");\n\t\tassert.equal(results[i].end, expectedEndpoints[i].end, \"mismatched end\");\n\t}\n}\n\n/**\n * Creates a new (regular) Interval object with the specified start and end values.\n * @param start - The start value of the interval.\n * @param end - The end value of the interval.\n * @returns The created Interval object.\n */\nexport function createTestInterval(start: number, end: number): Interval {\n\tconst props: PropertySet = {};\n\tprops[reservedIntervalIdKey] = [uuid()];\n\n\treturn new Interval(start, end, props);\n}\n\n/**\n * Generates random intervals based on the randomness-related options.\n * @param options - The options for generating random intervals.\n * @returns An array of generated Interval objects.\n */\nexport function generateRandomIntervals(options: RandomIntervalOptions) {\n\tconst intervals: Interval[] = [];\n\tconst { random, count, min, max } = options;\n\n\tfor (let i = 0; i < count; ++i) {\n\t\tconst start = random.integer(min, max);\n\t\tconst end = random.integer(start, max);\n\t\tconst interval = createTestInterval(start, end);\n\t\tintervals.push(interval);\n\t}\n\n\treturn intervals;\n}\n"]}