@fluidframework/tree 2.1.0-281041 → 2.1.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/.vscode/Tree.code-workspace +2 -1
- package/CHANGELOG.md +38 -0
- package/README.md +6 -6
- package/api-report/tree.alpha.api.md +1 -1
- package/api-report/tree.beta.api.md +1 -1
- package/api-report/tree.public.api.md +1 -1
- package/dist/core/forest/editableForest.d.ts.map +1 -1
- package/dist/core/forest/editableForest.js +4 -2
- package/dist/core/forest/editableForest.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts +1 -0
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +13 -0
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +48 -11
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +144 -20
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.js +13 -4
- package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/dist/core/tree/index.d.ts +2 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitDelta.d.ts +3 -1
- package/dist/core/tree/visitDelta.d.ts.map +1 -1
- package/dist/core/tree/visitDelta.js +31 -15
- package/dist/core/tree/visitDelta.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +3 -3
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js +4 -4
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/feature-libraries/editableTreeBinder.js +1 -1
- package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +0 -52
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/index.d.ts +2 -1
- package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/index.js +5 -1
- package/dist/feature-libraries/flex-tree/index.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +1 -2
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +10 -18
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +0 -27
- package/dist/feature-libraries/flex-tree/lazyNode.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 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -1
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +4 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/discrepancies.js +3 -3
- package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +5 -4
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +5 -1
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +8 -1
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/treeApi.js +1 -1
- package/dist/shared-tree/treeApi.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +10 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +47 -4
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree/treeView.d.ts.map +1 -1
- package/dist/shared-tree/treeView.js +7 -3
- package/dist/shared-tree/treeView.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +6 -0
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +2 -0
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +4 -0
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +6 -0
- package/dist/shared-tree-core/sharedTreeCore.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/index.d.ts +3 -3
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +2 -1
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/proxies.d.ts.map +1 -1
- package/dist/simple-tree/proxies.js +7 -21
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/simple-tree/proxyBinding.d.ts +4 -0
- package/dist/simple-tree/proxyBinding.d.ts.map +1 -1
- package/dist/simple-tree/proxyBinding.js +23 -1
- package/dist/simple-tree/proxyBinding.js.map +1 -1
- package/dist/simple-tree/tree.d.ts.map +1 -1
- package/dist/simple-tree/tree.js +1 -1
- package/dist/simple-tree/tree.js.map +1 -1
- package/dist/simple-tree/treeNodeApi.d.ts +2 -75
- package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/treeNodeApi.js +7 -15
- package/dist/simple-tree/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/treeNodeKernel.d.ts +26 -0
- package/dist/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/dist/simple-tree/treeNodeKernel.js +83 -0
- package/dist/simple-tree/treeNodeKernel.js.map +1 -0
- package/dist/simple-tree/types.d.ts +73 -0
- package/dist/simple-tree/types.d.ts.map +1 -1
- package/dist/simple-tree/types.js +89 -1
- package/dist/simple-tree/types.js.map +1 -1
- package/dist/util/breakable.js +1 -1
- package/dist/util/breakable.js.map +1 -1
- package/dist/util/index.d.ts +1 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js.map +1 -1
- package/lib/core/forest/editableForest.d.ts.map +1 -1
- package/lib/core/forest/editableForest.js +4 -2
- package/lib/core/forest/editableForest.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts +1 -0
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +13 -0
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +48 -11
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +145 -21
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.js +13 -4
- package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/lib/core/tree/index.d.ts +2 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitDelta.d.ts +3 -1
- package/lib/core/tree/visitDelta.d.ts.map +1 -1
- package/lib/core/tree/visitDelta.js +31 -15
- package/lib/core/tree/visitDelta.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +3 -3
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js +4 -4
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/feature-libraries/editableTreeBinder.js +1 -1
- package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +2 -54
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/index.d.ts +2 -1
- package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/index.js +2 -1
- package/lib/feature-libraries/flex-tree/index.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +1 -2
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +12 -20
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +3 -30
- package/lib/feature-libraries/flex-tree/lazyNode.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 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -1
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +1 -1
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/discrepancies.js +3 -3
- package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +5 -4
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +5 -1
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +8 -1
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/treeApi.js +1 -1
- package/lib/shared-tree/treeApi.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +10 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +47 -4
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree/treeView.d.ts.map +1 -1
- package/lib/shared-tree/treeView.js +4 -0
- package/lib/shared-tree/treeView.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +6 -0
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +2 -0
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +4 -0
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +6 -0
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/simple-tree/arrayNode.js +2 -2
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/index.d.ts +3 -3
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +1 -1
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/proxies.d.ts.map +1 -1
- package/lib/simple-tree/proxies.js +7 -21
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/simple-tree/proxyBinding.d.ts +4 -0
- package/lib/simple-tree/proxyBinding.d.ts.map +1 -1
- package/lib/simple-tree/proxyBinding.js +19 -0
- package/lib/simple-tree/proxyBinding.js.map +1 -1
- package/lib/simple-tree/tree.d.ts.map +1 -1
- package/lib/simple-tree/tree.js +1 -1
- package/lib/simple-tree/tree.js.map +1 -1
- package/lib/simple-tree/treeNodeApi.d.ts +2 -75
- package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/treeNodeApi.js +9 -17
- package/lib/simple-tree/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/treeNodeKernel.d.ts +26 -0
- package/lib/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/lib/simple-tree/treeNodeKernel.js +79 -0
- package/lib/simple-tree/treeNodeKernel.js.map +1 -0
- package/lib/simple-tree/types.d.ts +73 -0
- package/lib/simple-tree/types.d.ts.map +1 -1
- package/lib/simple-tree/types.js +90 -2
- package/lib/simple-tree/types.js.map +1 -1
- package/lib/util/breakable.js +1 -1
- package/lib/util/breakable.js.map +1 -1
- package/lib/util/index.d.ts +1 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js.map +1 -1
- package/package.json +22 -22
- package/src/core/forest/editableForest.ts +10 -2
- package/src/core/tree/anchorSet.ts +14 -0
- package/src/core/tree/detachedFieldIndex.ts +217 -35
- package/src/core/tree/detachedFieldIndexCodec.ts +17 -8
- package/src/core/tree/detachedFieldIndexFormat.ts +1 -1
- package/src/core/tree/detachedFieldIndexTypes.ts +41 -5
- package/src/core/tree/index.ts +2 -1
- package/src/core/tree/visitDelta.ts +57 -16
- package/src/core/tree/visitorUtils.ts +7 -4
- package/src/feature-libraries/editableTreeBinder.ts +1 -1
- package/src/feature-libraries/flex-map-tree/mapTreeNode.ts +1 -65
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -19
- package/src/feature-libraries/flex-tree/index.ts +7 -1
- package/src/feature-libraries/flex-tree/lazyEntity.ts +0 -3
- package/src/feature-libraries/flex-tree/lazyField.ts +14 -26
- package/src/feature-libraries/flex-tree/lazyNode.ts +1 -42
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -0
- package/src/feature-libraries/index.ts +3 -0
- package/src/feature-libraries/modular-schema/discrepancies.ts +3 -3
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +1 -1
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +22 -20
- package/src/feature-libraries/object-forest/objectForest.ts +7 -3
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/sharedTree.ts +8 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +1 -1
- package/src/shared-tree/treeApi.ts +1 -1
- package/src/shared-tree/treeCheckout.ts +56 -5
- package/src/shared-tree/treeView.ts +5 -0
- package/src/shared-tree-core/branch.ts +9 -0
- package/src/shared-tree-core/sharedTreeCore.ts +7 -0
- package/src/simple-tree/arrayNode.ts +2 -2
- package/src/simple-tree/index.ts +3 -3
- package/src/simple-tree/proxies.ts +8 -29
- package/src/simple-tree/proxyBinding.ts +23 -0
- package/src/simple-tree/tree.ts +4 -1
- package/src/simple-tree/treeNodeApi.ts +14 -96
- package/src/simple-tree/treeNodeKernel.ts +91 -0
- package/src/simple-tree/types.ts +233 -2
- package/src/util/breakable.ts +1 -1
- package/src/util/index.ts +1 -0
|
@@ -7,11 +7,12 @@ import { assert } from "@fluidframework/core-utils/internal";
|
|
|
7
7
|
|
|
8
8
|
import type { ICodecOptions } from "../../codec/index.js";
|
|
9
9
|
import { type IdAllocator, idAllocatorFromMaxId } from "../../util/index.js";
|
|
10
|
-
import type { RevisionTagCodec } from "../rebase/index.js";
|
|
10
|
+
import type { RevisionTag, RevisionTagCodec } from "../rebase/index.js";
|
|
11
11
|
import type { FieldKey } from "../schema-stored/index.js";
|
|
12
12
|
|
|
13
13
|
import type { ProtoNodes, Root } from "./delta.js";
|
|
14
|
-
import { DetachedFieldIndex
|
|
14
|
+
import { DetachedFieldIndex } from "./detachedFieldIndex.js";
|
|
15
|
+
import type { ForestRootId } from "./detachedFieldIndexTypes.js";
|
|
15
16
|
import type { PlaceIndex, Range } from "./pathTree.js";
|
|
16
17
|
import { type DeltaVisitor, visitDelta } from "./visitDelta.js";
|
|
17
18
|
import type { IIdCompressor } from "@fluidframework/id-compressor";
|
|
@@ -33,21 +34,23 @@ export function makeDetachedFieldIndex(
|
|
|
33
34
|
|
|
34
35
|
export function applyDelta(
|
|
35
36
|
delta: Root,
|
|
37
|
+
latestRevision: RevisionTag | undefined,
|
|
36
38
|
deltaProcessor: { acquireVisitor: () => DeltaVisitor },
|
|
37
39
|
detachedFieldIndex: DetachedFieldIndex,
|
|
38
40
|
): void {
|
|
39
41
|
const visitor = deltaProcessor.acquireVisitor();
|
|
40
|
-
visitDelta(delta, visitor, detachedFieldIndex);
|
|
42
|
+
visitDelta(delta, visitor, detachedFieldIndex, latestRevision);
|
|
41
43
|
visitor.free();
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
export function announceDelta(
|
|
45
47
|
delta: Root,
|
|
48
|
+
latestRevision: RevisionTag | undefined,
|
|
46
49
|
deltaProcessor: { acquireVisitor: () => DeltaVisitor & AnnouncedVisitor },
|
|
47
50
|
detachedFieldIndex: DetachedFieldIndex,
|
|
48
51
|
): void {
|
|
49
52
|
const visitor = deltaProcessor.acquireVisitor();
|
|
50
|
-
visitDelta(delta, combineVisitors([visitor], [visitor]), detachedFieldIndex);
|
|
53
|
+
visitDelta(delta, combineVisitors([visitor], [visitor]), detachedFieldIndex, latestRevision);
|
|
51
54
|
visitor.free();
|
|
52
55
|
}
|
|
53
56
|
|
|
@@ -741,7 +741,7 @@ class AbstractDataBinder<
|
|
|
741
741
|
const visitor = getOrCreate(this.visitors, anchor, () => {
|
|
742
742
|
const newVisitor = this.visitorFactory(anchor);
|
|
743
743
|
this.unregisterHandles.add(
|
|
744
|
-
anchor.on("subtreeChanging", (upPath: UpPath) => {
|
|
744
|
+
anchor.anchorNode.on("subtreeChanging", (upPath: UpPath) => {
|
|
745
745
|
assert(newVisitor !== undefined, 0x6dc /* visitor expected to be defined */);
|
|
746
746
|
if (!this.visitorLocations.has(newVisitor)) {
|
|
747
747
|
this.visitorLocations.set(newVisitor, upPath);
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
type TreeValue,
|
|
15
15
|
type Value,
|
|
16
16
|
} from "../../core/index.js";
|
|
17
|
-
import { brand, fail,
|
|
17
|
+
import { brand, fail, mapIterable } from "../../util/index.js";
|
|
18
18
|
import {
|
|
19
19
|
type FlexTreeContext,
|
|
20
20
|
FlexTreeEntityKind,
|
|
@@ -23,7 +23,6 @@ import {
|
|
|
23
23
|
type FlexTreeLeafNode,
|
|
24
24
|
type FlexTreeMapNode,
|
|
25
25
|
type FlexTreeNode,
|
|
26
|
-
type FlexTreeNodeEvents,
|
|
27
26
|
type FlexTreeOptionalField,
|
|
28
27
|
type FlexTreeRequiredField,
|
|
29
28
|
type FlexTreeSequenceField,
|
|
@@ -34,7 +33,6 @@ import {
|
|
|
34
33
|
type FlexTreeUnboxNodeUnion,
|
|
35
34
|
type FlexibleFieldContent,
|
|
36
35
|
type FlexibleNodeSubSequence,
|
|
37
|
-
TreeStatus,
|
|
38
36
|
flexTreeMarker,
|
|
39
37
|
indexForAt,
|
|
40
38
|
} from "../flex-tree/index.js";
|
|
@@ -54,7 +52,6 @@ import {
|
|
|
54
52
|
import { type FlexImplicitAllowedTypes, normalizeAllowedTypes } from "../schemaBuilderBase.js";
|
|
55
53
|
import type { FlexFieldKind } from "../modular-schema/index.js";
|
|
56
54
|
import { FieldKinds, type SequenceFieldEditBuilder } from "../default-schema/index.js";
|
|
57
|
-
import { ComposableEventEmitter, type Listenable, type Off } from "../../events/index.js";
|
|
58
55
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
59
56
|
|
|
60
57
|
// #region Nodes
|
|
@@ -66,7 +63,6 @@ import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
|
66
63
|
*/
|
|
67
64
|
export interface MapTreeNode extends FlexTreeNode {
|
|
68
65
|
readonly mapTree: MapTree;
|
|
69
|
-
forwardEvents(to: Listenable<FlexTreeNodeEvents>): void;
|
|
70
66
|
}
|
|
71
67
|
|
|
72
68
|
/**
|
|
@@ -82,38 +78,6 @@ interface LocationInField {
|
|
|
82
78
|
readonly index: number;
|
|
83
79
|
}
|
|
84
80
|
|
|
85
|
-
/**
|
|
86
|
-
* Allows events to be forwarded to another event emitter.
|
|
87
|
-
* @remarks TODO: After the eventing library is simplified, find a way to support this pattern elegantly in the library.
|
|
88
|
-
*/
|
|
89
|
-
class ForwardingEventEmitter extends ComposableEventEmitter<FlexTreeNodeEvents> {
|
|
90
|
-
// A map from deregistration functions produced by this class to deregistration functions of Listenables that have been forwarded to
|
|
91
|
-
private readonly forwardedOffs = new Map<Off, Off[]>();
|
|
92
|
-
|
|
93
|
-
public override on<K extends keyof FlexTreeNodeEvents>(
|
|
94
|
-
eventName: K,
|
|
95
|
-
listener: FlexTreeNodeEvents[K],
|
|
96
|
-
): Off {
|
|
97
|
-
const off = super.on(eventName, listener);
|
|
98
|
-
// Return a deregister function which...
|
|
99
|
-
return (): void => {
|
|
100
|
-
off(); // ...deregisters the event in this emitter,
|
|
101
|
-
// and also deregisters the event in any Listenable that it gets forwarded to
|
|
102
|
-
(this.forwardedOffs.get(off) ?? []).forEach((f) => f());
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public forwardEvents(to: Listenable<FlexTreeNodeEvents>): void {
|
|
107
|
-
for (const [eventName, listeners] of this.listeners) {
|
|
108
|
-
for (const [off, listener] of listeners) {
|
|
109
|
-
// For every one of our listeners, make the same subscription in the Listenable that we're forwarding to,
|
|
110
|
-
// and then create a mapping from our deregistration function to theirs, so we can call it later if need be.
|
|
111
|
-
getOrCreate(this.forwardedOffs, off, () => []).push(to.on(eventName, listener));
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
81
|
/**
|
|
118
82
|
* A readonly implementation of {@link FlexTreeNode} which wraps a {@link MapTree}.
|
|
119
83
|
* @remarks Any methods that would mutate the node will fail,
|
|
@@ -123,10 +87,6 @@ class ForwardingEventEmitter extends ComposableEventEmitter<FlexTreeNodeEvents>
|
|
|
123
87
|
*/
|
|
124
88
|
export class EagerMapTreeNode<TSchema extends FlexTreeNodeSchema> implements MapTreeNode {
|
|
125
89
|
public readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;
|
|
126
|
-
private readonly events = new ForwardingEventEmitter();
|
|
127
|
-
public forwardEvents(to: Listenable<FlexTreeNodeEvents>): void {
|
|
128
|
-
this.events.forwardEvents(to);
|
|
129
|
-
}
|
|
130
90
|
|
|
131
91
|
/**
|
|
132
92
|
* Create a new MapTreeNode.
|
|
@@ -212,27 +172,10 @@ export class EagerMapTreeNode<TSchema extends FlexTreeNodeSchema> implements Map
|
|
|
212
172
|
);
|
|
213
173
|
}
|
|
214
174
|
|
|
215
|
-
public treeStatus(): TreeStatus {
|
|
216
|
-
return TreeStatus.New;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
175
|
public get value(): Value {
|
|
220
176
|
return this.mapTree.value;
|
|
221
177
|
}
|
|
222
178
|
|
|
223
|
-
public on<K extends keyof FlexTreeNodeEvents>(
|
|
224
|
-
eventName: K,
|
|
225
|
-
listener: FlexTreeNodeEvents[K],
|
|
226
|
-
): () => void {
|
|
227
|
-
switch (eventName) {
|
|
228
|
-
case "nodeChanged":
|
|
229
|
-
case "treeChanged":
|
|
230
|
-
return this.events.on(eventName, listener);
|
|
231
|
-
default:
|
|
232
|
-
throw unsupportedUsageError(`Subscribing to ${eventName}`);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
179
|
public get context(): FlexTreeContext {
|
|
237
180
|
// This API is relevant to `LazyTreeNode`s, but not `MapTreeNode`s.
|
|
238
181
|
// TODO: Refactor the FlexTreeNode interface so that stubbing this out isn't necessary.
|
|
@@ -418,9 +361,6 @@ export const rootMapTreeField: MapTreeField<FlexAllowedTypes> = {
|
|
|
418
361
|
get context(): FlexTreeContext {
|
|
419
362
|
return fail("MapTreeField does not implement context");
|
|
420
363
|
},
|
|
421
|
-
treeStatus(): TreeStatus {
|
|
422
|
-
return TreeStatus.New;
|
|
423
|
-
},
|
|
424
364
|
mapTrees: [],
|
|
425
365
|
};
|
|
426
366
|
|
|
@@ -492,10 +432,6 @@ class MapTreeField<T extends FlexAllowedTypes> implements FlexTreeField {
|
|
|
492
432
|
public get context(): FlexTreeContext {
|
|
493
433
|
return fail("MapTreeField does not implement context");
|
|
494
434
|
}
|
|
495
|
-
|
|
496
|
-
public treeStatus(): TreeStatus {
|
|
497
|
-
return TreeStatus.New;
|
|
498
|
-
}
|
|
499
435
|
}
|
|
500
436
|
|
|
501
437
|
class MapTreeRequiredField<T extends FlexAllowedTypes>
|
|
@@ -34,7 +34,6 @@ import type {
|
|
|
34
34
|
} from "../typed-schema/index.js";
|
|
35
35
|
|
|
36
36
|
import type { FlexTreeContext } from "./context.js";
|
|
37
|
-
import type { FlexTreeNodeEvents } from "./treeEvents.js";
|
|
38
37
|
|
|
39
38
|
/**
|
|
40
39
|
* An anchor slot which records the {@link FlexTreeNode} associated with that anchor, if there is one.
|
|
@@ -98,14 +97,6 @@ export interface FlexTreeEntity<out TSchema = unknown> {
|
|
|
98
97
|
*/
|
|
99
98
|
readonly context: FlexTreeContext;
|
|
100
99
|
|
|
101
|
-
/**
|
|
102
|
-
* Gets the {@link TreeStatus} of this tree.
|
|
103
|
-
*
|
|
104
|
-
* @remarks
|
|
105
|
-
* For non-root fields, this is the status of the parent node, since fields do not have a separate lifetime.
|
|
106
|
-
*/
|
|
107
|
-
treeStatus(): TreeStatus;
|
|
108
|
-
|
|
109
100
|
/**
|
|
110
101
|
* Iterate through all nodes/fields in this field/node.
|
|
111
102
|
*
|
|
@@ -167,14 +158,6 @@ export interface FlexTreeNode extends FlexTreeEntity<FlexTreeNodeSchema> {
|
|
|
167
158
|
*/
|
|
168
159
|
readonly value?: TreeValue;
|
|
169
160
|
|
|
170
|
-
/**
|
|
171
|
-
* {@inheritDoc ISubscribable#on}
|
|
172
|
-
*/
|
|
173
|
-
on<K extends keyof FlexTreeNodeEvents>(
|
|
174
|
-
eventName: K,
|
|
175
|
-
listener: FlexTreeNodeEvents[K],
|
|
176
|
-
): () => void;
|
|
177
|
-
|
|
178
161
|
/**
|
|
179
162
|
* Gets a field of this node, if it is not empty.
|
|
180
163
|
*/
|
|
@@ -585,10 +568,8 @@ export const reservedObjectNodeFieldPropertyNames = [
|
|
|
585
568
|
"constructor",
|
|
586
569
|
"context",
|
|
587
570
|
"is",
|
|
588
|
-
"on",
|
|
589
571
|
"parentField",
|
|
590
572
|
"schema",
|
|
591
|
-
"treeStatus",
|
|
592
573
|
"tryGetField",
|
|
593
574
|
"type",
|
|
594
575
|
"value",
|
|
@@ -60,6 +60,12 @@ export type {
|
|
|
60
60
|
FlexibleNodeSubSequence,
|
|
61
61
|
} from "./flexTreeTypes.js";
|
|
62
62
|
|
|
63
|
-
export {
|
|
63
|
+
export {
|
|
64
|
+
assertFlexTreeEntityNotFreed,
|
|
65
|
+
isFreedSymbol,
|
|
66
|
+
LazyEntity,
|
|
67
|
+
} from "./lazyEntity.js";
|
|
64
68
|
|
|
65
69
|
export { getSchemaAndPolicy, indexForAt } from "./utilities.js";
|
|
70
|
+
|
|
71
|
+
export { treeStatusFromAnchorCache } from "./utilities.js";
|
|
@@ -16,7 +16,6 @@ import type { Context } from "./context.js";
|
|
|
16
16
|
import {
|
|
17
17
|
type FlexTreeEntity,
|
|
18
18
|
type FlexTreeEntityKind,
|
|
19
|
-
type TreeStatus,
|
|
20
19
|
flexTreeMarker,
|
|
21
20
|
} from "./flexTreeTypes.js";
|
|
22
21
|
|
|
@@ -65,8 +64,6 @@ export abstract class LazyEntity<TSchema = unknown, TAnchor = unknown>
|
|
|
65
64
|
public abstract boxedIterator(): IterableIterator<FlexTreeEntity>;
|
|
66
65
|
public abstract get [flexTreeMarker](): FlexTreeEntityKind;
|
|
67
66
|
|
|
68
|
-
public abstract treeStatus(): TreeStatus;
|
|
69
|
-
|
|
70
67
|
public [disposeSymbol](): void {
|
|
71
68
|
this.#lazyCursor.free();
|
|
72
69
|
this.context.withCursors.delete(this);
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
inCursorNode,
|
|
17
17
|
isCursor,
|
|
18
18
|
iterateCursorField,
|
|
19
|
-
|
|
19
|
+
rootFieldKey,
|
|
20
20
|
} from "../../core/index.js";
|
|
21
21
|
import {
|
|
22
22
|
assertValidIndex,
|
|
@@ -64,11 +64,7 @@ import {
|
|
|
64
64
|
} from "./lazyEntity.js";
|
|
65
65
|
import { type LazyTreeNode, makeTree } from "./lazyNode.js";
|
|
66
66
|
import { unboxedUnion } from "./unboxed.js";
|
|
67
|
-
import {
|
|
68
|
-
indexForAt,
|
|
69
|
-
treeStatusFromAnchorCache,
|
|
70
|
-
treeStatusFromDetachedField,
|
|
71
|
-
} from "./utilities.js";
|
|
67
|
+
import { indexForAt, treeStatusFromAnchorCache } from "./utilities.js";
|
|
72
68
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
73
69
|
|
|
74
70
|
/**
|
|
@@ -259,23 +255,6 @@ export abstract class LazyField<
|
|
|
259
255
|
);
|
|
260
256
|
}
|
|
261
257
|
|
|
262
|
-
public treeStatus(): TreeStatus {
|
|
263
|
-
if (this[isFreedSymbol]()) {
|
|
264
|
-
return TreeStatus.Deleted;
|
|
265
|
-
}
|
|
266
|
-
const fieldAnchor = this[anchorSymbol];
|
|
267
|
-
const parentAnchor = fieldAnchor.parent;
|
|
268
|
-
// If the parentAnchor is undefined it is a detached field.
|
|
269
|
-
if (parentAnchor === undefined) {
|
|
270
|
-
return treeStatusFromDetachedField(keyAsDetachedField(fieldAnchor.fieldKey));
|
|
271
|
-
}
|
|
272
|
-
const parentAnchorNode = this.context.checkout.forest.anchors.locate(parentAnchor);
|
|
273
|
-
|
|
274
|
-
// As the "parentAnchor === undefined" case is handled above, parentAnchorNode should exist.
|
|
275
|
-
assert(parentAnchorNode !== undefined, 0x77e /* parentAnchorNode must exist. */);
|
|
276
|
-
return treeStatusFromAnchorCache(parentAnchorNode);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
258
|
public getFieldPath(): FieldUpPath {
|
|
280
259
|
return this[cursorSymbol].getFieldPath();
|
|
281
260
|
}
|
|
@@ -285,10 +264,19 @@ export abstract class LazyField<
|
|
|
285
264
|
* This path is not valid to hold onto across edits: this must be recalled for each edit.
|
|
286
265
|
*/
|
|
287
266
|
public getFieldPathForEditing(): FieldUpPath {
|
|
288
|
-
if (this
|
|
289
|
-
|
|
267
|
+
if (!this[isFreedSymbol]()) {
|
|
268
|
+
if (
|
|
269
|
+
// Only allow editing if we are the root document field...
|
|
270
|
+
(this.parent === undefined && this[anchorSymbol].fieldKey === rootFieldKey) ||
|
|
271
|
+
// ...or are under a node in the document
|
|
272
|
+
(this.parent !== undefined &&
|
|
273
|
+
treeStatusFromAnchorCache(this.parent.anchorNode) === TreeStatus.InDocument)
|
|
274
|
+
) {
|
|
275
|
+
return this.getFieldPath();
|
|
276
|
+
}
|
|
290
277
|
}
|
|
291
|
-
|
|
278
|
+
|
|
279
|
+
throw new UsageError("Editing only allowed on fields with TreeStatus.InDocument status");
|
|
292
280
|
}
|
|
293
281
|
}
|
|
294
282
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { assert
|
|
6
|
+
import { assert } from "@fluidframework/core-utils/internal";
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
type Anchor,
|
|
@@ -55,7 +55,6 @@ import {
|
|
|
55
55
|
type FlexibleFieldContent,
|
|
56
56
|
type FlexibleNodeContent,
|
|
57
57
|
type PropertyNameFromFieldKey,
|
|
58
|
-
TreeStatus,
|
|
59
58
|
flexTreeMarker,
|
|
60
59
|
flexTreeSlot,
|
|
61
60
|
reservedObjectNodeFieldPropertyNamePrefixes,
|
|
@@ -66,13 +65,10 @@ import {
|
|
|
66
65
|
anchorSymbol,
|
|
67
66
|
cursorSymbol,
|
|
68
67
|
forgetAnchorSymbol,
|
|
69
|
-
isFreedSymbol,
|
|
70
68
|
tryMoveCursorToAnchorSymbol,
|
|
71
69
|
} from "./lazyEntity.js";
|
|
72
70
|
import { makeField } from "./lazyField.js";
|
|
73
|
-
import type { FlexTreeNodeEvents } from "./treeEvents.js";
|
|
74
71
|
import { unboxedField } from "./unboxed.js";
|
|
75
|
-
import { treeStatusFromAnchorCache } from "./utilities.js";
|
|
76
72
|
|
|
77
73
|
/**
|
|
78
74
|
* @param cursor - This does not take ownership of this cursor: Node will fork it as needed.
|
|
@@ -256,43 +252,6 @@ export abstract class LazyTreeNode<TSchema extends FlexTreeNodeSchema = FlexTree
|
|
|
256
252
|
|
|
257
253
|
return { parent: proxifiedField, index };
|
|
258
254
|
}
|
|
259
|
-
|
|
260
|
-
public override treeStatus(): TreeStatus {
|
|
261
|
-
if (this[isFreedSymbol]()) {
|
|
262
|
-
return TreeStatus.Deleted;
|
|
263
|
-
}
|
|
264
|
-
return treeStatusFromAnchorCache(this.anchorNode);
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
public on<K extends keyof FlexTreeNodeEvents>(
|
|
268
|
-
eventName: K,
|
|
269
|
-
listener: FlexTreeNodeEvents[K],
|
|
270
|
-
): () => void {
|
|
271
|
-
switch (eventName) {
|
|
272
|
-
case "changing": {
|
|
273
|
-
const unsubscribeFromChildrenChange = this.anchorNode.on(
|
|
274
|
-
"childrenChanging",
|
|
275
|
-
(anchorNode: AnchorNode) => listener(anchorNode),
|
|
276
|
-
);
|
|
277
|
-
return unsubscribeFromChildrenChange;
|
|
278
|
-
}
|
|
279
|
-
case "subtreeChanging": {
|
|
280
|
-
const unsubscribeFromSubtreeChange = this.anchorNode.on(
|
|
281
|
-
"subtreeChanging",
|
|
282
|
-
(anchorNode: AnchorNode) => listener(anchorNode),
|
|
283
|
-
);
|
|
284
|
-
return unsubscribeFromSubtreeChange;
|
|
285
|
-
}
|
|
286
|
-
case "nodeChanged": {
|
|
287
|
-
return this.anchorNode.on("childrenChangedAfterBatch", listener);
|
|
288
|
-
}
|
|
289
|
-
case "treeChanged": {
|
|
290
|
-
return this.anchorNode.on("subtreeChangedAfterBatch", listener);
|
|
291
|
-
}
|
|
292
|
-
default:
|
|
293
|
-
unreachableCase(eventName);
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
255
|
}
|
|
297
256
|
|
|
298
257
|
export class LazyMap<TSchema extends FlexMapNodeSchema>
|
|
@@ -158,6 +158,7 @@ export class ForestSummarizer implements Summarizable {
|
|
|
158
158
|
assert(this.forest.isEmpty, 0x797 /* forest must be empty */);
|
|
159
159
|
applyDelta(
|
|
160
160
|
{ build, fields: new Map(fieldChanges) },
|
|
161
|
+
undefined,
|
|
161
162
|
this.forest,
|
|
162
163
|
makeDetachedFieldIndex("init", this.revisionTagCodec, this.idCompressor),
|
|
163
164
|
);
|
|
@@ -280,6 +280,9 @@ export {
|
|
|
280
280
|
assertFlexTreeEntityNotFreed,
|
|
281
281
|
flexTreeSlot,
|
|
282
282
|
getSchemaAndPolicy,
|
|
283
|
+
isFreedSymbol,
|
|
284
|
+
LazyEntity,
|
|
285
|
+
treeStatusFromAnchorCache,
|
|
283
286
|
} from "./flex-tree/index.js";
|
|
284
287
|
|
|
285
288
|
export { treeSchemaFromStoredSchema } from "./storedToViewSchema.js";
|
|
@@ -147,7 +147,7 @@ export function getAllowedContentIncompatibilities(
|
|
|
147
147
|
const storedNodeSchema = stored.nodeSchema.get(key);
|
|
148
148
|
assert(
|
|
149
149
|
storedNodeSchema !== undefined,
|
|
150
|
-
|
|
150
|
+
0x9be /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
|
|
151
151
|
);
|
|
152
152
|
if (storedNodeSchema instanceof MapNodeStoredSchema) {
|
|
153
153
|
incompatibilities.push({
|
|
@@ -188,7 +188,7 @@ export function getAllowedContentIncompatibilities(
|
|
|
188
188
|
const storedNodeSchema = stored.nodeSchema.get(key);
|
|
189
189
|
assert(
|
|
190
190
|
storedNodeSchema !== undefined,
|
|
191
|
-
|
|
191
|
+
0x9bf /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
|
|
192
192
|
);
|
|
193
193
|
if (storedNodeSchema instanceof ObjectNodeStoredSchema) {
|
|
194
194
|
incompatibilities.push({
|
|
@@ -228,7 +228,7 @@ export function getAllowedContentIncompatibilities(
|
|
|
228
228
|
const storedNodeSchema = stored.nodeSchema.get(key);
|
|
229
229
|
assert(
|
|
230
230
|
storedNodeSchema !== undefined,
|
|
231
|
-
|
|
231
|
+
0x9c0 /* The storedNodeSchema in stored.nodeSchema should not be undefined */,
|
|
232
232
|
);
|
|
233
233
|
if (storedNodeSchema instanceof MapNodeStoredSchema) {
|
|
234
234
|
incompatibilities.push({
|
|
@@ -211,16 +211,12 @@ export class ModularChangeFamily
|
|
|
211
211
|
const { revInfos, maxId } = getRevInfoFromTaggedChanges(changes);
|
|
212
212
|
const idState: IdAllocationState = { maxId };
|
|
213
213
|
|
|
214
|
-
|
|
215
|
-
(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
nodeToParent: new Map(),
|
|
221
|
-
nodeAliases: new Map(),
|
|
222
|
-
crossFieldKeys: newCrossFieldKeyTable(),
|
|
223
|
-
}),
|
|
214
|
+
if (changes.length === 0) {
|
|
215
|
+
return makeModularChangeset();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return changes.reduce((change1, change2) =>
|
|
219
|
+
makeAnonChange(this.composePair(change1, change2, revInfos, idState)),
|
|
224
220
|
).change;
|
|
225
221
|
}
|
|
226
222
|
|
|
@@ -1024,7 +1020,10 @@ export class ModularChangeFamily
|
|
|
1024
1020
|
baseNodeId,
|
|
1025
1021
|
).get(fieldKey);
|
|
1026
1022
|
|
|
1027
|
-
assert(
|
|
1023
|
+
assert(
|
|
1024
|
+
baseFieldChange !== undefined,
|
|
1025
|
+
0x9c2 /* Cross field key registered for empty field */,
|
|
1026
|
+
);
|
|
1028
1027
|
if (crossFieldTable.baseFieldToContext.has(baseFieldChange)) {
|
|
1029
1028
|
// This field has already been processed because there were changes to rebase.
|
|
1030
1029
|
continue;
|
|
@@ -1037,7 +1036,7 @@ export class ModularChangeFamily
|
|
|
1037
1036
|
baseChild: NodeId | undefined,
|
|
1038
1037
|
stateChange: NodeAttachState | undefined,
|
|
1039
1038
|
): NodeId | undefined => {
|
|
1040
|
-
assert(child === undefined,
|
|
1039
|
+
assert(child === undefined, 0x9c3 /* There should be no new changes in this field */);
|
|
1041
1040
|
return undefined;
|
|
1042
1041
|
};
|
|
1043
1042
|
|
|
@@ -1109,7 +1108,7 @@ export class ModularChangeFamily
|
|
|
1109
1108
|
return;
|
|
1110
1109
|
}
|
|
1111
1110
|
|
|
1112
|
-
assert(!rebasedNode.fieldChanges.has(fieldKey),
|
|
1111
|
+
assert(!rebasedNode.fieldChanges.has(fieldKey), 0x9c4 /* Expected an empty field */);
|
|
1113
1112
|
rebasedNode.fieldChanges.set(fieldKey, rebasedField);
|
|
1114
1113
|
return;
|
|
1115
1114
|
}
|
|
@@ -2233,7 +2232,7 @@ class InvertManager extends CrossFieldManagerI<FieldChange> {
|
|
|
2233
2232
|
id: ChangesetLocalId,
|
|
2234
2233
|
count: number,
|
|
2235
2234
|
): void {
|
|
2236
|
-
assert(false,
|
|
2235
|
+
assert(false, 0x9c5 /* Keys should not be moved manually during invert */);
|
|
2237
2236
|
}
|
|
2238
2237
|
|
|
2239
2238
|
private get table(): InvertTable {
|
|
@@ -2269,7 +2268,7 @@ class RebaseManager extends CrossFieldManagerI<FieldChange> {
|
|
|
2269
2268
|
|
|
2270
2269
|
assert(
|
|
2271
2270
|
newFieldIds.length === 0,
|
|
2272
|
-
|
|
2271
|
+
0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */,
|
|
2273
2272
|
);
|
|
2274
2273
|
|
|
2275
2274
|
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, [
|
|
@@ -2279,7 +2278,10 @@ class RebaseManager extends CrossFieldManagerI<FieldChange> {
|
|
|
2279
2278
|
count,
|
|
2280
2279
|
]);
|
|
2281
2280
|
|
|
2282
|
-
assert(
|
|
2281
|
+
assert(
|
|
2282
|
+
baseFieldIds.length > 0,
|
|
2283
|
+
0x9c7 /* Cross field key not registered in base or new change */,
|
|
2284
|
+
);
|
|
2283
2285
|
|
|
2284
2286
|
for (const baseFieldId of baseFieldIds) {
|
|
2285
2287
|
this.table.affectedBaseFields.set(
|
|
@@ -2356,7 +2358,7 @@ class ComposeManager extends CrossFieldManagerI<FieldChange> {
|
|
|
2356
2358
|
|
|
2357
2359
|
assert(
|
|
2358
2360
|
baseFieldIds.length > 0,
|
|
2359
|
-
|
|
2361
|
+
0x9c8 /* Cross field key not registered in base or new change */,
|
|
2360
2362
|
);
|
|
2361
2363
|
|
|
2362
2364
|
for (const baseFieldId of baseFieldIds) {
|
|
@@ -2798,7 +2800,7 @@ function fieldMapFromNodeId(
|
|
|
2798
2800
|
}
|
|
2799
2801
|
|
|
2800
2802
|
const node = nodeChangeFromId(nodes, nodeId);
|
|
2801
|
-
assert(node.fieldChanges !== undefined,
|
|
2803
|
+
assert(node.fieldChanges !== undefined, 0x9c9 /* Expected node to have field changes */);
|
|
2802
2804
|
return node.fieldChanges;
|
|
2803
2805
|
}
|
|
2804
2806
|
|
|
@@ -2816,7 +2818,7 @@ function rebasedNodeIdFromBaseNodeId(table: RebaseTable, baseId: NodeId): NodeId
|
|
|
2816
2818
|
|
|
2817
2819
|
function nodeChangeFromId(nodes: ChangeAtomIdMap<NodeChangeset>, id: NodeId): NodeChangeset {
|
|
2818
2820
|
const node = getFromChangeAtomIdMap(nodes, id);
|
|
2819
|
-
assert(node !== undefined,
|
|
2821
|
+
assert(node !== undefined, 0x9ca /* Unknown node ID */);
|
|
2820
2822
|
return node;
|
|
2821
2823
|
}
|
|
2822
2824
|
|
|
@@ -2850,7 +2852,7 @@ function replaceFieldIdRevision(
|
|
|
2850
2852
|
|
|
2851
2853
|
export function getParentFieldId(changeset: ModularChangeset, nodeId: NodeId): FieldId {
|
|
2852
2854
|
const parentId = getFromChangeAtomIdMap(changeset.nodeToParent, nodeId);
|
|
2853
|
-
assert(parentId !== undefined,
|
|
2855
|
+
assert(parentId !== undefined, 0x9cb /* Parent field should be defined */);
|
|
2854
2856
|
return normalizeFieldId(parentId, changeset.nodeAliases);
|
|
2855
2857
|
}
|
|
2856
2858
|
|
|
@@ -94,6 +94,7 @@ export class ObjectForest implements IEditableForest {
|
|
|
94
94
|
|
|
95
95
|
public constructor(
|
|
96
96
|
public readonly anchors: AnchorSet = new AnchorSet(),
|
|
97
|
+
public readonly additionalAsserts: boolean = false,
|
|
97
98
|
roots?: MapTree,
|
|
98
99
|
) {
|
|
99
100
|
this.#roots =
|
|
@@ -117,7 +118,7 @@ export class ObjectForest implements IEditableForest {
|
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
public clone(_: TreeStoredSchemaSubscription, anchors: AnchorSet): ObjectForest {
|
|
120
|
-
return new ObjectForest(anchors, this.roots);
|
|
121
|
+
return new ObjectForest(anchors, this.additionalAsserts, this.roots);
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
public forgetAnchor(anchor: Anchor): void {
|
|
@@ -554,6 +555,9 @@ class Cursor extends SynchronousCursor implements ITreeSubscriptionCursor {
|
|
|
554
555
|
/**
|
|
555
556
|
* @returns an implementation of {@link IEditableForest} with no data or schema.
|
|
556
557
|
*/
|
|
557
|
-
export function buildForest(
|
|
558
|
-
|
|
558
|
+
export function buildForest(
|
|
559
|
+
anchors?: AnchorSet,
|
|
560
|
+
additionalAsserts: boolean = false,
|
|
561
|
+
): ObjectForest {
|
|
562
|
+
return new ObjectForest(anchors, additionalAsserts);
|
|
559
563
|
}
|
package/src/packageVersion.ts
CHANGED
|
@@ -193,7 +193,9 @@ export class SharedTree
|
|
|
193
193
|
const forest =
|
|
194
194
|
options.forest === ForestType.Optimized
|
|
195
195
|
? buildChunkedForest(makeTreeChunker(schema, defaultSchemaPolicy))
|
|
196
|
-
:
|
|
196
|
+
: options.forest === ForestType.Reference
|
|
197
|
+
? buildForest()
|
|
198
|
+
: buildForest(undefined, true);
|
|
197
199
|
const revisionTagCodec = new RevisionTagCodec(runtime.idCompressor);
|
|
198
200
|
const removedRoots = makeDetachedFieldIndex(
|
|
199
201
|
"repair",
|
|
@@ -335,6 +337,7 @@ export class SharedTree
|
|
|
335
337
|
|
|
336
338
|
protected override async loadCore(services: IChannelStorageService): Promise<void> {
|
|
337
339
|
await super.loadCore(services);
|
|
340
|
+
this.checkout.setTipRevisionForLoadedData(this.trunkHeadRevision);
|
|
338
341
|
this._events.emit("afterBatch");
|
|
339
342
|
}
|
|
340
343
|
}
|
|
@@ -423,6 +426,10 @@ export enum ForestType {
|
|
|
423
426
|
* The "ChunkedForest" forest type.
|
|
424
427
|
*/
|
|
425
428
|
Optimized = 1,
|
|
429
|
+
/**
|
|
430
|
+
* The "ObjectForest" forest type with expensive asserts for debugging.
|
|
431
|
+
*/
|
|
432
|
+
Expensive = 2,
|
|
426
433
|
}
|
|
427
434
|
|
|
428
435
|
export const defaultSharedTreeOptions: Required<SharedTreeOptions> = {
|
|
@@ -87,7 +87,7 @@ export class SharedTreeMutableChangeEnricher
|
|
|
87
87
|
case "data": {
|
|
88
88
|
const delta = intoDelta(tagChange(dataOrSchemaChange.innerChange, revision));
|
|
89
89
|
const visitor = this.forest.acquireVisitor();
|
|
90
|
-
visitDelta(delta, visitor, this.removedRoots);
|
|
90
|
+
visitDelta(delta, visitor, this.removedRoots, revision);
|
|
91
91
|
visitor.free();
|
|
92
92
|
break;
|
|
93
93
|
}
|
|
@@ -455,7 +455,7 @@ function runTransactionInCheckout<TResult>(
|
|
|
455
455
|
case "nodeInDocument": {
|
|
456
456
|
const node = getFlexNode(constraint.node);
|
|
457
457
|
assert(
|
|
458
|
-
|
|
458
|
+
treeApi.status(constraint.node) === TreeStatus.InDocument,
|
|
459
459
|
0x90f /* Attempted to apply "nodeExists" constraint when building a transaction, but the node is not in the document. */,
|
|
460
460
|
);
|
|
461
461
|
checkout.editor.addNodeExistsConstraint(node.anchorNode);
|