@fluidframework/tree 2.13.0 → 2.20.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/CHANGELOG.md +18 -0
- package/api-report/tree.alpha.api.md +22 -12
- package/api-report/tree.beta.api.md +9 -5
- package/api-report/tree.legacy.alpha.api.md +9 -5
- package/api-report/tree.legacy.public.api.md +9 -5
- package/api-report/tree.public.api.md +9 -5
- package/assertTagging.config.mjs +14 -0
- package/dist/alpha.d.ts +3 -0
- package/dist/core/index.d.ts +2 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/index.d.ts +2 -2
- package/dist/core/rebase/index.d.ts.map +1 -1
- package/dist/core/rebase/index.js +5 -1
- package/dist/core/rebase/index.js.map +1 -1
- package/dist/core/rebase/types.d.ts +5 -4
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +29 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/rebase/utils.d.ts +10 -0
- package/dist/core/rebase/utils.d.ts.map +1 -1
- package/dist/core/rebase/utils.js +22 -1
- package/dist/core/rebase/utils.js.map +1 -1
- package/dist/core/tree/delta.d.ts +21 -26
- package/dist/core/tree/delta.d.ts.map +1 -1
- package/dist/core/tree/delta.js.map +1 -1
- package/dist/core/tree/deltaUtil.d.ts +1 -3
- package/dist/core/tree/deltaUtil.d.ts.map +1 -1
- package/dist/core/tree/deltaUtil.js +2 -14
- package/dist/core/tree/deltaUtil.js.map +1 -1
- package/dist/core/tree/index.d.ts +1 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js +1 -3
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitDelta.d.ts.map +1 -1
- package/dist/core/tree/visitDelta.js +82 -80
- package/dist/core/tree/visitDelta.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/dist/feature-libraries/deltaUtils.js +13 -0
- package/dist/feature-libraries/deltaUtils.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -6
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
- package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
- package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +2 -2
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +8 -8
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +105 -199
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
- package/dist/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js +20 -0
- package/dist/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.d.ts +3 -3
- package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/dist/feature-libraries/sequence-field/rebase.js +4 -4
- package/dist/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +36 -4
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/dist/feature-libraries/treeCursorUtils.js +4 -1
- package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
- package/dist/index.d.ts +26 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/index.d.ts +1 -1
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js +4 -2
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +38 -18
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +38 -34
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +12 -8
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +1 -1
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/arrayNode.js +1 -1
- package/dist/simple-tree/arrayNode.js.map +1 -1
- package/dist/simple-tree/toMapTree.js +1 -1
- package/dist/simple-tree/toMapTree.js.map +1 -1
- package/dist/util/bTreeUtils.d.ts +10 -0
- package/dist/util/bTreeUtils.d.ts.map +1 -0
- package/dist/util/bTreeUtils.js +52 -0
- package/dist/util/bTreeUtils.js.map +1 -0
- package/dist/util/idAllocator.d.ts +0 -2
- package/dist/util/idAllocator.d.ts.map +1 -1
- package/dist/util/idAllocator.js +0 -2
- package/dist/util/idAllocator.js.map +1 -1
- package/dist/util/index.d.ts +2 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +5 -1
- package/dist/util/index.js.map +1 -1
- package/dist/util/rangeMap.d.ts +52 -30
- package/dist/util/rangeMap.d.ts.map +1 -1
- package/dist/util/rangeMap.js +161 -117
- package/dist/util/rangeMap.js.map +1 -1
- package/dist/util/utils.d.ts +4 -1
- package/dist/util/utils.d.ts.map +1 -1
- package/dist/util/utils.js +7 -1
- package/dist/util/utils.js.map +1 -1
- package/lib/alpha.d.ts +3 -0
- package/lib/core/index.d.ts +2 -2
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +2 -2
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/index.d.ts +2 -2
- package/lib/core/rebase/index.d.ts.map +1 -1
- package/lib/core/rebase/index.js +2 -2
- package/lib/core/rebase/index.js.map +1 -1
- package/lib/core/rebase/types.d.ts +5 -4
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +26 -1
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/rebase/utils.d.ts +10 -0
- package/lib/core/rebase/utils.d.ts.map +1 -1
- package/lib/core/rebase/utils.js +20 -0
- package/lib/core/rebase/utils.js.map +1 -1
- package/lib/core/tree/delta.d.ts +21 -26
- package/lib/core/tree/delta.d.ts.map +1 -1
- package/lib/core/tree/delta.js.map +1 -1
- package/lib/core/tree/deltaUtil.d.ts +1 -3
- package/lib/core/tree/deltaUtil.d.ts.map +1 -1
- package/lib/core/tree/deltaUtil.js +1 -12
- package/lib/core/tree/deltaUtil.js.map +1 -1
- package/lib/core/tree/index.d.ts +1 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitDelta.d.ts.map +1 -1
- package/lib/core/tree/visitDelta.js +82 -80
- package/lib/core/tree/visitDelta.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/deltaUtils.d.ts.map +1 -1
- package/lib/feature-libraries/deltaUtils.js +13 -0
- package/lib/feature-libraries/deltaUtils.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -6
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +5 -5
- package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js +2 -9
- package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +19 -2
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/genericFieldKind.js.map +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts +2 -2
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +4 -4
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +4 -4
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +74 -166
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts +11 -20
- package/lib/feature-libraries/modular-schema/modularChangeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js +18 -1
- package/lib/feature-libraries/modular-schema/modularChangeTypes.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.d.ts +3 -3
- package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
- package/lib/feature-libraries/sequence-field/rebase.js +4 -4
- package/lib/feature-libraries/sequence-field/rebase.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV1.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts +2 -3
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +36 -4
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.d.ts.map +1 -1
- package/lib/feature-libraries/treeCursorUtils.js +4 -1
- package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
- package/lib/index.d.ts +26 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/index.d.ts +1 -1
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js +1 -1
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +38 -18
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +37 -33
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +13 -9
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +1 -1
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/arrayNode.js +1 -1
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/toMapTree.js +1 -1
- package/lib/simple-tree/toMapTree.js.map +1 -1
- package/lib/util/bTreeUtils.d.ts +10 -0
- package/lib/util/bTreeUtils.d.ts.map +1 -0
- package/lib/util/bTreeUtils.js +47 -0
- package/lib/util/bTreeUtils.js.map +1 -0
- package/lib/util/idAllocator.d.ts +0 -2
- package/lib/util/idAllocator.d.ts.map +1 -1
- package/lib/util/idAllocator.js +0 -2
- package/lib/util/idAllocator.js.map +1 -1
- package/lib/util/index.d.ts +2 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js +2 -1
- package/lib/util/index.js.map +1 -1
- package/lib/util/rangeMap.d.ts +52 -30
- package/lib/util/rangeMap.d.ts.map +1 -1
- package/lib/util/rangeMap.js +160 -117
- package/lib/util/rangeMap.js.map +1 -1
- package/lib/util/utils.d.ts +4 -1
- package/lib/util/utils.d.ts.map +1 -1
- package/lib/util/utils.js +7 -1
- package/lib/util/utils.js.map +1 -1
- package/package.json +23 -23
- package/src/core/index.ts +5 -2
- package/src/core/rebase/index.ts +5 -0
- package/src/core/rebase/types.ts +33 -5
- package/src/core/rebase/utils.ts +27 -0
- package/src/core/tree/delta.ts +21 -26
- package/src/core/tree/deltaUtil.ts +1 -16
- package/src/core/tree/index.ts +0 -2
- package/src/core/tree/visitDelta.ts +108 -97
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +2 -2
- package/src/feature-libraries/deltaUtils.ts +13 -0
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -6
- package/src/feature-libraries/modular-schema/crossFieldQueries.ts +12 -13
- package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +21 -1
- package/src/feature-libraries/modular-schema/genericFieldKind.ts +2 -2
- package/src/feature-libraries/modular-schema/index.ts +2 -0
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +12 -11
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +138 -225
- package/src/feature-libraries/modular-schema/modularChangeTypes.ts +40 -27
- package/src/feature-libraries/optional-field/optionalField.ts +3 -3
- package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
- package/src/feature-libraries/sequence-field/rebase.ts +9 -3
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV1.ts +1 -1
- package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +1 -1
- package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +3 -4
- package/src/feature-libraries/sequence-field/utils.ts +36 -4
- package/src/feature-libraries/treeCursorUtils.ts +6 -1
- package/src/index.ts +34 -6
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/index.ts +4 -1
- package/src/shared-tree/sharedTree.ts +60 -40
- package/src/shared-tree/treeCheckout.ts +19 -12
- package/src/simple-tree/api/treeNodeApi.ts +1 -1
- package/src/simple-tree/arrayNode.ts +1 -1
- package/src/simple-tree/toMapTree.ts +1 -1
- package/src/util/bTreeUtils.ts +60 -0
- package/src/util/idAllocator.ts +0 -2
- package/src/util/index.ts +3 -0
- package/src/util/rangeMap.ts +208 -143
- package/src/util/utils.ts +10 -3
- package/lib/package.json +0 -3
|
@@ -11,7 +11,6 @@ import {
|
|
|
11
11
|
type ChangesetLocalId,
|
|
12
12
|
type DeltaDetachedNodeChanges,
|
|
13
13
|
type DeltaDetachedNodeId,
|
|
14
|
-
type DeltaFieldChanges,
|
|
15
14
|
type DeltaMark,
|
|
16
15
|
type RevisionTag,
|
|
17
16
|
areEqualChangeAtomIds,
|
|
@@ -40,6 +39,7 @@ import {
|
|
|
40
39
|
type RelevantRemovedRootsFromChild,
|
|
41
40
|
type ToDelta,
|
|
42
41
|
type NestedChangesIndices,
|
|
42
|
+
type FieldChangeDelta,
|
|
43
43
|
} from "../modular-schema/index.js";
|
|
44
44
|
|
|
45
45
|
import type {
|
|
@@ -657,8 +657,8 @@ export const optionalFieldEditor: OptionalFieldEditor = {
|
|
|
657
657
|
export function optionalFieldIntoDelta(
|
|
658
658
|
change: OptionalChangeset,
|
|
659
659
|
deltaFromChild: ToDelta,
|
|
660
|
-
):
|
|
661
|
-
const delta: Mutable<
|
|
660
|
+
): FieldChangeDelta {
|
|
661
|
+
const delta: Mutable<FieldChangeDelta> = {};
|
|
662
662
|
|
|
663
663
|
let markIsANoop = true;
|
|
664
664
|
const mark: Mutable<DeltaMark> = { count: 1 };
|
|
@@ -101,7 +101,7 @@ export function getMoveEffect(
|
|
|
101
101
|
id: MoveId,
|
|
102
102
|
count: number,
|
|
103
103
|
addDependency: boolean = true,
|
|
104
|
-
): RangeQueryResult<MoveEffect> {
|
|
104
|
+
): RangeQueryResult<ChangeAtomId, MoveEffect> {
|
|
105
105
|
const result = moveEffects.get(target, revision, id, count, addDependency);
|
|
106
106
|
return result.value !== undefined
|
|
107
107
|
? { ...result, value: adjustMoveEffectBasis(result.value as MoveEffectWithBasis, id) }
|
|
@@ -545,9 +545,14 @@ function getMovedChangesFromBaseMark(
|
|
|
545
545
|
baseMark: Mark,
|
|
546
546
|
): NodeId | undefined {
|
|
547
547
|
if (isMoveIn(baseMark)) {
|
|
548
|
-
return getMovedNodeChanges(moveEffects, baseMark.revision, baseMark.id);
|
|
548
|
+
return getMovedNodeChanges(moveEffects, baseMark.revision, baseMark.id, baseMark.count);
|
|
549
549
|
} else if (isAttachAndDetachEffect(baseMark) && isMoveIn(baseMark.attach)) {
|
|
550
|
-
return getMovedNodeChanges(
|
|
550
|
+
return getMovedNodeChanges(
|
|
551
|
+
moveEffects,
|
|
552
|
+
baseMark.attach.revision,
|
|
553
|
+
baseMark.attach.id,
|
|
554
|
+
baseMark.count,
|
|
555
|
+
);
|
|
551
556
|
} else {
|
|
552
557
|
return undefined;
|
|
553
558
|
}
|
|
@@ -557,7 +562,8 @@ function getMovedNodeChanges(
|
|
|
557
562
|
moveEffects: MoveEffectTable,
|
|
558
563
|
revision: RevisionTag | undefined,
|
|
559
564
|
id: MoveId,
|
|
565
|
+
count: number,
|
|
560
566
|
): NodeId | undefined {
|
|
561
|
-
return getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id,
|
|
567
|
+
return getMoveEffect(moveEffects, CrossFieldTarget.Destination, revision, id, count).value
|
|
562
568
|
?.rebasedChanges;
|
|
563
569
|
}
|
|
@@ -8,7 +8,6 @@ import { assert, unreachableCase } from "@fluidframework/core-utils/internal";
|
|
|
8
8
|
import {
|
|
9
9
|
type DeltaDetachedNodeChanges,
|
|
10
10
|
type DeltaDetachedNodeRename,
|
|
11
|
-
type DeltaFieldChanges,
|
|
12
11
|
type DeltaMark,
|
|
13
12
|
areEqualChangeAtomIds,
|
|
14
13
|
} from "../../core/index.js";
|
|
@@ -25,12 +24,12 @@ import {
|
|
|
25
24
|
getInputCellId,
|
|
26
25
|
isAttachAndDetachEffect,
|
|
27
26
|
} from "./utils.js";
|
|
28
|
-
import type { ToDelta } from "../modular-schema/index.js";
|
|
27
|
+
import type { FieldChangeDelta, ToDelta } from "../modular-schema/index.js";
|
|
29
28
|
|
|
30
29
|
export function sequenceFieldToDelta(
|
|
31
30
|
change: MarkList,
|
|
32
31
|
deltaFromChild: ToDelta,
|
|
33
|
-
):
|
|
32
|
+
): FieldChangeDelta {
|
|
34
33
|
const local: DeltaMark[] = [];
|
|
35
34
|
const global: DeltaDetachedNodeChanges[] = [];
|
|
36
35
|
const rename: DeltaDetachedNodeRename[] = [];
|
|
@@ -187,7 +186,7 @@ export function sequenceFieldToDelta(
|
|
|
187
186
|
}
|
|
188
187
|
local.pop();
|
|
189
188
|
}
|
|
190
|
-
const delta: Mutable<
|
|
189
|
+
const delta: Mutable<FieldChangeDelta> = {};
|
|
191
190
|
if (local.length > 0) {
|
|
192
191
|
delta.local = local;
|
|
193
192
|
}
|
|
@@ -942,13 +942,45 @@ function getCrossFieldKeysForMarkEffect(
|
|
|
942
942
|
// An insert behaves like a move where the source and destination are at the same location.
|
|
943
943
|
// An insert can become a move when after rebasing.
|
|
944
944
|
return [
|
|
945
|
-
|
|
946
|
-
|
|
945
|
+
{
|
|
946
|
+
key: {
|
|
947
|
+
target: CrossFieldTarget.Source,
|
|
948
|
+
revision: effect.revision,
|
|
949
|
+
localId: effect.id,
|
|
950
|
+
},
|
|
951
|
+
count,
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
key: {
|
|
955
|
+
target: CrossFieldTarget.Destination,
|
|
956
|
+
revision: effect.revision,
|
|
957
|
+
localId: effect.id,
|
|
958
|
+
},
|
|
959
|
+
count,
|
|
960
|
+
},
|
|
947
961
|
];
|
|
948
962
|
case "MoveOut":
|
|
949
|
-
return [
|
|
963
|
+
return [
|
|
964
|
+
{
|
|
965
|
+
key: {
|
|
966
|
+
target: CrossFieldTarget.Source,
|
|
967
|
+
revision: effect.revision,
|
|
968
|
+
localId: effect.id,
|
|
969
|
+
},
|
|
970
|
+
count,
|
|
971
|
+
},
|
|
972
|
+
];
|
|
950
973
|
case "MoveIn":
|
|
951
|
-
return [
|
|
974
|
+
return [
|
|
975
|
+
{
|
|
976
|
+
key: {
|
|
977
|
+
target: CrossFieldTarget.Destination,
|
|
978
|
+
revision: effect.revision,
|
|
979
|
+
localId: effect.id,
|
|
980
|
+
},
|
|
981
|
+
count,
|
|
982
|
+
},
|
|
983
|
+
];
|
|
952
984
|
case "AttachAndDetach":
|
|
953
985
|
return [
|
|
954
986
|
...getCrossFieldKeysForMarkEffect(effect.attach, count),
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
rootField,
|
|
21
21
|
} from "../core/index.js";
|
|
22
22
|
import { fail } from "../util/index.js";
|
|
23
|
+
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* {@link ITreeCursorSynchronous} that can return the underlying node objects.
|
|
@@ -177,7 +178,11 @@ class StackCursor<TNode> extends SynchronousCursor implements CursorWithNode<TNo
|
|
|
177
178
|
public enterNode(index: number): void {
|
|
178
179
|
// assert(this.mode === CursorLocationType.Fields, "must be in fields mode");
|
|
179
180
|
const siblings = this.getField();
|
|
180
|
-
|
|
181
|
+
if (!(index in siblings)) {
|
|
182
|
+
throw new UsageError(
|
|
183
|
+
"A child does not exist at the specified index, check the status of a node using `Tree.status()`.",
|
|
184
|
+
);
|
|
185
|
+
}
|
|
181
186
|
this.siblingStack.push(this.siblings);
|
|
182
187
|
this.indexStack.push(this.index);
|
|
183
188
|
this.index = index;
|
package/src/index.ts
CHANGED
|
@@ -14,13 +14,38 @@ export {
|
|
|
14
14
|
type RevertibleAlpha,
|
|
15
15
|
} from "./core/index.js";
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
Listeners,
|
|
19
|
-
IsListener,
|
|
20
|
-
Listenable,
|
|
21
|
-
Off,
|
|
17
|
+
import type {
|
|
18
|
+
Listeners as EventListeners,
|
|
19
|
+
IsListener as EventIsListener,
|
|
20
|
+
Listenable as EventListenable,
|
|
21
|
+
Off as EventOff,
|
|
22
22
|
} from "@fluidframework/core-interfaces";
|
|
23
23
|
|
|
24
|
+
/**
|
|
25
|
+
* {@inheritdoc @fluidframework/core-interfaces#Listeners}
|
|
26
|
+
* @public
|
|
27
|
+
* @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
|
|
28
|
+
*/
|
|
29
|
+
export type Listeners<T extends object> = EventListeners<T>;
|
|
30
|
+
/**
|
|
31
|
+
* {@inheritdoc @fluidframework/core-interfaces#IsListener}
|
|
32
|
+
* @public
|
|
33
|
+
* @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
|
|
34
|
+
*/
|
|
35
|
+
export type IsListener<T> = EventIsListener<T>;
|
|
36
|
+
/**
|
|
37
|
+
* {@inheritdoc @fluidframework/core-interfaces#Listenable}
|
|
38
|
+
* @public
|
|
39
|
+
* @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
|
|
40
|
+
*/
|
|
41
|
+
export type Listenable<T extends object> = EventListenable<T>;
|
|
42
|
+
/**
|
|
43
|
+
* {@inheritdoc @fluidframework/core-interfaces#Off}
|
|
44
|
+
* @public
|
|
45
|
+
* @deprecated Deprecated in `@fluidframework/tree`. Consider importing from `fluid-framework` or `@fluidframework/core-interfaces` instead.
|
|
46
|
+
*/
|
|
47
|
+
export type Off = EventOff;
|
|
48
|
+
|
|
24
49
|
export {
|
|
25
50
|
TreeStatus,
|
|
26
51
|
TreeCompressionStrategy,
|
|
@@ -32,7 +57,7 @@ export {
|
|
|
32
57
|
export {
|
|
33
58
|
type ITreeInternal,
|
|
34
59
|
type SharedTreeOptions,
|
|
35
|
-
ForestType,
|
|
60
|
+
type ForestType,
|
|
36
61
|
type SharedTreeFormatOptions,
|
|
37
62
|
SharedTreeFormatVersion,
|
|
38
63
|
Tree,
|
|
@@ -55,6 +80,9 @@ export {
|
|
|
55
80
|
type TransactionResultExt,
|
|
56
81
|
type TransactionResultSuccess,
|
|
57
82
|
type TransactionResultFailed,
|
|
83
|
+
ForestTypeOptimized,
|
|
84
|
+
ForestTypeExpensiveDebug,
|
|
85
|
+
ForestTypeReference,
|
|
58
86
|
} from "./shared-tree/index.js";
|
|
59
87
|
|
|
60
88
|
export {
|
package/src/packageVersion.ts
CHANGED
package/src/shared-tree/index.ts
CHANGED
|
@@ -9,7 +9,7 @@ export {
|
|
|
9
9
|
type SharedTreeOptions,
|
|
10
10
|
SharedTree,
|
|
11
11
|
getBranch,
|
|
12
|
-
ForestType,
|
|
12
|
+
type ForestType,
|
|
13
13
|
type SharedTreeContentSnapshot,
|
|
14
14
|
type SharedTreeFormatOptions,
|
|
15
15
|
SharedTreeFormatVersion,
|
|
@@ -17,6 +17,9 @@ export {
|
|
|
17
17
|
defaultSharedTreeOptions,
|
|
18
18
|
type ForestOptions,
|
|
19
19
|
type ITreeInternal,
|
|
20
|
+
ForestTypeOptimized,
|
|
21
|
+
ForestTypeExpensiveDebug,
|
|
22
|
+
ForestTypeReference,
|
|
20
23
|
} from "./sharedTree.js";
|
|
21
24
|
|
|
22
25
|
export {
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert
|
|
7
|
-
import type { IFluidHandle } from "@fluidframework/core-interfaces/internal";
|
|
6
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
|
+
import type { ErasedType, IFluidHandle } from "@fluidframework/core-interfaces/internal";
|
|
8
8
|
import type {
|
|
9
9
|
IChannelAttributes,
|
|
10
10
|
IChannelFactory,
|
|
@@ -186,30 +186,6 @@ function getCodecVersions(formatVersion: number): ExplicitCodecVersions {
|
|
|
186
186
|
return versions;
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
-
/**
|
|
190
|
-
* Build and return a forest of the requested type.
|
|
191
|
-
*/
|
|
192
|
-
export function buildConfiguredForest(
|
|
193
|
-
type: ForestType,
|
|
194
|
-
schema: TreeStoredSchemaSubscription,
|
|
195
|
-
idCompressor: IIdCompressor,
|
|
196
|
-
): IEditableForest {
|
|
197
|
-
switch (type) {
|
|
198
|
-
case ForestType.Optimized:
|
|
199
|
-
return buildChunkedForest(
|
|
200
|
-
makeTreeChunker(schema, defaultSchemaPolicy),
|
|
201
|
-
undefined,
|
|
202
|
-
idCompressor,
|
|
203
|
-
);
|
|
204
|
-
case ForestType.Reference:
|
|
205
|
-
return buildForest();
|
|
206
|
-
case ForestType.Expensive:
|
|
207
|
-
return buildForest(undefined, true);
|
|
208
|
-
default:
|
|
209
|
-
unreachableCase(type);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
189
|
/**
|
|
214
190
|
* Shared tree, configured with a good set of indexes and field kinds which will maintain compatibility over time.
|
|
215
191
|
*
|
|
@@ -596,26 +572,70 @@ export interface SharedTreeFormatOptions {
|
|
|
596
572
|
|
|
597
573
|
/**
|
|
598
574
|
* Used to distinguish between different forest types.
|
|
575
|
+
* @remarks
|
|
576
|
+
* Current options are {@link ForestTypeReference}, {@link ForestTypeOptimized} and {@link ForestTypeExpensiveDebug}.
|
|
577
|
+
* @sealed @alpha
|
|
578
|
+
*/
|
|
579
|
+
export interface ForestType extends ErasedType<"ForestType"> {}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* Reference implementation of forest.
|
|
583
|
+
* @remarks
|
|
584
|
+
* A simple implementation with minimal complexity and moderate debuggability, validation and performance.
|
|
585
|
+
* @privateRemarks
|
|
586
|
+
* The "ObjectForest" forest type.
|
|
599
587
|
* @alpha
|
|
600
588
|
*/
|
|
601
|
-
export
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
589
|
+
export const ForestTypeReference = toForestType(() => buildForest());
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Optimized implementation of forest.
|
|
593
|
+
* @remarks
|
|
594
|
+
* A complex optimized forest implementation, which has minimal validation and debuggability to optimize for performance.
|
|
595
|
+
* Uses an internal representation optimized for size designed to scale to larger datasets with reduced overhead.
|
|
596
|
+
* @privateRemarks
|
|
597
|
+
* The "ChunkedForest" forest type.
|
|
598
|
+
* @alpha
|
|
599
|
+
*/
|
|
600
|
+
export const ForestTypeOptimized = toForestType(
|
|
601
|
+
(schema: TreeStoredSchemaSubscription, idCompressor: IIdCompressor) =>
|
|
602
|
+
buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy), undefined, idCompressor),
|
|
603
|
+
);
|
|
604
|
+
|
|
605
|
+
/**
|
|
606
|
+
* Slow implementation of forest intended only for debugging.
|
|
607
|
+
* @remarks
|
|
608
|
+
* Includes validation with scales poorly.
|
|
609
|
+
* May be asymptotically slower than {@link ForestTypeReference}, and may perform very badly with larger data sizes.
|
|
610
|
+
* @privateRemarks
|
|
611
|
+
* The "ObjectForest" forest type with expensive asserts for debugging.
|
|
612
|
+
* @alpha
|
|
613
|
+
*/
|
|
614
|
+
export const ForestTypeExpensiveDebug = toForestType(() => buildForest(undefined, true));
|
|
615
|
+
|
|
616
|
+
type ForestFactory = (
|
|
617
|
+
schema: TreeStoredSchemaSubscription,
|
|
618
|
+
idCompressor: IIdCompressor,
|
|
619
|
+
) => IEditableForest;
|
|
620
|
+
|
|
621
|
+
function toForestType(factory: ForestFactory): ForestType {
|
|
622
|
+
return factory as unknown as ForestType;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Build and return a forest of the requested type.
|
|
627
|
+
*/
|
|
628
|
+
export function buildConfiguredForest(
|
|
629
|
+
factory: ForestType,
|
|
630
|
+
schema: TreeStoredSchemaSubscription,
|
|
631
|
+
idCompressor: IIdCompressor,
|
|
632
|
+
): IEditableForest {
|
|
633
|
+
return (factory as unknown as ForestFactory)(schema, idCompressor);
|
|
614
634
|
}
|
|
615
635
|
|
|
616
636
|
export const defaultSharedTreeOptions: Required<SharedTreeOptionsInternal> = {
|
|
617
637
|
jsonValidator: noopValidator,
|
|
618
|
-
forest:
|
|
638
|
+
forest: ForestTypeReference,
|
|
619
639
|
treeEncodeType: TreeCompressionStrategy.Compressed,
|
|
620
640
|
formatVersion: SharedTreeFormatVersion.v3,
|
|
621
641
|
disposeForksAfterTransaction: true,
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
type RevertibleAlphaFactory,
|
|
42
42
|
type RevertibleAlpha,
|
|
43
43
|
type GraphCommit,
|
|
44
|
+
isAncestor,
|
|
44
45
|
} from "../core/index.js";
|
|
45
46
|
import {
|
|
46
47
|
type FieldBatchCodec,
|
|
@@ -605,21 +606,27 @@ export class TreeCheckout implements ITreeCheckoutFork {
|
|
|
605
606
|
revertible.dispose();
|
|
606
607
|
}
|
|
607
608
|
},
|
|
608
|
-
clone: (
|
|
609
|
-
if (forkedBranch === undefined) {
|
|
610
|
-
return this.createRevertible(revision, kind, checkout, onRevertibleDisposed);
|
|
611
|
-
}
|
|
612
|
-
|
|
609
|
+
clone: (targetBranch: TreeBranch) => {
|
|
613
610
|
// TODO:#23442: When a revertible is cloned for a forked branch, optimize to create a fork of a revertible branch once per revision NOT once per revision per checkout.
|
|
614
|
-
const
|
|
611
|
+
const targetCheckout = getCheckout(targetBranch);
|
|
612
|
+
|
|
615
613
|
const revertibleBranch = this.revertibleCommitBranches.get(revision);
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
614
|
+
if (revertibleBranch === undefined) {
|
|
615
|
+
throw new UsageError("Unable to clone a revertible that has been disposed.");
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const commitToRevert = revertibleBranch.getHead();
|
|
619
|
+
const activeBranchHead = targetCheckout.#transaction.activeBranch.getHead();
|
|
620
|
+
|
|
621
|
+
if (isAncestor(commitToRevert, activeBranchHead, true) === false) {
|
|
622
|
+
throw new UsageError(
|
|
623
|
+
"Cannot clone revertible for a commit that is not present on the given branch.",
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
targetCheckout.revertibleCommitBranches.set(revision, revertibleBranch.fork());
|
|
621
628
|
|
|
622
|
-
return this.createRevertible(revision, kind,
|
|
629
|
+
return this.createRevertible(revision, kind, targetCheckout, onRevertibleDisposed);
|
|
623
630
|
},
|
|
624
631
|
dispose: () => {
|
|
625
632
|
if (revertible.status === RevertibleStatus.Disposed) {
|
|
@@ -174,7 +174,7 @@ export const treeNodeApi: TreeNodeApi = {
|
|
|
174
174
|
changedFields,
|
|
175
175
|
(field) =>
|
|
176
176
|
nodeSchema.storedKeyToPropertyKey.get(field) ??
|
|
177
|
-
fail(
|
|
177
|
+
fail("Could not find stored key in schema."),
|
|
178
178
|
),
|
|
179
179
|
);
|
|
180
180
|
listener({ changedProperties });
|
|
@@ -993,7 +993,7 @@ abstract class CustomArrayNodeBase<const T extends ImplicitAllowedTypes>
|
|
|
993
993
|
if (!destinationField.context.isHydrated()) {
|
|
994
994
|
if (!(sourceField instanceof UnhydratedTreeSequenceField)) {
|
|
995
995
|
throw new UsageError(
|
|
996
|
-
"Cannot move elements from
|
|
996
|
+
"Cannot move elements from a hydrated array to an unhydrated array.",
|
|
997
997
|
);
|
|
998
998
|
}
|
|
999
999
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { BTree } from "@tylerbu/sorted-btree-es6";
|
|
7
|
+
import { brand, type Brand } from "./brand.js";
|
|
8
|
+
|
|
9
|
+
export type TupleBTree<K, V> = Brand<BTree<K, V>, "TupleBTree">;
|
|
10
|
+
|
|
11
|
+
export function newTupleBTree<K extends readonly unknown[], V>(
|
|
12
|
+
entries?: [K, V][],
|
|
13
|
+
): TupleBTree<K, V> {
|
|
14
|
+
return brand(new BTree<K, V>(entries, compareTuples));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// This assumes that the arrays are the same length.
|
|
18
|
+
function compareTuples(arrayA: readonly unknown[], arrayB: readonly unknown[]): number {
|
|
19
|
+
for (let i = 0; i < arrayA.length; i++) {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
+
const a = arrayA[i] as any;
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
23
|
+
const b = arrayB[i] as any;
|
|
24
|
+
|
|
25
|
+
// Less-than and greater-than always return false if either value is undefined,
|
|
26
|
+
// so we handle undefined separately, treating it as less than all other values.
|
|
27
|
+
if (a === undefined && b !== undefined) {
|
|
28
|
+
return -1;
|
|
29
|
+
} else if (b === undefined && a !== undefined) {
|
|
30
|
+
return 1;
|
|
31
|
+
} else if (a < b) {
|
|
32
|
+
return -1;
|
|
33
|
+
} else if (a > b) {
|
|
34
|
+
return 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function mergeTupleBTrees<K extends readonly unknown[], V>(
|
|
42
|
+
tree1: TupleBTree<K, V> | undefined,
|
|
43
|
+
tree2: TupleBTree<K, V> | undefined,
|
|
44
|
+
preferLeft = true,
|
|
45
|
+
): TupleBTree<K, V> {
|
|
46
|
+
if (tree1 === undefined) {
|
|
47
|
+
return tree2 !== undefined ? brand(tree2.clone()) : newTupleBTree<K, V>();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const result: TupleBTree<K, V> = brand(tree1.clone());
|
|
51
|
+
if (tree2 === undefined) {
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
for (const [key, value] of tree2.entries()) {
|
|
56
|
+
result.set(key, value, !preferLeft);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return result;
|
|
60
|
+
}
|
package/src/util/idAllocator.ts
CHANGED
package/src/util/index.ts
CHANGED
|
@@ -123,6 +123,7 @@ export {
|
|
|
123
123
|
export {
|
|
124
124
|
RangeMap,
|
|
125
125
|
type RangeQueryResult,
|
|
126
|
+
newIntegerRangeMap,
|
|
126
127
|
} from "./rangeMap.js";
|
|
127
128
|
|
|
128
129
|
export {
|
|
@@ -140,3 +141,5 @@ export {
|
|
|
140
141
|
throwIfBroken,
|
|
141
142
|
breakingClass,
|
|
142
143
|
} from "./breakable.js";
|
|
144
|
+
|
|
145
|
+
export { type TupleBTree, newTupleBTree, mergeTupleBTrees } from "./bTreeUtils.js";
|