@fluidframework/sequence 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{.eslintrc.js → .eslintrc.cjs} +4 -1
- package/{.mocharc.js → .mocharc.cjs} +1 -1
- package/CHANGELOG.md +8 -0
- package/README.md +2 -2
- package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
- package/api-extractor.json +1 -1
- package/api-report/sequence.api.md +15 -27
- package/dist/defaultMap.d.ts +10 -16
- package/dist/defaultMap.d.ts.map +1 -1
- package/dist/defaultMap.js +73 -70
- package/dist/defaultMap.js.map +1 -1
- package/dist/defaultMapInterfaces.d.ts +1 -8
- package/dist/defaultMapInterfaces.d.ts.map +1 -1
- package/dist/defaultMapInterfaces.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -42
- package/dist/index.js.map +1 -1
- package/dist/intervalCollection.d.ts +21 -15
- package/dist/intervalCollection.d.ts.map +1 -1
- package/dist/intervalCollection.js +59 -110
- package/dist/intervalCollection.js.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.d.ts +3 -3
- package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointInRangeIndex.js +8 -8
- package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
- package/dist/intervalIndex/endpointIndex.d.ts +3 -3
- package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
- package/dist/intervalIndex/endpointIndex.js +4 -4
- package/dist/intervalIndex/endpointIndex.js.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
- package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/idIntervalIndex.js +2 -2
- package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
- package/dist/intervalIndex/index.d.ts +8 -8
- package/dist/intervalIndex/index.d.ts.map +1 -1
- package/dist/intervalIndex/index.js +16 -16
- package/dist/intervalIndex/index.js.map +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts +1 -1
- package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
- package/dist/intervalIndex/intervalIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +7 -10
- package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingIntervalsIndex.js +12 -13
- package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +7 -7
- package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
- package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
- package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.d.ts +3 -3
- package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
- package/dist/intervalIndex/startpointInRangeIndex.js +8 -8
- package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
- package/dist/intervalTree.d.ts +1 -1
- package/dist/intervalTree.d.ts.map +1 -1
- package/dist/intervalTree.js.map +1 -1
- package/dist/intervals/index.d.ts +3 -3
- package/dist/intervals/index.d.ts.map +1 -1
- package/dist/intervals/index.js +16 -16
- package/dist/intervals/index.js.map +1 -1
- package/dist/intervals/interval.d.ts +2 -2
- package/dist/intervals/interval.d.ts.map +1 -1
- package/dist/intervals/interval.js +2 -2
- package/dist/intervals/interval.js.map +1 -1
- package/dist/intervals/intervalUtils.d.ts +3 -3
- package/dist/intervals/intervalUtils.d.ts.map +1 -1
- package/dist/intervals/intervalUtils.js +1 -1
- package/dist/intervals/intervalUtils.js.map +1 -1
- package/dist/intervals/sequenceInterval.d.ts +2 -2
- package/dist/intervals/sequenceInterval.d.ts.map +1 -1
- package/dist/intervals/sequenceInterval.js +22 -23
- package/dist/intervals/sequenceInterval.js.map +1 -1
- package/dist/localValues.d.ts +2 -2
- package/dist/localValues.d.ts.map +1 -1
- package/dist/localValues.js.map +1 -1
- package/dist/package.json +3 -0
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/revertibles.d.ts +12 -12
- package/dist/revertibles.d.ts.map +1 -1
- package/dist/revertibles.js +26 -26
- package/dist/revertibles.js.map +1 -1
- package/dist/sequence-alpha.d.ts +172 -13
- package/dist/sequence-beta.d.ts +2 -0
- package/dist/sequence-public.d.ts +2 -0
- package/dist/sequence-untrimmed.d.ts +73 -14
- package/dist/sequence.d.ts +48 -5
- package/dist/sequence.d.ts.map +1 -1
- package/dist/sequence.js +103 -29
- package/dist/sequence.js.map +1 -1
- package/dist/sequenceFactory.d.ts +4 -1
- package/dist/sequenceFactory.d.ts.map +1 -1
- package/dist/sequenceFactory.js +8 -5
- package/dist/sequenceFactory.js.map +1 -1
- package/dist/sharedIntervalCollection.d.ts +2 -2
- package/dist/sharedIntervalCollection.d.ts.map +1 -1
- package/dist/sharedIntervalCollection.js +5 -5
- package/dist/sharedIntervalCollection.js.map +1 -1
- package/dist/sharedSequence.d.ts +1 -1
- package/dist/sharedSequence.d.ts.map +1 -1
- package/dist/sharedSequence.js +2 -2
- package/dist/sharedSequence.js.map +1 -1
- package/dist/sharedString.d.ts +2 -2
- package/dist/sharedString.d.ts.map +1 -1
- package/dist/sharedString.js +6 -6
- package/dist/sharedString.js.map +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/{defaultMap.d.mts → defaultMap.d.ts} +11 -17
- package/lib/defaultMap.d.ts.map +1 -0
- package/lib/{defaultMap.mjs → defaultMap.js} +72 -69
- package/lib/defaultMap.js.map +1 -0
- package/lib/{defaultMapInterfaces.d.mts → defaultMapInterfaces.d.ts} +2 -9
- package/lib/defaultMapInterfaces.d.ts.map +1 -0
- package/lib/{defaultMapInterfaces.mjs → defaultMapInterfaces.js} +1 -1
- package/lib/defaultMapInterfaces.js.map +1 -0
- package/lib/{index.d.mts → index.d.ts} +24 -12
- package/lib/index.d.ts.map +1 -0
- package/lib/{index.mjs → index.js} +11 -11
- package/lib/index.js.map +1 -0
- package/lib/{intervalCollection.d.mts → intervalCollection.d.ts} +22 -16
- package/lib/intervalCollection.d.ts.map +1 -0
- package/lib/{intervalCollection.mjs → intervalCollection.js} +23 -74
- package/lib/intervalCollection.js.map +1 -0
- package/lib/intervalIndex/{endpointInRangeIndex.d.mts → endpointInRangeIndex.d.ts} +4 -4
- package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{endpointInRangeIndex.mjs → endpointInRangeIndex.js} +3 -3
- package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
- package/lib/intervalIndex/{endpointIndex.d.mts → endpointIndex.d.ts} +4 -4
- package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{endpointIndex.mjs → endpointIndex.js} +2 -2
- package/lib/intervalIndex/endpointIndex.js.map +1 -0
- package/lib/intervalIndex/{idIntervalIndex.d.mts → idIntervalIndex.d.ts} +3 -3
- package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{idIntervalIndex.mjs → idIntervalIndex.js} +2 -2
- package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
- package/lib/intervalIndex/{index.d.mts → index.d.ts} +9 -9
- package/lib/intervalIndex/index.d.ts.map +1 -0
- package/lib/intervalIndex/{index.mjs → index.js} +7 -7
- package/lib/intervalIndex/index.js.map +1 -0
- package/lib/intervalIndex/{intervalIndex.d.mts → intervalIndex.d.ts} +2 -2
- package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{intervalIndex.mjs → intervalIndex.js} +1 -1
- package/lib/intervalIndex/intervalIndex.js.map +1 -0
- package/lib/intervalIndex/{intervalIndexUtils.d.mts → intervalIndexUtils.d.ts} +1 -1
- package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
- package/lib/intervalIndex/{intervalIndexUtils.mjs → intervalIndexUtils.js} +1 -1
- package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
- package/lib/intervalIndex/{overlappingIntervalsIndex.d.mts → overlappingIntervalsIndex.d.ts} +8 -11
- package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{overlappingIntervalsIndex.mjs → overlappingIntervalsIndex.js} +8 -9
- package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.d.mts → overlappingSequenceIntervalsIndex.d.ts} +3 -3
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.mjs → overlappingSequenceIntervalsIndex.js} +3 -3
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
- package/lib/intervalIndex/{sequenceIntervalIndexes.d.mts → sequenceIntervalIndexes.d.ts} +3 -3
- package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
- package/lib/intervalIndex/{sequenceIntervalIndexes.mjs → sequenceIntervalIndexes.js} +1 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
- package/lib/intervalIndex/{startpointInRangeIndex.d.mts → startpointInRangeIndex.d.ts} +4 -4
- package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
- package/lib/intervalIndex/{startpointInRangeIndex.mjs → startpointInRangeIndex.js} +3 -3
- package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
- package/lib/{intervalTree.d.mts → intervalTree.d.ts} +2 -2
- package/lib/intervalTree.d.ts.map +1 -0
- package/lib/{intervalTree.mjs → intervalTree.js} +1 -1
- package/lib/intervalTree.js.map +1 -0
- package/lib/intervals/{index.d.mts → index.d.ts} +4 -4
- package/lib/intervals/index.d.ts.map +1 -0
- package/lib/intervals/{index.mjs → index.js} +4 -4
- package/lib/intervals/index.js.map +1 -0
- package/lib/intervals/{interval.d.mts → interval.d.ts} +3 -3
- package/lib/intervals/{interval.d.mts.map → interval.d.ts.map} +1 -1
- package/lib/intervals/{interval.mjs → interval.js} +2 -2
- package/lib/intervals/interval.js.map +1 -0
- package/lib/intervals/{intervalUtils.d.mts → intervalUtils.d.ts} +4 -4
- package/lib/intervals/intervalUtils.d.ts.map +1 -0
- package/lib/intervals/{intervalUtils.mjs → intervalUtils.js} +3 -2
- package/lib/intervals/intervalUtils.js.map +1 -0
- package/lib/intervals/{sequenceInterval.d.mts → sequenceInterval.d.ts} +3 -3
- package/lib/intervals/sequenceInterval.d.ts.map +1 -0
- package/lib/intervals/{sequenceInterval.mjs → sequenceInterval.js} +5 -4
- package/lib/intervals/{sequenceInterval.mjs.map → sequenceInterval.js.map} +1 -1
- package/lib/{localValues.d.mts → localValues.d.ts} +3 -3
- package/lib/{localValues.d.mts.map → localValues.d.ts.map} +1 -1
- package/lib/{localValues.mjs → localValues.js} +1 -1
- package/lib/localValues.js.map +1 -0
- package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
- package/lib/packageVersion.d.ts.map +1 -0
- package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
- package/lib/packageVersion.js.map +1 -0
- package/lib/{revertibles.d.mts → revertibles.d.ts} +13 -13
- package/lib/revertibles.d.ts.map +1 -0
- package/lib/{revertibles.mjs → revertibles.js} +11 -10
- package/lib/revertibles.js.map +1 -0
- package/lib/{sequence-alpha.d.mts → sequence-alpha.d.ts} +185 -13
- package/lib/{sequence-public.d.mts → sequence-beta.d.ts} +15 -0
- package/lib/{sequence-beta.d.mts → sequence-public.d.ts} +15 -0
- package/lib/{sequence-untrimmed.d.mts → sequence-untrimmed.d.ts} +86 -14
- package/lib/{sequence.d.mts → sequence.d.ts} +49 -6
- package/lib/sequence.d.ts.map +1 -0
- package/lib/{sequence.mjs → sequence.js} +100 -29
- package/lib/sequence.js.map +1 -0
- package/lib/{sequenceDeltaEvent.d.mts → sequenceDeltaEvent.d.ts} +1 -1
- package/lib/sequenceDeltaEvent.d.ts.map +1 -0
- package/lib/{sequenceDeltaEvent.mjs → sequenceDeltaEvent.js} +1 -1
- package/lib/sequenceDeltaEvent.js.map +1 -0
- package/lib/{sequenceFactory.d.mts → sequenceFactory.d.ts} +5 -2
- package/lib/sequenceFactory.d.ts.map +1 -0
- package/lib/{sequenceFactory.mjs → sequenceFactory.js} +6 -3
- package/lib/sequenceFactory.js.map +1 -0
- package/lib/{sharedIntervalCollection.d.mts → sharedIntervalCollection.d.ts} +3 -3
- package/lib/sharedIntervalCollection.d.ts.map +1 -0
- package/lib/{sharedIntervalCollection.mjs → sharedIntervalCollection.js} +4 -4
- package/lib/sharedIntervalCollection.js.map +1 -0
- package/lib/{sharedSequence.d.mts → sharedSequence.d.ts} +2 -2
- package/lib/sharedSequence.d.ts.map +1 -0
- package/lib/{sharedSequence.mjs → sharedSequence.js} +2 -2
- package/lib/sharedSequence.js.map +1 -0
- package/lib/{sharedString.d.mts → sharedString.d.ts} +3 -3
- package/lib/sharedString.d.ts.map +1 -0
- package/lib/{sharedString.mjs → sharedString.js} +3 -3
- package/lib/sharedString.js.map +1 -0
- package/lib/test/collections.intervalTree.js +73 -0
- package/lib/test/collections.intervalTree.js.map +1 -0
- package/lib/test/createSnapshotFiles.js +15 -0
- package/lib/test/createSnapshotFiles.js.map +1 -0
- package/lib/test/dirname.cjs +16 -0
- package/lib/test/dirname.cjs.map +1 -0
- package/lib/test/endpointInRangeIndex.spec.js +182 -0
- package/lib/test/endpointInRangeIndex.spec.js.map +1 -0
- package/lib/test/fuzz/fuzzUtils.js +250 -0
- package/lib/test/fuzz/fuzzUtils.js.map +1 -0
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js +200 -0
- package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +129 -0
- package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -0
- package/lib/test/fuzz/sharedString.fuzz.spec.js +91 -0
- package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -0
- package/lib/test/generateSharedStrings.js +138 -0
- package/lib/test/generateSharedStrings.js.map +1 -0
- package/lib/test/intervalCollection.detached.spec.js +126 -0
- package/lib/test/intervalCollection.detached.spec.js.map +1 -0
- package/lib/test/intervalCollection.events.spec.js +491 -0
- package/lib/test/intervalCollection.events.spec.js.map +1 -0
- package/lib/test/intervalCollection.perf.spec.js +88 -0
- package/lib/test/intervalCollection.perf.spec.js.map +1 -0
- package/lib/test/intervalCollection.snapshot.spec.js +171 -0
- package/lib/test/intervalCollection.snapshot.spec.js.map +1 -0
- package/lib/test/intervalCollection.spec.js +1660 -0
- package/lib/test/intervalCollection.spec.js.map +1 -0
- package/lib/test/intervalIndexTestUtils.js +49 -0
- package/lib/test/intervalIndexTestUtils.js.map +1 -0
- package/lib/test/intervalRebasing.spec.js +589 -0
- package/lib/test/intervalRebasing.spec.js.map +1 -0
- package/lib/test/intervalStashedOps.spec.js +142 -0
- package/lib/test/intervalStashedOps.spec.js.map +1 -0
- package/lib/test/intervalTestUtils.js +81 -0
- package/lib/test/intervalTestUtils.js.map +1 -0
- package/lib/test/marshalling.spec.js +55 -0
- package/lib/test/marshalling.spec.js.map +1 -0
- package/lib/test/memory/sharedSequence.spec.js +82 -0
- package/lib/test/memory/sharedSequence.spec.js.map +1 -0
- package/lib/test/memory/sharedString.spec.js +134 -0
- package/lib/test/memory/sharedString.spec.js.map +1 -0
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js +348 -0
- package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -0
- package/lib/test/partialLoad.spec.js +211 -0
- package/lib/test/partialLoad.spec.js.map +1 -0
- package/lib/test/rebasing.spec.js +81 -0
- package/lib/test/rebasing.spec.js.map +1 -0
- package/lib/test/reentrancy.spec.js +174 -0
- package/lib/test/reentrancy.spec.js.map +1 -0
- package/lib/test/revertibles.spec.js +971 -0
- package/lib/test/revertibles.spec.js.map +1 -0
- package/lib/test/sequenceDeltaEvent.spec.js +2144 -0
- package/lib/test/sequenceDeltaEvent.spec.js.map +1 -0
- package/lib/test/sharedIntervalCollection.spec.js +159 -0
- package/lib/test/sharedIntervalCollection.spec.js.map +1 -0
- package/lib/test/sharedString.spec.js +532 -0
- package/lib/test/sharedString.spec.js.map +1 -0
- package/lib/test/snapshotEmptyProps.spec.js +45 -0
- package/lib/test/snapshotEmptyProps.spec.js.map +1 -0
- package/lib/test/snapshotVersion.spec.js +149 -0
- package/lib/test/snapshotVersion.spec.js.map +1 -0
- package/lib/test/startpointInRangeIndex.spec.js +182 -0
- package/lib/test/startpointInRangeIndex.spec.js.map +1 -0
- package/lib/test/subSequence.spec.js +92 -0
- package/lib/test/subSequence.spec.js.map +1 -0
- package/lib/test/types/validateSequencePrevious.generated.js +162 -0
- package/lib/test/types/validateSequencePrevious.generated.js.map +1 -0
- package/lib/test/v1IntervalCollectionHelpers.js +93 -0
- package/lib/test/v1IntervalCollectionHelpers.js.map +1 -0
- package/package.json +66 -60
- package/src/defaultMap.ts +97 -123
- package/src/defaultMapInterfaces.ts +1 -9
- package/src/index.ts +15 -11
- package/src/intervalCollection.ts +57 -84
- package/src/intervalIndex/endpointInRangeIndex.ts +4 -4
- package/src/intervalIndex/endpointIndex.ts +3 -3
- package/src/intervalIndex/idIntervalIndex.ts +3 -4
- package/src/intervalIndex/index.ts +8 -8
- package/src/intervalIndex/intervalIndex.ts +1 -1
- package/src/intervalIndex/overlappingIntervalsIndex.ts +10 -11
- package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +4 -4
- package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
- package/src/intervalIndex/startpointInRangeIndex.ts +4 -4
- package/src/intervalTree.ts +1 -1
- package/src/intervals/index.ts +3 -3
- package/src/intervals/interval.ts +2 -4
- package/src/intervals/intervalUtils.ts +3 -3
- package/src/intervals/sequenceInterval.ts +3 -4
- package/src/localValues.ts +2 -2
- package/src/packageVersion.ts +1 -1
- package/src/revertibles.ts +13 -13
- package/src/sequence.ts +126 -44
- package/src/sequenceFactory.ts +5 -2
- package/src/sharedIntervalCollection.ts +5 -5
- package/src/sharedSequence.ts +1 -1
- package/src/sharedString.ts +2 -2
- package/tsconfig.cjs.json +7 -0
- package/tsconfig.json +2 -5
- package/lib/defaultMap.d.mts.map +0 -1
- package/lib/defaultMap.mjs.map +0 -1
- package/lib/defaultMapInterfaces.d.mts.map +0 -1
- package/lib/defaultMapInterfaces.mjs.map +0 -1
- package/lib/index.d.mts.map +0 -1
- package/lib/index.mjs.map +0 -1
- package/lib/intervalCollection.d.mts.map +0 -1
- package/lib/intervalCollection.mjs.map +0 -1
- package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +0 -1
- package/lib/intervalIndex/endpointInRangeIndex.mjs.map +0 -1
- package/lib/intervalIndex/endpointIndex.d.mts.map +0 -1
- package/lib/intervalIndex/endpointIndex.mjs.map +0 -1
- package/lib/intervalIndex/idIntervalIndex.d.mts.map +0 -1
- package/lib/intervalIndex/idIntervalIndex.mjs.map +0 -1
- package/lib/intervalIndex/index.d.mts.map +0 -1
- package/lib/intervalIndex/index.mjs.map +0 -1
- package/lib/intervalIndex/intervalIndex.d.mts.map +0 -1
- package/lib/intervalIndex/intervalIndex.mjs.map +0 -1
- package/lib/intervalIndex/intervalIndexUtils.d.mts.map +0 -1
- package/lib/intervalIndex/intervalIndexUtils.mjs.map +0 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +0 -1
- package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +0 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +0 -1
- package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +0 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +0 -1
- package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +0 -1
- package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +0 -1
- package/lib/intervalIndex/startpointInRangeIndex.mjs.map +0 -1
- package/lib/intervalTree.d.mts.map +0 -1
- package/lib/intervalTree.mjs.map +0 -1
- package/lib/intervals/index.d.mts.map +0 -1
- package/lib/intervals/index.mjs.map +0 -1
- package/lib/intervals/interval.mjs.map +0 -1
- package/lib/intervals/intervalUtils.d.mts.map +0 -1
- package/lib/intervals/intervalUtils.mjs.map +0 -1
- package/lib/intervals/sequenceInterval.d.mts.map +0 -1
- package/lib/localValues.mjs.map +0 -1
- package/lib/packageVersion.d.mts.map +0 -1
- package/lib/packageVersion.mjs.map +0 -1
- package/lib/revertibles.d.mts.map +0 -1
- package/lib/revertibles.mjs.map +0 -1
- package/lib/sequence.d.mts.map +0 -1
- package/lib/sequence.mjs.map +0 -1
- package/lib/sequenceDeltaEvent.d.mts.map +0 -1
- package/lib/sequenceDeltaEvent.mjs.map +0 -1
- package/lib/sequenceFactory.d.mts.map +0 -1
- package/lib/sequenceFactory.mjs.map +0 -1
- package/lib/sharedIntervalCollection.d.mts.map +0 -1
- package/lib/sharedIntervalCollection.mjs.map +0 -1
- package/lib/sharedSequence.d.mts.map +0 -1
- package/lib/sharedSequence.mjs.map +0 -1
- package/lib/sharedString.d.mts.map +0 -1
- package/lib/sharedString.mjs.map +0 -1
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { BenchmarkType, benchmark } from "@fluid-tools/benchmark";
|
|
6
|
+
import { MockFluidDataStoreRuntime } from "@fluidframework/test-runtime-utils";
|
|
7
|
+
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
8
|
+
import { createOverlappingIntervalsIndex, } from "../intervalIndex/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Note: Merge-tree has a number of perf tests for core operations (insert, remove, annotate).
|
|
11
|
+
*
|
|
12
|
+
* Addition to the suite should take consideration to balance against existing merge-tree perf tests
|
|
13
|
+
* to avoid duplication.
|
|
14
|
+
*/
|
|
15
|
+
function runFindOverlappingIntervalsBenchmark({ intervalCount, segmentCount, segmentLength, type, }) {
|
|
16
|
+
let sharedString;
|
|
17
|
+
let intervalCollection;
|
|
18
|
+
let overlappingIntervalsIndex;
|
|
19
|
+
const setupSharedString = () => {
|
|
20
|
+
sharedString = new SharedStringFactory().create(new MockFluidDataStoreRuntime(), "id");
|
|
21
|
+
for (let i = 0; i < segmentCount; i++) {
|
|
22
|
+
sharedString.insertText(0, "a".repeat(segmentLength));
|
|
23
|
+
if (i % 2 === 0) {
|
|
24
|
+
// Annotating every other segment prevents zamboni appending adjacent segments.
|
|
25
|
+
sharedString.annotateRange(0, segmentLength, { foo: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
intervalCollection = sharedString.getIntervalCollection("ranges");
|
|
29
|
+
const intervalWidth = (segmentCount * segmentLength) / intervalCount / 2;
|
|
30
|
+
for (let i = 0; i < intervalCount; i++) {
|
|
31
|
+
intervalCollection.add({
|
|
32
|
+
start: intervalWidth * (2 * i),
|
|
33
|
+
end: intervalWidth * (2 * i + 1),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
// Create and attach the overlapping interval index
|
|
37
|
+
overlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString);
|
|
38
|
+
intervalCollection.attachIndex(overlappingIntervalsIndex);
|
|
39
|
+
};
|
|
40
|
+
benchmark({
|
|
41
|
+
title: `findOverlappingIntervals on string of length ${segmentCount * segmentLength} with ${intervalCount} equally spaced intervals and ${segmentCount} segments`,
|
|
42
|
+
type,
|
|
43
|
+
benchmarkFn: () => {
|
|
44
|
+
const start = (segmentLength * segmentCount) / 2;
|
|
45
|
+
const end = start + segmentLength;
|
|
46
|
+
overlappingIntervalsIndex.findOverlappingIntervals(start, end);
|
|
47
|
+
},
|
|
48
|
+
before: setupSharedString,
|
|
49
|
+
});
|
|
50
|
+
// Note: this test would likely be covered by a suite of local reference perf tests. In lieu of that,
|
|
51
|
+
// it simulates flows that some consumers might use involving resolving the endpoints of their sequence intervals.
|
|
52
|
+
benchmark({
|
|
53
|
+
title: `findOverlappingIntervals on string of length ${segmentCount * segmentLength} with ${intervalCount} equally spaced intervals and ${segmentCount} segments with endpoint resolution`,
|
|
54
|
+
type: BenchmarkType.Perspective,
|
|
55
|
+
benchmarkFn: () => {
|
|
56
|
+
const start = (segmentLength * segmentCount) / 2;
|
|
57
|
+
const end = start + segmentLength;
|
|
58
|
+
for (const interval of overlappingIntervalsIndex.findOverlappingIntervals(start, end)) {
|
|
59
|
+
sharedString.localReferencePositionToPosition(interval.start);
|
|
60
|
+
sharedString.localReferencePositionToPosition(interval.end);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
before: setupSharedString,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
describe("IntervalCollection perf", () => {
|
|
67
|
+
describe("findOverlappingIntervals", () => {
|
|
68
|
+
runFindOverlappingIntervalsBenchmark({
|
|
69
|
+
intervalCount: 200,
|
|
70
|
+
segmentCount: 100,
|
|
71
|
+
segmentLength: 250,
|
|
72
|
+
type: BenchmarkType.Measurement,
|
|
73
|
+
});
|
|
74
|
+
runFindOverlappingIntervalsBenchmark({
|
|
75
|
+
intervalCount: 200,
|
|
76
|
+
segmentCount: 100 * 250,
|
|
77
|
+
segmentLength: 1,
|
|
78
|
+
type: BenchmarkType.Perspective,
|
|
79
|
+
});
|
|
80
|
+
runFindOverlappingIntervalsBenchmark({
|
|
81
|
+
intervalCount: 2000,
|
|
82
|
+
segmentCount: 100,
|
|
83
|
+
segmentLength: 250,
|
|
84
|
+
type: BenchmarkType.Perspective,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=intervalCollection.perf.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intervalCollection.perf.spec.js","sourceRoot":"","sources":["../../src/test/intervalCollection.perf.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 { BenchmarkType, benchmark } from \"@fluid-tools/benchmark\";\nimport { MockFluidDataStoreRuntime } from \"@fluidframework/test-runtime-utils\";\nimport { SharedString } from \"../sharedString.js\";\nimport { SharedStringFactory } from \"../sequenceFactory.js\";\nimport { IIntervalCollection } from \"../intervalCollection.js\";\nimport { SequenceInterval } from \"../intervals/index.js\";\nimport {\n\tIOverlappingIntervalsIndex,\n\tcreateOverlappingIntervalsIndex,\n} from \"../intervalIndex/index.js\";\n\n/**\n * Note: Merge-tree has a number of perf tests for core operations (insert, remove, annotate).\n *\n * Addition to the suite should take consideration to balance against existing merge-tree perf tests\n * to avoid duplication.\n */\n\nfunction runFindOverlappingIntervalsBenchmark({\n\tintervalCount,\n\tsegmentCount,\n\tsegmentLength,\n\ttype,\n}: {\n\tintervalCount: number;\n\tsegmentCount: number;\n\tsegmentLength: number;\n\ttype: BenchmarkType;\n}) {\n\tlet sharedString: SharedString;\n\tlet intervalCollection: IIntervalCollection<SequenceInterval>;\n\tlet overlappingIntervalsIndex: IOverlappingIntervalsIndex<SequenceInterval>;\n\n\tconst setupSharedString = () => {\n\t\tsharedString = new SharedStringFactory().create(new MockFluidDataStoreRuntime(), \"id\");\n\t\tfor (let i = 0; i < segmentCount; i++) {\n\t\t\tsharedString.insertText(0, \"a\".repeat(segmentLength));\n\t\t\tif (i % 2 === 0) {\n\t\t\t\t// Annotating every other segment prevents zamboni appending adjacent segments.\n\t\t\t\tsharedString.annotateRange(0, segmentLength, { foo: true });\n\t\t\t}\n\t\t}\n\t\tintervalCollection = sharedString.getIntervalCollection(\"ranges\");\n\t\tconst intervalWidth = (segmentCount * segmentLength) / intervalCount / 2;\n\t\tfor (let i = 0; i < intervalCount; i++) {\n\t\t\tintervalCollection.add({\n\t\t\t\tstart: intervalWidth * (2 * i),\n\t\t\t\tend: intervalWidth * (2 * i + 1),\n\t\t\t});\n\t\t}\n\t\t// Create and attach the overlapping interval index\n\t\toverlappingIntervalsIndex = createOverlappingIntervalsIndex(sharedString);\n\t\tintervalCollection.attachIndex(overlappingIntervalsIndex);\n\t};\n\n\tbenchmark({\n\t\ttitle: `findOverlappingIntervals on string of length ${\n\t\t\tsegmentCount * segmentLength\n\t\t} with ${intervalCount} equally spaced intervals and ${segmentCount} segments`,\n\t\ttype,\n\t\tbenchmarkFn: () => {\n\t\t\tconst start = (segmentLength * segmentCount) / 2;\n\t\t\tconst end = start + segmentLength;\n\t\t\toverlappingIntervalsIndex.findOverlappingIntervals(start, end);\n\t\t},\n\t\tbefore: setupSharedString,\n\t});\n\n\t// Note: this test would likely be covered by a suite of local reference perf tests. In lieu of that,\n\t// it simulates flows that some consumers might use involving resolving the endpoints of their sequence intervals.\n\tbenchmark({\n\t\ttitle: `findOverlappingIntervals on string of length ${\n\t\t\tsegmentCount * segmentLength\n\t\t} with ${intervalCount} equally spaced intervals and ${segmentCount} segments with endpoint resolution`,\n\t\ttype: BenchmarkType.Perspective,\n\t\tbenchmarkFn: () => {\n\t\t\tconst start = (segmentLength * segmentCount) / 2;\n\t\t\tconst end = start + segmentLength;\n\t\t\tfor (const interval of overlappingIntervalsIndex.findOverlappingIntervals(start, end)) {\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.start);\n\t\t\t\tsharedString.localReferencePositionToPosition(interval.end);\n\t\t\t}\n\t\t},\n\t\tbefore: setupSharedString,\n\t});\n}\n\ndescribe(\"IntervalCollection perf\", () => {\n\tdescribe(\"findOverlappingIntervals\", () => {\n\t\trunFindOverlappingIntervalsBenchmark({\n\t\t\tintervalCount: 200,\n\t\t\tsegmentCount: 100,\n\t\t\tsegmentLength: 250,\n\t\t\ttype: BenchmarkType.Measurement,\n\t\t});\n\n\t\trunFindOverlappingIntervalsBenchmark({\n\t\t\tintervalCount: 200,\n\t\t\tsegmentCount: 100 * 250,\n\t\t\tsegmentLength: 1,\n\t\t\ttype: BenchmarkType.Perspective,\n\t\t});\n\n\t\trunFindOverlappingIntervalsBenchmark({\n\t\t\tintervalCount: 2000,\n\t\t\tsegmentCount: 100,\n\t\t\tsegmentLength: 250,\n\t\t\ttype: BenchmarkType.Perspective,\n\t\t});\n\t});\n});\n"]}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { strict as assert } from "assert";
|
|
6
|
+
import { ReferenceType, SlidingPreference } from "@fluidframework/merge-tree";
|
|
7
|
+
import { MockFluidDataStoreRuntime, MockContainerRuntimeFactory, MockStorage, } from "@fluidframework/test-runtime-utils";
|
|
8
|
+
import { AttachState } from "@fluidframework/container-definitions";
|
|
9
|
+
import { SharedString } from "../sharedString.js";
|
|
10
|
+
import { SharedStringFactory } from "../sequenceFactory.js";
|
|
11
|
+
import { intervalLocatorFromEndpoint, Side } from "../intervalCollection.js";
|
|
12
|
+
import { IntervalStickiness } from "../intervals/index.js";
|
|
13
|
+
import { assertSequenceIntervals } from "./intervalTestUtils.js";
|
|
14
|
+
async function loadSharedString(containerRuntimeFactory, id, summary) {
|
|
15
|
+
const dataStoreRuntime = new MockFluidDataStoreRuntime();
|
|
16
|
+
const containerRuntime = containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
|
|
17
|
+
dataStoreRuntime.deltaManager.lastSequenceNumber = containerRuntimeFactory.sequenceNumber;
|
|
18
|
+
const services = {
|
|
19
|
+
deltaConnection: dataStoreRuntime.createDeltaConnection(),
|
|
20
|
+
objectStorage: MockStorage.createFromSummary(summary),
|
|
21
|
+
};
|
|
22
|
+
const sharedString = new SharedString(dataStoreRuntime, id, SharedStringFactory.Attributes);
|
|
23
|
+
await sharedString.load(services);
|
|
24
|
+
await sharedString.loaded;
|
|
25
|
+
return sharedString;
|
|
26
|
+
}
|
|
27
|
+
async function getSingleIntervalSummary() {
|
|
28
|
+
const containerRuntimeFactory = new MockContainerRuntimeFactory();
|
|
29
|
+
const dataStoreRuntime = new MockFluidDataStoreRuntime();
|
|
30
|
+
dataStoreRuntime.setAttachState(AttachState.Attached);
|
|
31
|
+
dataStoreRuntime.options = {
|
|
32
|
+
intervalStickinessEnabled: true,
|
|
33
|
+
};
|
|
34
|
+
containerRuntimeFactory.createContainerRuntime(dataStoreRuntime);
|
|
35
|
+
const services = {
|
|
36
|
+
deltaConnection: dataStoreRuntime.createDeltaConnection(),
|
|
37
|
+
objectStorage: new MockStorage(),
|
|
38
|
+
};
|
|
39
|
+
const sharedString = new SharedString(dataStoreRuntime, "", SharedStringFactory.Attributes);
|
|
40
|
+
sharedString.initializeLocal();
|
|
41
|
+
sharedString.connect(services);
|
|
42
|
+
sharedString.insertText(0, "ABCDEF");
|
|
43
|
+
const collection = sharedString.getIntervalCollection("test");
|
|
44
|
+
collection.add({ start: 0, end: 2 });
|
|
45
|
+
const collectionStartSticky = sharedString.getIntervalCollection("start-sticky");
|
|
46
|
+
const startStickyInterval = collectionStartSticky.add({
|
|
47
|
+
start: { pos: 0, side: Side.After },
|
|
48
|
+
end: { pos: 2, side: Side.After },
|
|
49
|
+
});
|
|
50
|
+
assert.equal(startStickyInterval.stickiness, IntervalStickiness.START);
|
|
51
|
+
const collectionEndSticky = sharedString.getIntervalCollection("end-sticky");
|
|
52
|
+
const endStickyInterval = collectionEndSticky.add({
|
|
53
|
+
start: { pos: 0, side: Side.Before },
|
|
54
|
+
end: { pos: 2, side: Side.Before },
|
|
55
|
+
});
|
|
56
|
+
assert.equal(endStickyInterval.stickiness, IntervalStickiness.END);
|
|
57
|
+
containerRuntimeFactory.processAllMessages();
|
|
58
|
+
const { summary } = await sharedString.summarize();
|
|
59
|
+
return { summary, seq: containerRuntimeFactory.sequenceNumber };
|
|
60
|
+
}
|
|
61
|
+
describe("IntervalCollection snapshotting", () => {
|
|
62
|
+
let summary;
|
|
63
|
+
let seq;
|
|
64
|
+
before(async () => {
|
|
65
|
+
({ summary, seq } = await getSingleIntervalSummary());
|
|
66
|
+
});
|
|
67
|
+
let containerRuntimeFactory;
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
containerRuntimeFactory = new MockContainerRuntimeFactory();
|
|
70
|
+
containerRuntimeFactory.sequenceNumber = seq;
|
|
71
|
+
});
|
|
72
|
+
it("creates the correct reference type on reload", async () => {
|
|
73
|
+
// This is a direct regression test for an issue with interval collection deserialization logic.
|
|
74
|
+
// It manifested in later failures demonstrated by the "enable operations on reload" suite.
|
|
75
|
+
const sharedString = await loadSharedString(containerRuntimeFactory, "1", summary);
|
|
76
|
+
const collection = sharedString.getIntervalCollection("test");
|
|
77
|
+
const intervals = Array.from(collection);
|
|
78
|
+
assert.equal(intervals.length, 1);
|
|
79
|
+
const interval = intervals[0] ?? assert.fail();
|
|
80
|
+
/* eslint-disable no-bitwise */
|
|
81
|
+
assert(interval.start.refType === (ReferenceType.RangeBegin | ReferenceType.SlideOnRemove));
|
|
82
|
+
assert(interval.end.refType === (ReferenceType.RangeEnd | ReferenceType.SlideOnRemove));
|
|
83
|
+
/* eslint-enable no-bitwise */
|
|
84
|
+
});
|
|
85
|
+
it("start stickiness is persisted", async () => {
|
|
86
|
+
const sharedString = await loadSharedString(containerRuntimeFactory, "1", summary);
|
|
87
|
+
const collection = sharedString.getIntervalCollection("start-sticky");
|
|
88
|
+
const intervals = Array.from(collection);
|
|
89
|
+
assert.equal(intervals.length, 1);
|
|
90
|
+
const interval = intervals[0] ?? assert.fail();
|
|
91
|
+
assert.equal(interval.stickiness, IntervalStickiness.START);
|
|
92
|
+
assert.equal(interval.start.slidingPreference, SlidingPreference.BACKWARD);
|
|
93
|
+
assert.equal(interval.end.slidingPreference, SlidingPreference.BACKWARD);
|
|
94
|
+
});
|
|
95
|
+
it("end stickiness is stored as undefined", async () => {
|
|
96
|
+
const sharedString = await loadSharedString(containerRuntimeFactory, "1", summary);
|
|
97
|
+
const collection = sharedString.getIntervalCollection("end-sticky");
|
|
98
|
+
const intervals = Array.from(collection);
|
|
99
|
+
assert.equal(intervals.length, 1);
|
|
100
|
+
const interval = intervals[0] ?? assert.fail();
|
|
101
|
+
assert.equal(interval.stickiness, IntervalStickiness.END);
|
|
102
|
+
assert.equal(interval.start.slidingPreference, SlidingPreference.FORWARD);
|
|
103
|
+
assert.equal(interval.end.slidingPreference, SlidingPreference.FORWARD);
|
|
104
|
+
});
|
|
105
|
+
it("supports detached intervals", async () => {
|
|
106
|
+
const sharedString = await loadSharedString(containerRuntimeFactory, "1", summary);
|
|
107
|
+
sharedString.removeRange(0, sharedString.getLength());
|
|
108
|
+
containerRuntimeFactory.processAllMessages();
|
|
109
|
+
const { summary: detachedSummary } = await sharedString.summarize();
|
|
110
|
+
const stringLoadedWithDetachedInterval = await loadSharedString(containerRuntimeFactory, "2", detachedSummary);
|
|
111
|
+
const collection = stringLoadedWithDetachedInterval.getIntervalCollection("test");
|
|
112
|
+
assertSequenceIntervals(stringLoadedWithDetachedInterval, collection, [
|
|
113
|
+
{ start: -1, end: -1 },
|
|
114
|
+
]);
|
|
115
|
+
});
|
|
116
|
+
describe("enables operations on reload", () => {
|
|
117
|
+
let sharedString;
|
|
118
|
+
let sharedString2;
|
|
119
|
+
let collection;
|
|
120
|
+
let collection2;
|
|
121
|
+
let id;
|
|
122
|
+
beforeEach(async () => {
|
|
123
|
+
sharedString = await loadSharedString(containerRuntimeFactory, "1", summary);
|
|
124
|
+
sharedString2 = await loadSharedString(containerRuntimeFactory, "2", summary);
|
|
125
|
+
containerRuntimeFactory.processAllMessages();
|
|
126
|
+
collection = sharedString.getIntervalCollection("test");
|
|
127
|
+
collection2 = sharedString2.getIntervalCollection("test");
|
|
128
|
+
containerRuntimeFactory.processAllMessages();
|
|
129
|
+
const intervals = Array.from(collection);
|
|
130
|
+
assert.equal(intervals.length, 1);
|
|
131
|
+
const interval = intervals[0] ?? assert.fail("collection should have interval");
|
|
132
|
+
id = interval.getIntervalId() ?? assert.fail("interval should have id");
|
|
133
|
+
});
|
|
134
|
+
it("reloaded interval can be changed", async () => {
|
|
135
|
+
collection.change(id, { start: 1, end: 3 });
|
|
136
|
+
assertSequenceIntervals(sharedString, collection, [{ start: 1, end: 3 }]);
|
|
137
|
+
assertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);
|
|
138
|
+
containerRuntimeFactory.processAllMessages();
|
|
139
|
+
assertSequenceIntervals(sharedString2, collection2, [{ start: 1, end: 3 }]);
|
|
140
|
+
});
|
|
141
|
+
it("reloaded interval can be deleted", async () => {
|
|
142
|
+
collection.removeIntervalById(id);
|
|
143
|
+
assert.equal(Array.from(collection).length, 0);
|
|
144
|
+
assert.equal(Array.from(collection2).length, 1);
|
|
145
|
+
containerRuntimeFactory.processAllMessages();
|
|
146
|
+
assert.equal(Array.from(collection2).length, 0);
|
|
147
|
+
});
|
|
148
|
+
it("new interval can be added after reload", async () => {
|
|
149
|
+
collection.add({ start: 2, end: 4 });
|
|
150
|
+
assertSequenceIntervals(sharedString, collection, [
|
|
151
|
+
{ start: 0, end: 2 },
|
|
152
|
+
{ start: 2, end: 4 },
|
|
153
|
+
]);
|
|
154
|
+
assertSequenceIntervals(sharedString2, collection2, [{ start: 0, end: 2 }]);
|
|
155
|
+
containerRuntimeFactory.processAllMessages();
|
|
156
|
+
assertSequenceIntervals(sharedString2, collection2, [
|
|
157
|
+
{ start: 0, end: 2 },
|
|
158
|
+
{ start: 2, end: 4 },
|
|
159
|
+
]);
|
|
160
|
+
});
|
|
161
|
+
it("intervals can be retrieved from endpoints", async () => {
|
|
162
|
+
const interval1 = collection.getIntervalById(id) ?? assert.fail("collection should have interval");
|
|
163
|
+
const locator1 = intervalLocatorFromEndpoint(interval1.start);
|
|
164
|
+
assert.deepEqual(locator1, { interval: interval1, label: "test" });
|
|
165
|
+
const interval2 = collection.add({ start: 1, end: 2 });
|
|
166
|
+
const locator2 = intervalLocatorFromEndpoint(interval2.start);
|
|
167
|
+
assert.deepEqual(locator2, { interval: interval2, label: "test" });
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=intervalCollection.snapshot.spec.js.map
|
|
@@ -0,0 +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"]}
|