@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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.normalizeFieldId = exports.getParentFieldId = exports.ModularEditBuilder = exports.getChangeHandler = exports.getFieldKind = exports.rebaseRevisionMetadataFromInfo = exports.intoDelta = exports.updateRefreshers = exports.relevantRemovedRoots = exports.ModularChangeFamily = void 0;
|
|
8
8
|
const internal_1 = require("@fluidframework/core-utils/internal");
|
|
9
9
|
const sorted_btree_es6_1 = require("@tylerbu/sorted-btree-es6");
|
|
10
10
|
const index_js_1 = require("../../core/index.js");
|
|
@@ -15,6 +15,7 @@ const crossFieldQueries_js_1 = require("./crossFieldQueries.js");
|
|
|
15
15
|
const fieldChangeHandler_js_1 = require("./fieldChangeHandler.js");
|
|
16
16
|
const fieldKindWithEditor_js_1 = require("./fieldKindWithEditor.js");
|
|
17
17
|
const genericFieldKind_js_1 = require("./genericFieldKind.js");
|
|
18
|
+
const modularChangeTypes_js_1 = require("./modularChangeTypes.js");
|
|
18
19
|
/**
|
|
19
20
|
* Implementation of ChangeFamily which delegates work in a given field to the appropriate FieldKind
|
|
20
21
|
* as determined by the schema.
|
|
@@ -101,10 +102,10 @@ class ModularChangeFamily {
|
|
|
101
102
|
if (hasConflicts(change1) && hasConflicts(change2)) {
|
|
102
103
|
return {
|
|
103
104
|
fieldChanges: new Map(),
|
|
104
|
-
nodeChanges: newTupleBTree(),
|
|
105
|
-
nodeToParent: newTupleBTree(),
|
|
106
|
-
nodeAliases: newTupleBTree(),
|
|
107
|
-
crossFieldKeys:
|
|
105
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
106
|
+
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
107
|
+
nodeAliases: (0, index_js_2.newTupleBTree)(),
|
|
108
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
108
109
|
};
|
|
109
110
|
}
|
|
110
111
|
else if (hasConflicts(change1)) {
|
|
@@ -123,20 +124,20 @@ class ModularChangeFamily {
|
|
|
123
124
|
// A collision for a node ID means that that node is referenced in both changesets
|
|
124
125
|
// (since we assume that if two changesets use the same node ID they are referring to the same node),
|
|
125
126
|
// therefore all collisions will be addressed when processing the intersection of the changesets.
|
|
126
|
-
const composedNodeChanges = (0, index_js_2.brand)(
|
|
127
|
-
const composedNodeToParent = (0, index_js_2.brand)(
|
|
128
|
-
const composedNodeAliases = (0, index_js_2.brand)(
|
|
127
|
+
const composedNodeChanges = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeChanges, change2.nodeChanges));
|
|
128
|
+
const composedNodeToParent = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeToParent, change2.nodeToParent));
|
|
129
|
+
const composedNodeAliases = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.nodeAliases, change2.nodeAliases));
|
|
129
130
|
const crossFieldTable = newComposeTable(change1, change2, composedNodeToParent);
|
|
130
131
|
const composedFields = this.composeFieldMaps(change1.fieldChanges, change2.fieldChanges, undefined, genId, crossFieldTable, revisionMetadata);
|
|
131
132
|
this.composeInvalidatedElements(crossFieldTable, composedFields, composedNodeChanges, composedNodeToParent, composedNodeAliases, genId, revisionMetadata);
|
|
132
133
|
// Currently no field kinds require making changes to cross-field keys during composition, so we can just merge the two tables.
|
|
133
|
-
const composedCrossFieldKeys =
|
|
134
|
+
const composedCrossFieldKeys = index_js_2.RangeMap.union(change1.crossFieldKeys, change2.crossFieldKeys);
|
|
134
135
|
return {
|
|
135
136
|
fieldChanges: composedFields,
|
|
136
137
|
nodeChanges: composedNodeChanges,
|
|
137
138
|
nodeToParent: composedNodeToParent,
|
|
138
139
|
nodeAliases: composedNodeAliases,
|
|
139
|
-
crossFieldKeys:
|
|
140
|
+
crossFieldKeys: composedCrossFieldKeys,
|
|
140
141
|
};
|
|
141
142
|
}
|
|
142
143
|
composeInvalidatedField(fieldChange, crossFieldTable, genId, revisionMetadata) {
|
|
@@ -357,7 +358,7 @@ class ModularChangeFamily {
|
|
|
357
358
|
const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
|
|
358
359
|
const revisionMetadata = (0, index_js_1.revisionMetadataSourceFromInfo)(oldRevInfos);
|
|
359
360
|
const invertedFields = this.invertFieldMap(change.change.fieldChanges, undefined, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert);
|
|
360
|
-
const invertedNodes = newTupleBTree();
|
|
361
|
+
const invertedNodes = (0, index_js_2.newTupleBTree)();
|
|
361
362
|
change.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {
|
|
362
363
|
invertedNodes.set([revision, localId], this.invertNodeChange(nodeChangeset, { revision, localId }, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert));
|
|
363
364
|
});
|
|
@@ -436,12 +437,12 @@ class ModularChangeFamily {
|
|
|
436
437
|
newChange: change,
|
|
437
438
|
baseChange: over.change,
|
|
438
439
|
baseFieldToContext: new Map(),
|
|
439
|
-
baseToRebasedNodeId: newTupleBTree(),
|
|
440
|
+
baseToRebasedNodeId: (0, index_js_2.newTupleBTree)(),
|
|
440
441
|
rebasedFields: new Set(),
|
|
441
442
|
rebasedNodeToParent: (0, index_js_2.brand)(change.nodeToParent.clone()),
|
|
442
|
-
rebasedCrossFieldKeys:
|
|
443
|
+
rebasedCrossFieldKeys: change.crossFieldKeys.clone(),
|
|
443
444
|
nodeIdPairs: [],
|
|
444
|
-
affectedBaseFields: newTupleBTree(),
|
|
445
|
+
affectedBaseFields: (0, index_js_2.newTupleBTree)(),
|
|
445
446
|
fieldsWithUnattachedChild: new Set(),
|
|
446
447
|
};
|
|
447
448
|
const getBaseRevisions = () => revisionInfoFromTaggedChange(over).map((info) => info.revision);
|
|
@@ -755,11 +756,11 @@ class ModularChangeFamily {
|
|
|
755
756
|
? [undefined]
|
|
756
757
|
: change.revisions.map((revInfo) => revInfo.revision));
|
|
757
758
|
const updatedFields = this.replaceFieldMapRevisions(change.fieldChanges, oldRevisions, newRevision);
|
|
758
|
-
const updatedNodes = newTupleBTree();
|
|
759
|
+
const updatedNodes = (0, index_js_2.newTupleBTree)();
|
|
759
760
|
for (const [[revision, id], nodeChangeset] of change.nodeChanges.entries()) {
|
|
760
761
|
updatedNodes.set([replaceRevision(revision, oldRevisions, newRevision), id], this.replaceNodeChangesetRevisions(nodeChangeset, oldRevisions, newRevision));
|
|
761
762
|
}
|
|
762
|
-
const updatedNodeToParent = newTupleBTree();
|
|
763
|
+
const updatedNodeToParent = (0, index_js_2.newTupleBTree)();
|
|
763
764
|
for (const [[revision, id], fieldId] of change.nodeToParent.entries()) {
|
|
764
765
|
updatedNodeToParent.set([replaceRevision(revision, oldRevisions, newRevision), id], replaceFieldIdRevision(normalizeFieldId(fieldId, change.nodeAliases), oldRevisions, newRevision));
|
|
765
766
|
}
|
|
@@ -769,7 +770,7 @@ class ModularChangeFamily {
|
|
|
769
770
|
nodeChanges: updatedNodes,
|
|
770
771
|
nodeToParent: updatedNodeToParent,
|
|
771
772
|
// We've updated all references to old node IDs, so we no longer need an alias table.
|
|
772
|
-
nodeAliases: newTupleBTree(),
|
|
773
|
+
nodeAliases: (0, index_js_2.newTupleBTree)(),
|
|
773
774
|
crossFieldKeys: replaceCrossFieldKeyTableRevisions(change.crossFieldKeys, oldRevisions, newRevision, change.nodeAliases),
|
|
774
775
|
};
|
|
775
776
|
if (change.builds !== undefined) {
|
|
@@ -809,7 +810,7 @@ class ModularChangeFamily {
|
|
|
809
810
|
return updatedFields;
|
|
810
811
|
}
|
|
811
812
|
makeCrossFieldKeyTable(fields, nodes) {
|
|
812
|
-
const keys = newCrossFieldKeyTable();
|
|
813
|
+
const keys = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
|
|
813
814
|
this.populateCrossFieldKeyTableForFieldMap(keys, fields, undefined);
|
|
814
815
|
nodes.forEachPair(([revision, localId], node) => {
|
|
815
816
|
if (node.fieldChanges !== undefined) {
|
|
@@ -824,8 +825,8 @@ class ModularChangeFamily {
|
|
|
824
825
|
populateCrossFieldKeyTableForFieldMap(table, fields, parent) {
|
|
825
826
|
for (const [fieldKey, fieldChange] of fields) {
|
|
826
827
|
const keys = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).getCrossFieldKeys(fieldChange.change);
|
|
827
|
-
for (const key of keys) {
|
|
828
|
-
table.set(key, { nodeId: parent, field: fieldKey });
|
|
828
|
+
for (const { key, count } of keys) {
|
|
829
|
+
table.set(key, count, { nodeId: parent, field: fieldKey });
|
|
829
830
|
}
|
|
830
831
|
}
|
|
831
832
|
}
|
|
@@ -864,7 +865,7 @@ class ModularChangeFamily {
|
|
|
864
865
|
numChildren += 1;
|
|
865
866
|
}
|
|
866
867
|
for (const keyRange of handler.getCrossFieldKeys(fieldChange.change)) {
|
|
867
|
-
const fields = getFieldsForCrossFieldKey(change, keyRange);
|
|
868
|
+
const fields = getFieldsForCrossFieldKey(change, keyRange.key, keyRange.count);
|
|
868
869
|
(0, internal_1.assert)(fields.length === 1 &&
|
|
869
870
|
fields[0] !== undefined &&
|
|
870
871
|
areEqualFieldIds(fields[0], fieldId), 0xa4f /* Inconsistent cross field keys */);
|
|
@@ -876,14 +877,15 @@ class ModularChangeFamily {
|
|
|
876
877
|
exports.ModularChangeFamily = ModularChangeFamily;
|
|
877
878
|
ModularChangeFamily.emptyChange = makeModularChangeset();
|
|
878
879
|
function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, nodeAliases) {
|
|
879
|
-
const updated =
|
|
880
|
-
|
|
881
|
-
const
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
880
|
+
const updated = (0, modularChangeTypes_js_1.newCrossFieldKeyTable)();
|
|
881
|
+
for (const entry of table.entries()) {
|
|
882
|
+
const key = entry.start;
|
|
883
|
+
const updatedKey = {
|
|
884
|
+
target: key.target,
|
|
885
|
+
revision: replaceRevision(key.revision, oldRevisions, newRevision),
|
|
886
|
+
localId: key.localId,
|
|
887
|
+
};
|
|
888
|
+
const field = entry.value;
|
|
887
889
|
const normalizedFieldId = normalizeFieldId(field, nodeAliases);
|
|
888
890
|
const updatedNodeId = normalizedFieldId.nodeId !== undefined
|
|
889
891
|
? (0, index_js_1.replaceAtomRevisions)(normalizedFieldId.nodeId, oldRevisions, newRevision)
|
|
@@ -892,15 +894,15 @@ function replaceCrossFieldKeyTableRevisions(table, oldRevisions, newRevision, no
|
|
|
892
894
|
...normalizedFieldId,
|
|
893
895
|
nodeId: updatedNodeId,
|
|
894
896
|
};
|
|
895
|
-
updated.set(updatedKey, updatedValue);
|
|
896
|
-
}
|
|
897
|
+
updated.set(updatedKey, entry.length, updatedValue);
|
|
898
|
+
}
|
|
897
899
|
return updated;
|
|
898
900
|
}
|
|
899
901
|
function replaceRevision(revision, oldRevisions, newRevision) {
|
|
900
902
|
return oldRevisions.has(revision) ? newRevision : revision;
|
|
901
903
|
}
|
|
902
904
|
function replaceIdMapRevisions(map, oldRevisions, newRevision) {
|
|
903
|
-
const updated = newTupleBTree();
|
|
905
|
+
const updated = (0, index_js_2.newTupleBTree)();
|
|
904
906
|
for (const [[revision, id], value] of map.entries()) {
|
|
905
907
|
updated.set([replaceRevision(revision, oldRevisions, newRevision), id], value);
|
|
906
908
|
}
|
|
@@ -917,9 +919,9 @@ function composeBuildsDestroysAndRefreshers(change1, change2) {
|
|
|
917
919
|
// Note that it would in principle be possible to adopt the later build and exclude from the
|
|
918
920
|
// composition all the changes already reflected on the tree, but that is not something we
|
|
919
921
|
// care to support at this time.
|
|
920
|
-
const allBuilds = (0, index_js_2.brand)(
|
|
921
|
-
const allDestroys = (0, index_js_2.brand)(
|
|
922
|
-
const allRefreshers = (0, index_js_2.brand)(
|
|
922
|
+
const allBuilds = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.builds ?? (0, index_js_2.newTupleBTree)(), change2.builds ?? (0, index_js_2.newTupleBTree)(), true));
|
|
923
|
+
const allDestroys = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.destroys ?? (0, index_js_2.newTupleBTree)(), change2.destroys ?? (0, index_js_2.newTupleBTree)()));
|
|
924
|
+
const allRefreshers = (0, index_js_2.brand)((0, index_js_2.mergeTupleBTrees)(change1.refreshers ?? (0, index_js_2.newTupleBTree)(), change2.refreshers ?? (0, index_js_2.newTupleBTree)(), true));
|
|
923
925
|
if (change1.destroys !== undefined && change2.builds !== undefined) {
|
|
924
926
|
for (const [key, chunk] of change2.builds.entries()) {
|
|
925
927
|
const destroyCount = change1.destroys.get(key);
|
|
@@ -991,7 +993,7 @@ function* relevantRemovedRootsFromFields(change, nodeChanges, fieldKinds) {
|
|
|
991
993
|
* corresponding build or refresher.
|
|
992
994
|
*/
|
|
993
995
|
function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshers = true) {
|
|
994
|
-
const refreshers = newTupleBTree();
|
|
996
|
+
const refreshers = (0, index_js_2.newTupleBTree)();
|
|
995
997
|
const chunkLengths = new Map();
|
|
996
998
|
if (change.builds !== undefined) {
|
|
997
999
|
for (const [[revision, id], chunk] of change.builds.entries()) {
|
|
@@ -1040,18 +1042,28 @@ function updateRefreshers(change, getDetachedNode, removedRoots, requireRefreshe
|
|
|
1040
1042
|
}
|
|
1041
1043
|
exports.updateRefreshers = updateRefreshers;
|
|
1042
1044
|
/**
|
|
1045
|
+
* Converts a change into the delta format.
|
|
1046
|
+
*
|
|
1043
1047
|
* @param change - The change to convert into a delta.
|
|
1044
1048
|
* @param fieldKinds - The field kinds to delegate to.
|
|
1045
1049
|
*/
|
|
1046
1050
|
function intoDelta(taggedChange, fieldKinds) {
|
|
1047
1051
|
const change = taggedChange.change;
|
|
1048
1052
|
const rootDelta = {};
|
|
1053
|
+
const global = [];
|
|
1054
|
+
const rename = [];
|
|
1049
1055
|
if (!hasConflicts(change)) {
|
|
1050
1056
|
// If there are no constraint violations, then tree changes apply.
|
|
1051
|
-
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds);
|
|
1057
|
+
const fieldDeltas = intoDeltaImpl(change.fieldChanges, change.nodeChanges, fieldKinds, global, rename);
|
|
1052
1058
|
if (fieldDeltas.size > 0) {
|
|
1053
1059
|
rootDelta.fields = fieldDeltas;
|
|
1054
1060
|
}
|
|
1061
|
+
if (global.length > 0) {
|
|
1062
|
+
rootDelta.global = global;
|
|
1063
|
+
}
|
|
1064
|
+
if (rename.length > 0) {
|
|
1065
|
+
rootDelta.rename = rename;
|
|
1066
|
+
}
|
|
1055
1067
|
}
|
|
1056
1068
|
// Constraint violations should not prevent nodes from being built
|
|
1057
1069
|
if (change.builds && change.builds.size > 0) {
|
|
@@ -1089,22 +1101,24 @@ function copyDetachedNodes(detachedNodes) {
|
|
|
1089
1101
|
/**
|
|
1090
1102
|
* @param change - The change to convert into a delta.
|
|
1091
1103
|
*/
|
|
1092
|
-
function intoDeltaImpl(change, nodeChanges, fieldKinds) {
|
|
1104
|
+
function intoDeltaImpl(change, nodeChanges, fieldKinds, global, rename) {
|
|
1093
1105
|
const delta = new Map();
|
|
1094
1106
|
for (const [field, fieldChange] of change) {
|
|
1095
|
-
const
|
|
1107
|
+
const { local: fieldChanges, global: fieldGlobal, rename: fieldRename, } = getChangeHandler(fieldKinds, fieldChange.fieldKind).intoDelta(fieldChange.change, (childChange) => {
|
|
1096
1108
|
const nodeChange = nodeChangeFromId(nodeChanges, childChange);
|
|
1097
|
-
return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds);
|
|
1109
|
+
return deltaFromNodeChange(nodeChange, nodeChanges, fieldKinds, global, rename);
|
|
1098
1110
|
});
|
|
1099
|
-
if (
|
|
1100
|
-
delta.set(field,
|
|
1111
|
+
if (fieldChanges !== undefined && fieldChanges.length > 0) {
|
|
1112
|
+
delta.set(field, fieldChanges);
|
|
1101
1113
|
}
|
|
1114
|
+
fieldGlobal?.forEach((c) => global.push(c));
|
|
1115
|
+
fieldRename?.forEach((r) => rename.push(r));
|
|
1102
1116
|
}
|
|
1103
1117
|
return delta;
|
|
1104
1118
|
}
|
|
1105
|
-
function deltaFromNodeChange(change, nodeChanges, fieldKinds) {
|
|
1119
|
+
function deltaFromNodeChange(change, nodeChanges, fieldKinds, global, rename) {
|
|
1106
1120
|
if (change.fieldChanges !== undefined) {
|
|
1107
|
-
return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds);
|
|
1121
|
+
return intoDeltaImpl(change.fieldChanges, nodeChanges, fieldKinds, global, rename);
|
|
1108
1122
|
}
|
|
1109
1123
|
// TODO: update the API to allow undefined to be returned here
|
|
1110
1124
|
return new Map();
|
|
@@ -1161,22 +1175,22 @@ function newComposeTable(baseChange, newChange, composedNodeToParent) {
|
|
|
1161
1175
|
newChange,
|
|
1162
1176
|
fieldToContext: new Map(),
|
|
1163
1177
|
newFieldToBaseField: new Map(),
|
|
1164
|
-
newToBaseNodeId: newTupleBTree(),
|
|
1178
|
+
newToBaseNodeId: (0, index_js_2.newTupleBTree)(),
|
|
1165
1179
|
composedNodes: new Set(),
|
|
1166
1180
|
composedNodeToParent,
|
|
1167
1181
|
pendingCompositions: {
|
|
1168
1182
|
nodeIdsToCompose: [],
|
|
1169
|
-
affectedBaseFields: newTupleBTree(),
|
|
1170
|
-
affectedNewFields: newTupleBTree(),
|
|
1183
|
+
affectedBaseFields: (0, index_js_2.newTupleBTree)(),
|
|
1184
|
+
affectedNewFields: (0, index_js_2.newTupleBTree)(),
|
|
1171
1185
|
},
|
|
1172
1186
|
};
|
|
1173
1187
|
}
|
|
1174
1188
|
function newCrossFieldTable() {
|
|
1175
1189
|
return {
|
|
1176
|
-
srcTable:
|
|
1177
|
-
dstTable:
|
|
1178
|
-
srcDependents:
|
|
1179
|
-
dstDependents:
|
|
1190
|
+
srcTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1191
|
+
dstTable: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1192
|
+
srcDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1193
|
+
dstDependents: (0, index_js_1.newChangeAtomIdRangeMap)(),
|
|
1180
1194
|
invalidatedFields: new Set(),
|
|
1181
1195
|
};
|
|
1182
1196
|
}
|
|
@@ -1247,19 +1261,17 @@ class RebaseManager extends CrossFieldManagerI {
|
|
|
1247
1261
|
}
|
|
1248
1262
|
set(target, revision, id, count, newValue, invalidateDependents) {
|
|
1249
1263
|
if (invalidateDependents && this.allowInval) {
|
|
1250
|
-
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange,
|
|
1264
|
+
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
|
|
1251
1265
|
target,
|
|
1252
1266
|
revision,
|
|
1253
|
-
id,
|
|
1254
|
-
|
|
1255
|
-
]);
|
|
1267
|
+
localId: id,
|
|
1268
|
+
}, count);
|
|
1256
1269
|
(0, internal_1.assert)(newFieldIds.length === 0, 0x9c6 /* TODO: Modifying a cross-field key from the new changeset is currently unsupported */);
|
|
1257
|
-
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange,
|
|
1270
|
+
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1258
1271
|
target,
|
|
1259
1272
|
revision,
|
|
1260
|
-
id,
|
|
1261
|
-
|
|
1262
|
-
]);
|
|
1273
|
+
localId: id,
|
|
1274
|
+
}, count);
|
|
1263
1275
|
(0, internal_1.assert)(baseFieldIds.length > 0, 0x9c7 /* Cross field key not registered in base or new change */);
|
|
1264
1276
|
for (const baseFieldId of baseFieldIds) {
|
|
1265
1277
|
this.table.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
|
|
@@ -1271,7 +1283,7 @@ class RebaseManager extends CrossFieldManagerI {
|
|
|
1271
1283
|
setInChangeAtomIdMap(this.table.rebasedNodeToParent, id, this.fieldId);
|
|
1272
1284
|
}
|
|
1273
1285
|
moveKey(target, revision, id, count) {
|
|
1274
|
-
|
|
1286
|
+
this.table.rebasedCrossFieldKeys.set({ target, revision, localId: id }, count, this.fieldId);
|
|
1275
1287
|
}
|
|
1276
1288
|
get table() {
|
|
1277
1289
|
return this.crossFieldTable;
|
|
@@ -1285,24 +1297,22 @@ class ComposeManager extends CrossFieldManagerI {
|
|
|
1285
1297
|
}
|
|
1286
1298
|
set(target, revision, id, count, newValue, invalidateDependents) {
|
|
1287
1299
|
if (invalidateDependents && this.allowInval) {
|
|
1288
|
-
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange,
|
|
1300
|
+
const newFieldIds = getFieldsForCrossFieldKey(this.table.newChange, {
|
|
1289
1301
|
target,
|
|
1290
1302
|
revision,
|
|
1291
|
-
id,
|
|
1292
|
-
|
|
1293
|
-
]);
|
|
1303
|
+
localId: id,
|
|
1304
|
+
}, count);
|
|
1294
1305
|
if (newFieldIds.length > 0) {
|
|
1295
1306
|
for (const newFieldId of newFieldIds) {
|
|
1296
1307
|
this.table.pendingCompositions.affectedNewFields.set([newFieldId.nodeId?.revision, newFieldId.nodeId?.localId, newFieldId.field], true);
|
|
1297
1308
|
}
|
|
1298
1309
|
}
|
|
1299
1310
|
else {
|
|
1300
|
-
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange,
|
|
1311
|
+
const baseFieldIds = getFieldsForCrossFieldKey(this.table.baseChange, {
|
|
1301
1312
|
target,
|
|
1302
1313
|
revision,
|
|
1303
|
-
id,
|
|
1304
|
-
|
|
1305
|
-
]);
|
|
1314
|
+
localId: id,
|
|
1315
|
+
}, count);
|
|
1306
1316
|
(0, internal_1.assert)(baseFieldIds.length > 0, 0x9c8 /* Cross field key not registered in base or new change */);
|
|
1307
1317
|
for (const baseFieldId of baseFieldIds) {
|
|
1308
1318
|
this.table.pendingCompositions.affectedBaseFields.set([baseFieldId.nodeId?.revision, baseFieldId.nodeId?.localId, baseFieldId.field], true);
|
|
@@ -1326,10 +1336,10 @@ function makeModularChangeset(props = {
|
|
|
1326
1336
|
}) {
|
|
1327
1337
|
const changeset = {
|
|
1328
1338
|
fieldChanges: props.fieldChanges ?? new Map(),
|
|
1329
|
-
nodeChanges: props.nodeChanges ?? newTupleBTree(),
|
|
1330
|
-
nodeToParent: props.nodeToParent ?? newTupleBTree(),
|
|
1331
|
-
nodeAliases: props.nodeAliases ?? newTupleBTree(),
|
|
1332
|
-
crossFieldKeys: props.crossFieldKeys ?? newCrossFieldKeyTable(),
|
|
1339
|
+
nodeChanges: props.nodeChanges ?? (0, index_js_2.newTupleBTree)(),
|
|
1340
|
+
nodeToParent: props.nodeToParent ?? (0, index_js_2.newTupleBTree)(),
|
|
1341
|
+
nodeAliases: props.nodeAliases ?? (0, index_js_2.newTupleBTree)(),
|
|
1342
|
+
crossFieldKeys: props.crossFieldKeys ?? (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1333
1343
|
};
|
|
1334
1344
|
if (props.revisions !== undefined && props.revisions.length > 0) {
|
|
1335
1345
|
changeset.revisions = props.revisions;
|
|
@@ -1385,7 +1395,7 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1385
1395
|
if (content.mode === 1 /* CursorLocationType.Fields */ && content.getFieldLength() === 0) {
|
|
1386
1396
|
return { type: "global", revision };
|
|
1387
1397
|
}
|
|
1388
|
-
const builds = newTupleBTree();
|
|
1398
|
+
const builds = (0, index_js_2.newTupleBTree)();
|
|
1389
1399
|
const chunkCompressor = {
|
|
1390
1400
|
policy: index_js_3.defaultChunkPolicy,
|
|
1391
1401
|
idCompressor,
|
|
@@ -1412,9 +1422,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1412
1422
|
const modularChange = buildModularChangesetFromField({
|
|
1413
1423
|
path: field,
|
|
1414
1424
|
fieldChange: { fieldKind, change },
|
|
1415
|
-
nodeChanges: newTupleBTree(),
|
|
1416
|
-
nodeToParent: newTupleBTree(),
|
|
1417
|
-
crossFieldKeys: newCrossFieldKeyTable(),
|
|
1425
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1426
|
+
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1427
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1418
1428
|
idAllocator: this.idAllocator,
|
|
1419
1429
|
localCrossFieldKeys,
|
|
1420
1430
|
revision,
|
|
@@ -1441,9 +1451,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1441
1451
|
fieldKind: change.fieldKind,
|
|
1442
1452
|
change: change.change,
|
|
1443
1453
|
},
|
|
1444
|
-
nodeChanges: newTupleBTree(),
|
|
1445
|
-
nodeToParent: newTupleBTree(),
|
|
1446
|
-
crossFieldKeys: newCrossFieldKeyTable(),
|
|
1454
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1455
|
+
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1456
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1447
1457
|
idAllocator: this.idAllocator,
|
|
1448
1458
|
localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
|
|
1449
1459
|
revision: change.revision,
|
|
@@ -1470,9 +1480,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1470
1480
|
this.applyChange((0, index_js_1.tagChange)(buildModularChangesetFromNode({
|
|
1471
1481
|
path,
|
|
1472
1482
|
nodeChange,
|
|
1473
|
-
nodeChanges: newTupleBTree(),
|
|
1474
|
-
nodeToParent: newTupleBTree(),
|
|
1475
|
-
crossFieldKeys: newCrossFieldKeyTable(),
|
|
1483
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1484
|
+
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1485
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1476
1486
|
idAllocator: this.idAllocator,
|
|
1477
1487
|
revision,
|
|
1478
1488
|
}), revision));
|
|
@@ -1484,9 +1494,9 @@ class ModularEditBuilder extends index_js_1.EditBuilder {
|
|
|
1484
1494
|
this.applyChange((0, index_js_1.tagChange)(buildModularChangesetFromNode({
|
|
1485
1495
|
path,
|
|
1486
1496
|
nodeChange,
|
|
1487
|
-
nodeChanges: newTupleBTree(),
|
|
1488
|
-
nodeToParent: newTupleBTree(),
|
|
1489
|
-
crossFieldKeys: newCrossFieldKeyTable(),
|
|
1497
|
+
nodeChanges: (0, index_js_2.newTupleBTree)(),
|
|
1498
|
+
nodeToParent: (0, index_js_2.newTupleBTree)(),
|
|
1499
|
+
crossFieldKeys: (0, modularChangeTypes_js_1.newCrossFieldKeyTable)(),
|
|
1490
1500
|
idAllocator: this.idAllocator,
|
|
1491
1501
|
revision,
|
|
1492
1502
|
}), revision));
|
|
@@ -1497,8 +1507,8 @@ function buildModularChangesetFromField(props) {
|
|
|
1497
1507
|
const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = (0, index_js_2.idAllocatorFromMaxId)(), localCrossFieldKeys = [], childId, revision, } = props;
|
|
1498
1508
|
const fieldChanges = new Map([[path.field, fieldChange]]);
|
|
1499
1509
|
if (path.parent === undefined) {
|
|
1500
|
-
for (const key of localCrossFieldKeys) {
|
|
1501
|
-
crossFieldKeys.set(key, { nodeId: undefined, field: path.field });
|
|
1510
|
+
for (const { key, count } of localCrossFieldKeys) {
|
|
1511
|
+
crossFieldKeys.set(key, count, { nodeId: undefined, field: path.field });
|
|
1502
1512
|
}
|
|
1503
1513
|
if (childId !== undefined) {
|
|
1504
1514
|
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
@@ -1519,8 +1529,8 @@ function buildModularChangesetFromField(props) {
|
|
|
1519
1529
|
fieldChanges,
|
|
1520
1530
|
};
|
|
1521
1531
|
const parentId = { localId: (0, index_js_2.brand)(idAllocator.allocate()), revision };
|
|
1522
|
-
for (const key of localCrossFieldKeys) {
|
|
1523
|
-
crossFieldKeys.set(key, { nodeId: parentId, field: path.field });
|
|
1532
|
+
for (const { key, count } of localCrossFieldKeys) {
|
|
1533
|
+
crossFieldKeys.set(key, count, { nodeId: parentId, field: path.field });
|
|
1524
1534
|
}
|
|
1525
1535
|
if (childId !== undefined) {
|
|
1526
1536
|
setInChangeAtomIdMap(nodeToParent, childId, {
|
|
@@ -1593,19 +1603,6 @@ function revisionInfoFromTaggedChange(taggedChange) {
|
|
|
1593
1603
|
}
|
|
1594
1604
|
return revInfos;
|
|
1595
1605
|
}
|
|
1596
|
-
function mergeBTrees(tree1, tree2, preferLeft = true) {
|
|
1597
|
-
if (tree1 === undefined) {
|
|
1598
|
-
return tree2 !== undefined ? (0, index_js_2.brand)(tree2.clone()) : newTupleBTree();
|
|
1599
|
-
}
|
|
1600
|
-
const result = (0, index_js_2.brand)(tree1.clone());
|
|
1601
|
-
if (tree2 === undefined) {
|
|
1602
|
-
return result;
|
|
1603
|
-
}
|
|
1604
|
-
for (const [key, value] of tree2.entries()) {
|
|
1605
|
-
result.set(key, value, !preferLeft);
|
|
1606
|
-
}
|
|
1607
|
-
return result;
|
|
1608
|
-
}
|
|
1609
1606
|
function fieldChangeFromId(fields, nodes, id) {
|
|
1610
1607
|
const fieldMap = fieldMapFromNodeId(fields, nodes, id.nodeId);
|
|
1611
1608
|
return fieldMap.get(id.field) ?? (0, index_js_2.fail)("No field exists for the given ID");
|
|
@@ -1657,77 +1654,18 @@ function getParentFieldId(changeset, nodeId) {
|
|
|
1657
1654
|
return normalizeFieldId(parentId, changeset.nodeAliases);
|
|
1658
1655
|
}
|
|
1659
1656
|
exports.getParentFieldId = getParentFieldId;
|
|
1660
|
-
function getFieldsForCrossFieldKey(changeset,
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
// eslint-disable-next-line no-constant-condition
|
|
1665
|
-
while (true) {
|
|
1666
|
-
const entry = getFirstIntersectingCrossFieldEntry(changeset.crossFieldKeys, [
|
|
1667
|
-
target,
|
|
1668
|
-
revision,
|
|
1669
|
-
(0, index_js_2.brand)(firstLocalId),
|
|
1670
|
-
count,
|
|
1671
|
-
]);
|
|
1672
|
-
if (entry === undefined) {
|
|
1673
|
-
return fields;
|
|
1674
|
-
}
|
|
1675
|
-
const [[_target, _revision, entryId, entryCount], fieldId] = entry;
|
|
1676
|
-
fields.push(normalizeFieldId(fieldId, changeset.nodeAliases));
|
|
1677
|
-
const entryLastId = entryId + entryCount - 1;
|
|
1678
|
-
if (entryLastId >= lastLocalId) {
|
|
1679
|
-
return fields;
|
|
1680
|
-
}
|
|
1681
|
-
firstLocalId = entryLastId + 1;
|
|
1682
|
-
}
|
|
1683
|
-
}
|
|
1684
|
-
exports.getFieldsForCrossFieldKey = getFieldsForCrossFieldKey;
|
|
1685
|
-
function getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]) {
|
|
1686
|
-
const entry = table.nextLowerPair([target, revision, id, Number.POSITIVE_INFINITY]);
|
|
1687
|
-
if (entry === undefined) {
|
|
1688
|
-
return undefined;
|
|
1689
|
-
}
|
|
1690
|
-
const [entryTarget, entryRevision, entryId, entryCount] = entry[0];
|
|
1691
|
-
if (entryTarget !== target || entryRevision !== revision) {
|
|
1692
|
-
return undefined;
|
|
1693
|
-
}
|
|
1694
|
-
const lastQueryId = id + count - 1;
|
|
1695
|
-
const entryLastId = entryId + entryCount - 1;
|
|
1696
|
-
if (entryId > lastQueryId || entryLastId < id) {
|
|
1697
|
-
return undefined;
|
|
1698
|
-
}
|
|
1699
|
-
return entry;
|
|
1700
|
-
}
|
|
1701
|
-
function setInCrossFieldKeyTable(table, target, revision, id, count, value) {
|
|
1702
|
-
let entry = getFirstIntersectingCrossFieldEntry(table, [target, revision, id, count]);
|
|
1703
|
-
const lastQueryId = id + count - 1;
|
|
1704
|
-
while (entry !== undefined) {
|
|
1705
|
-
const [entryKey, entryValue] = entry;
|
|
1706
|
-
table.delete(entryKey);
|
|
1707
|
-
const [_target, _revision, entryId, entryCount] = entryKey;
|
|
1708
|
-
if (entryId < id) {
|
|
1709
|
-
table.set([target, revision, entryId, id - entryId], entryValue);
|
|
1710
|
-
}
|
|
1711
|
-
const lastEntryId = entryId + entryCount - 1;
|
|
1712
|
-
if (lastEntryId > lastQueryId) {
|
|
1713
|
-
table.set([target, revision, (0, index_js_2.brand)(lastQueryId + 1), lastEntryId - lastQueryId], entryValue);
|
|
1714
|
-
break;
|
|
1715
|
-
}
|
|
1716
|
-
const nextId = (0, index_js_2.brand)(lastEntryId + 1);
|
|
1717
|
-
entry = getFirstIntersectingCrossFieldEntry(table, [
|
|
1718
|
-
target,
|
|
1719
|
-
revision,
|
|
1720
|
-
nextId,
|
|
1721
|
-
lastQueryId - nextId + 1,
|
|
1722
|
-
]);
|
|
1723
|
-
}
|
|
1724
|
-
table.set([target, revision, id, count], value);
|
|
1657
|
+
function getFieldsForCrossFieldKey(changeset, key, count) {
|
|
1658
|
+
return changeset.crossFieldKeys
|
|
1659
|
+
.getAll(key, count)
|
|
1660
|
+
.map(({ value: fieldId }) => normalizeFieldId(fieldId, changeset.nodeAliases));
|
|
1725
1661
|
}
|
|
1662
|
+
// This is only exported for use in test utilities.
|
|
1726
1663
|
function normalizeFieldId(fieldId, nodeAliases) {
|
|
1727
1664
|
return fieldId.nodeId !== undefined
|
|
1728
1665
|
? { ...fieldId, nodeId: normalizeNodeId(fieldId.nodeId, nodeAliases) }
|
|
1729
1666
|
: fieldId;
|
|
1730
1667
|
}
|
|
1668
|
+
exports.normalizeFieldId = normalizeFieldId;
|
|
1731
1669
|
/**
|
|
1732
1670
|
* @returns The canonical form of nodeId, according to nodeAliases
|
|
1733
1671
|
*/
|
|
@@ -1745,38 +1683,6 @@ function normalizeNodeId(nodeId, nodeAliases) {
|
|
|
1745
1683
|
function hasConflicts(change) {
|
|
1746
1684
|
return (change.constraintViolationCount ?? 0) > 0;
|
|
1747
1685
|
}
|
|
1748
|
-
function newCrossFieldKeyTable() {
|
|
1749
|
-
return newTupleBTree();
|
|
1750
|
-
}
|
|
1751
|
-
exports.newCrossFieldKeyTable = newCrossFieldKeyTable;
|
|
1752
|
-
function newTupleBTree(entries) {
|
|
1753
|
-
return (0, index_js_2.brand)(new sorted_btree_es6_1.BTree(entries, compareTuples));
|
|
1754
|
-
}
|
|
1755
|
-
exports.newTupleBTree = newTupleBTree;
|
|
1756
|
-
// This assumes that the arrays are the same length.
|
|
1757
|
-
function compareTuples(arrayA, arrayB) {
|
|
1758
|
-
for (let i = 0; i < arrayA.length; i++) {
|
|
1759
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1760
|
-
const a = arrayA[i];
|
|
1761
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1762
|
-
const b = arrayB[i];
|
|
1763
|
-
// Less-than and greater-than always return false if either value is undefined,
|
|
1764
|
-
// so we handle undefined separately, treating it as less than all other values.
|
|
1765
|
-
if (a === undefined && b !== undefined) {
|
|
1766
|
-
return -1;
|
|
1767
|
-
}
|
|
1768
|
-
else if (b === undefined && a !== undefined) {
|
|
1769
|
-
return 1;
|
|
1770
|
-
}
|
|
1771
|
-
else if (a < b) {
|
|
1772
|
-
return -1;
|
|
1773
|
-
}
|
|
1774
|
-
else if (a > b) {
|
|
1775
|
-
return 1;
|
|
1776
|
-
}
|
|
1777
|
-
}
|
|
1778
|
-
return 0;
|
|
1779
|
-
}
|
|
1780
1686
|
function getFromChangeAtomIdMap(map, id) {
|
|
1781
1687
|
return map.get([id.revision, id.localId]);
|
|
1782
1688
|
}
|