@fluidframework/tree 2.74.0-368706 → 2.74.0-370705
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/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +1 -0
- package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js +5 -1
- package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts +1 -1
- package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/default-schema/index.js +2 -1
- package/dist/feature-libraries/default-schema/index.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 +2 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
- package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/index.js +2 -1
- package/dist/feature-libraries/modular-schema/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +9 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +31 -0
- package/dist/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js +57 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
- package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -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/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/dist/shared-tree/sharedTreeChangeFamily.js +8 -2
- package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.js +1 -1
- package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +1 -0
- package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js +4 -1
- package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js +1 -1
- package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts +1 -1
- package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/default-schema/index.js +1 -1
- package/lib/feature-libraries/default-schema/index.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/index.d.ts +1 -1
- package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/index.js +1 -1
- package/lib/feature-libraries/modular-schema/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +1 -0
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +7 -0
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts +23 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.d.ts.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js +27 -0
- package/lib/feature-libraries/optional-field/optionalFieldChangeFormatV3.js.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts +12 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.d.ts.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js +53 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecV3.js.map +1 -0
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.js +5 -1
- package/lib/feature-libraries/optional-field/optionalFieldCodecs.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/sharedTreeChangeEnricher.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +2 -2
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
- package/lib/shared-tree/sharedTreeChangeFamily.js +8 -2
- package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.js +1 -1
- package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
- package/package.json +21 -21
- package/src/feature-libraries/default-schema/defaultEditBuilder.ts +5 -0
- package/src/feature-libraries/default-schema/defaultFieldKinds.ts +1 -1
- package/src/feature-libraries/default-schema/index.ts +1 -0
- package/src/feature-libraries/index.ts +1 -0
- package/src/feature-libraries/modular-schema/index.ts +1 -0
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +8 -0
- package/src/feature-libraries/optional-field/optionalFieldChangeFormatV3.ts +45 -0
- package/src/feature-libraries/optional-field/optionalFieldCodecV3.ts +94 -0
- package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -1
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +2 -0
- package/src/shared-tree/sharedTreeChangeFamily.ts +8 -1
- package/src/shared-tree/sharedTreeEditBuilder.ts +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { type ObjectOptions, type Static, type TSchema, Type } from "@sinclair/typebox";
|
|
7
|
+
|
|
8
|
+
import { EncodedChangeAtomId } from "../modular-schema/index.js";
|
|
9
|
+
|
|
10
|
+
const noAdditionalProps: ObjectOptions = { additionalProperties: false };
|
|
11
|
+
|
|
12
|
+
// Type is intentionally derived.
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
14
|
+
export const EncodedOptionalChangeset = <Schema extends TSchema>(tNodeChange: Schema) =>
|
|
15
|
+
Type.Object(
|
|
16
|
+
{
|
|
17
|
+
// Nested changes
|
|
18
|
+
c: Type.Optional(tNodeChange),
|
|
19
|
+
|
|
20
|
+
// How to replace the current value of the field.
|
|
21
|
+
r: Type.Optional(EncodedReplace),
|
|
22
|
+
|
|
23
|
+
// Node detach
|
|
24
|
+
d: Type.Optional(EncodedChangeAtomId),
|
|
25
|
+
},
|
|
26
|
+
noAdditionalProps,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
export type EncodedOptionalChangeset<Schema extends TSchema> = Static<
|
|
30
|
+
ReturnType<typeof EncodedOptionalChangeset<Schema>>
|
|
31
|
+
>;
|
|
32
|
+
|
|
33
|
+
const EncodedReplace = Type.Object(
|
|
34
|
+
{
|
|
35
|
+
// Whether the field is empty in the input context of this change.
|
|
36
|
+
e: Type.Boolean(),
|
|
37
|
+
// The ID for the node to put in this field, or undefined if the field should be emptied.
|
|
38
|
+
// Will be "self" when the intention is to keep the current node in this field.
|
|
39
|
+
s: Type.Optional(EncodedChangeAtomId),
|
|
40
|
+
// An ID to associate with the node (if any) which is detached by this edit.
|
|
41
|
+
d: EncodedChangeAtomId,
|
|
42
|
+
},
|
|
43
|
+
noAdditionalProps,
|
|
44
|
+
);
|
|
45
|
+
export type EncodedReplace = Static<typeof EncodedReplace>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { TAnySchema } from "@sinclair/typebox";
|
|
7
|
+
|
|
8
|
+
import type { IJsonCodec } from "../../codec/index.js";
|
|
9
|
+
import type {
|
|
10
|
+
ChangeEncodingContext,
|
|
11
|
+
EncodedRevisionTag,
|
|
12
|
+
RevisionTag,
|
|
13
|
+
} from "../../core/index.js";
|
|
14
|
+
import type { Mutable } from "../../util/index.js";
|
|
15
|
+
import { makeChangeAtomIdCodec } from "../changeAtomIdCodec.js";
|
|
16
|
+
import {
|
|
17
|
+
EncodedNodeChangeset,
|
|
18
|
+
type FieldChangeEncodingContext,
|
|
19
|
+
} from "../modular-schema/index.js";
|
|
20
|
+
|
|
21
|
+
import { EncodedOptionalChangeset } from "./optionalFieldChangeFormatV3.js";
|
|
22
|
+
import type { OptionalChangeset, Replace } from "./optionalFieldChangeTypes.js";
|
|
23
|
+
|
|
24
|
+
export function makeOptionalFieldCodec(
|
|
25
|
+
revisionTagCodec: IJsonCodec<
|
|
26
|
+
RevisionTag,
|
|
27
|
+
EncodedRevisionTag,
|
|
28
|
+
EncodedRevisionTag,
|
|
29
|
+
ChangeEncodingContext
|
|
30
|
+
>,
|
|
31
|
+
): IJsonCodec<
|
|
32
|
+
OptionalChangeset,
|
|
33
|
+
EncodedOptionalChangeset<TAnySchema>,
|
|
34
|
+
EncodedOptionalChangeset<TAnySchema>,
|
|
35
|
+
FieldChangeEncodingContext
|
|
36
|
+
> {
|
|
37
|
+
const changeAtomIdCodec = makeChangeAtomIdCodec(revisionTagCodec);
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
encode: (change: OptionalChangeset, context: FieldChangeEncodingContext) => {
|
|
41
|
+
const encoded: EncodedOptionalChangeset<TAnySchema> = {};
|
|
42
|
+
|
|
43
|
+
if (change.valueReplace !== undefined) {
|
|
44
|
+
encoded.r = {
|
|
45
|
+
e: change.valueReplace.isEmpty,
|
|
46
|
+
d: changeAtomIdCodec.encode(change.valueReplace.dst, context.baseContext),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
if (change.valueReplace.src !== undefined) {
|
|
50
|
+
encoded.r.s = changeAtomIdCodec.encode(change.valueReplace.src, context.baseContext);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (change.nodeDetach !== undefined) {
|
|
55
|
+
encoded.d = changeAtomIdCodec.encode(change.nodeDetach, context.baseContext);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (change.childChange !== undefined) {
|
|
59
|
+
encoded.c = context.encodeNode(change.childChange);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return encoded;
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
decode: (
|
|
66
|
+
encoded: EncodedOptionalChangeset<TAnySchema>,
|
|
67
|
+
context: FieldChangeEncodingContext,
|
|
68
|
+
) => {
|
|
69
|
+
const decoded: Mutable<OptionalChangeset> = {};
|
|
70
|
+
|
|
71
|
+
if (encoded.r !== undefined) {
|
|
72
|
+
const replace: Mutable<Replace> = {
|
|
73
|
+
isEmpty: encoded.r.e,
|
|
74
|
+
dst: changeAtomIdCodec.decode(encoded.r.d, context.baseContext),
|
|
75
|
+
};
|
|
76
|
+
if (encoded.r.s !== undefined) {
|
|
77
|
+
replace.src = changeAtomIdCodec.decode(encoded.r.s, context.baseContext);
|
|
78
|
+
}
|
|
79
|
+
decoded.valueReplace = replace;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (encoded.d !== undefined) {
|
|
83
|
+
decoded.nodeDetach = changeAtomIdCodec.decode(encoded.d, context.baseContext);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (encoded.c !== undefined) {
|
|
87
|
+
decoded.childChange = context.decodeNode(encoded.c);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return decoded;
|
|
91
|
+
},
|
|
92
|
+
encodedSchema: EncodedOptionalChangeset(EncodedNodeChangeset),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -13,6 +13,7 @@ import type { FieldChangeEncodingContext } from "../modular-schema/index.js";
|
|
|
13
13
|
|
|
14
14
|
import type { OptionalChangeset } from "./optionalFieldChangeTypes.js";
|
|
15
15
|
import { makeOptionalFieldCodec as makeV2Codec } from "./optionalFieldCodecV2.js";
|
|
16
|
+
import { makeOptionalFieldCodec as makeV3Codec } from "./optionalFieldCodecV3.js";
|
|
16
17
|
|
|
17
18
|
export const makeOptionalFieldCodecFamily = (
|
|
18
19
|
revisionTagCodec: IJsonCodec<
|
|
@@ -22,4 +23,7 @@ export const makeOptionalFieldCodecFamily = (
|
|
|
22
23
|
ChangeEncodingContext
|
|
23
24
|
>,
|
|
24
25
|
): ICodecFamily<OptionalChangeset, FieldChangeEncodingContext> =>
|
|
25
|
-
makeCodecFamily([
|
|
26
|
+
makeCodecFamily([
|
|
27
|
+
[2, makeV2Codec(revisionTagCodec)],
|
|
28
|
+
[3, makeV3Codec(revisionTagCodec)],
|
|
29
|
+
]);
|
package/src/packageVersion.ts
CHANGED
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
type TreeChunk,
|
|
21
21
|
chunkTree,
|
|
22
22
|
defaultChunkPolicy,
|
|
23
|
+
getBuildsIds,
|
|
23
24
|
intoDelta,
|
|
24
25
|
relevantRemovedRoots,
|
|
25
26
|
updateRefreshers as updateDataChangeRefreshers,
|
|
@@ -62,6 +63,7 @@ export class SharedTreeReadonlyChangeEnricher
|
|
|
62
63
|
public updateChangeEnrichments(change: SharedTreeChange): SharedTreeChange {
|
|
63
64
|
return updateRefreshers(
|
|
64
65
|
change,
|
|
66
|
+
getBuildsIds,
|
|
65
67
|
this.getDetachedRoot,
|
|
66
68
|
relevantRemovedRoots,
|
|
67
69
|
updateDataChangeRefreshers,
|
|
@@ -262,6 +262,7 @@ function mapDataChanges(
|
|
|
262
262
|
*/
|
|
263
263
|
export function updateRefreshers(
|
|
264
264
|
change: SharedTreeChange,
|
|
265
|
+
buildsFromDataChange: (taggedChange: ModularChangeset) => Iterable<DeltaDetachedNodeId>,
|
|
265
266
|
getDetachedNode: (id: DeltaDetachedNodeId) => TreeChunk | undefined,
|
|
266
267
|
relevantRemovedRootsFromDataChange: (
|
|
267
268
|
taggedChange: ModularChangeset,
|
|
@@ -308,13 +309,19 @@ export function updateRefreshers(
|
|
|
308
309
|
}
|
|
309
310
|
let isFirstDataChange = true;
|
|
310
311
|
return mapDataChanges(change, (dataChange) => {
|
|
312
|
+
const builtRoots = buildsFromDataChange(dataChange);
|
|
313
|
+
for (const id of builtRoots) {
|
|
314
|
+
// Detached root IDs that are used for builds are only ever used by a single node,
|
|
315
|
+
// so there is no risk of excluding needed refreshers by adding them to the list of already included roots.
|
|
316
|
+
addToNestedSet(includedRoots, id.major, id.minor);
|
|
317
|
+
}
|
|
311
318
|
const removedRoots = relevantRemovedRootsFromDataChange(dataChange);
|
|
312
319
|
if (isFirstDataChange) {
|
|
313
320
|
isFirstDataChange = false;
|
|
314
321
|
return updateDataChangeRefreshers(
|
|
315
322
|
dataChange,
|
|
316
323
|
getAndRememberDetachedNode,
|
|
317
|
-
removedRoots,
|
|
324
|
+
filterIncludedRoots(removedRoots),
|
|
318
325
|
true,
|
|
319
326
|
);
|
|
320
327
|
} else {
|