fluid-framework 2.71.0 → 2.73.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 +122 -45
- package/api-report/fluid-framework.alpha.api.md +44 -48
- package/api-report/fluid-framework.beta.api.md +42 -0
- package/api-report/fluid-framework.legacy.beta.api.md +42 -0
- package/dist/alpha.d.ts +12 -8
- package/dist/beta.d.ts +7 -0
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/legacy.d.ts +7 -0
- package/lib/alpha.d.ts +12 -8
- package/lib/beta.d.ts +7 -0
- package/lib/index.js +2 -2
- package/lib/index.js.map +1 -1
- package/lib/legacy.d.ts +7 -0
- package/package.json +15 -15
- package/src/index.ts +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,126 @@
|
|
|
1
1
|
# fluid-framework
|
|
2
2
|
|
|
3
|
+
## 2.73.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- Schema snapshot compatibility checker ([#25861](https://github.com/microsoft/FluidFramework/pull/25861)) [e5be416321](https://github.com/microsoft/FluidFramework/commit/e5be4163210ef68b7f8a7c10502f4871c30ec9f3)
|
|
8
|
+
|
|
9
|
+
This change adds alpha APIs for creating snapshots of view schema and testing their compatibility for the purposes
|
|
10
|
+
of schema migrations.
|
|
11
|
+
|
|
12
|
+
New APIs:
|
|
13
|
+
- `checkCompatibility` - Checks the compatibility of the view schema which created the document against the view schema
|
|
14
|
+
being used to open it.
|
|
15
|
+
- `importCompatibilitySchemaSnapshot` - Parse a JSON representation of a tree schema into a concrete schema.
|
|
16
|
+
- `exportCompatibilitySchemaSnapshot` - Returns a JSON representation of the tree schema for snapshot compatibility checking.
|
|
17
|
+
|
|
18
|
+
#### Example: Current view schema vs. historical view schema
|
|
19
|
+
|
|
20
|
+
An application author is developing an app that has a schema for storing 2D Points.
|
|
21
|
+
They wish to maintain backwards compatibility in future versions and avoid changing their view schema in a way that breaks
|
|
22
|
+
this behavior.
|
|
23
|
+
When introducing a new initial schema, they persists a snapshot using `exportCompatibilitySchemaSnapshot`:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
const factory = new SchemaFactory("test");
|
|
27
|
+
|
|
28
|
+
// The past view schema, for the purposes of illustration. This wouldn't normally appear as a concrete schema in the test
|
|
29
|
+
// checking compatibility, but rather would be loaded from a snapshot.
|
|
30
|
+
class Point2D extends factory.object("Point", {
|
|
31
|
+
x: factory.number,
|
|
32
|
+
y: factory.number,
|
|
33
|
+
}) {}
|
|
34
|
+
const viewSchema = new TreeViewConfiguration({ schema: Point2D });
|
|
35
|
+
const encodedSchema = JSON.stringify(
|
|
36
|
+
exportCompatibilitySchemaSnapshot(viewSchema),
|
|
37
|
+
);
|
|
38
|
+
fs.writeFileSync("PointSchema.json", encodedSchema);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Next they create a regression test to ensure that the current view schema can read content written by the original view
|
|
42
|
+
schema (`SchemaCompatibilityStatus.canUpgrade`). Initially `currentViewSchema === Point2D`:
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
const encodedSchema = JSON.parse(fs.readFileSync("PointSchema.json", "utf8"));
|
|
46
|
+
const oldViewSchema = importCompatibilitySchemaSnapshot(encodedSchema);
|
|
47
|
+
|
|
48
|
+
// Check to see if the document created by the historical view schema can be opened with the current view schema
|
|
49
|
+
const compatibilityStatus = checkCompatibility(
|
|
50
|
+
oldViewSchema,
|
|
51
|
+
currentViewSchema,
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
// Check to see if the document created by the historical view schema can be opened with the current view schema
|
|
55
|
+
const backwardsCompatibilityStatus = checkCompatibility(
|
|
56
|
+
oldViewSchema,
|
|
57
|
+
currentViewSchema,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// z is not present in Point2D, so the schema must be upgraded
|
|
61
|
+
assert.equal(backwardsCompatibilityStatus.canView, false);
|
|
62
|
+
|
|
63
|
+
// The schema can be upgraded to add the new optional field
|
|
64
|
+
assert.equal(backwardsCompatibilityStatus.canUpgrade, true);
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Additionally, they a regression test to ensure that older view schemas can read content written by the current view
|
|
68
|
+
schema (`SchemaCompatibilityStatus.canView`):
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
// Test what the old version of the application would do with a tree using the new schema:
|
|
72
|
+
const forwardsCompatibilityStatus = checkCompatibility(
|
|
73
|
+
currentViewSchema,
|
|
74
|
+
oldViewSchema,
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
// If the old schema set allowUnknownOptionalFields, this would be true, but since it did not,
|
|
78
|
+
// this assert will fail, detecting the forwards compatibility break:
|
|
79
|
+
// this means these two versions of the application cannot collaborate on content using these schema.
|
|
80
|
+
assert.equal(forwardsCompatibilityStatus.canView, true);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Later in the application development cycle, the application author decides they want to change their Point2D to
|
|
84
|
+
a Point3D, adding an extra field:
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
// Build the current view schema
|
|
88
|
+
const schemaFactory = new SchemaFactory("test");
|
|
89
|
+
class Point3D extends schemaFactory.object("Point", {
|
|
90
|
+
x: factory.number,
|
|
91
|
+
y: factory.number,
|
|
92
|
+
|
|
93
|
+
// The current schema has a new optional field that was not present on Point2D
|
|
94
|
+
z: factory.optional(factory.number),
|
|
95
|
+
}) {}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The test first compatibility test will pass as the Point2D schema is upgradeable to a Point3D schema.
|
|
99
|
+
However, the second compatibility test fill fail as an application using the Point2D view schema cannot collaborate on
|
|
100
|
+
content authored using the Point3D schema.
|
|
101
|
+
|
|
102
|
+
## 2.72.0
|
|
103
|
+
|
|
104
|
+
### Minor Changes
|
|
105
|
+
|
|
106
|
+
- `formatVersion` removed from the options passed to `configuredSharedTree` ([#25752](https://github.com/microsoft/FluidFramework/pull/25752)) [df533906e3](https://github.com/microsoft/FluidFramework/commit/df533906e3a8e5d54024009704ca0c0eedb95e95)
|
|
107
|
+
|
|
108
|
+
Note: this change may break users of alpha APIs. See below for details.
|
|
109
|
+
|
|
110
|
+
`SharedTreeOptions` (which is passed to `configuredSharedTree`) no longer includes a `formatVersion: SharedTreeFormatVersion[keyof SharedTreeFormatVersion]` field.
|
|
111
|
+
The concept of `SharedTreeFormatVersion` has been removed altogether.
|
|
112
|
+
Instead, users are expected to leverage the already existing `minVersionForCollab` field.
|
|
113
|
+
|
|
114
|
+
For migration purposes, the mapping from `SharedTreeFormatVersion` to `minVersionForCollab` is as follows:
|
|
115
|
+
- `SharedTreeFormatVersion.v1`: no supported equivalent
|
|
116
|
+
- `SharedTreeFormatVersion.v2`: no supported equivalent
|
|
117
|
+
- `SharedTreeFormatVersion.v3`: `minVersionForCollab: FluidClientVersion.v2_0`
|
|
118
|
+
- `SharedTreeFormatVersion.v5`: `minVersionForCollab: FluidClientVersion.v2_43`
|
|
119
|
+
- `SharedTreeFormatVersion.vSharedBranches`: `minVersionForCollab: FluidClientVersion.v2_43` + `SharedTreeOptions.enableSharedBranches`
|
|
120
|
+
|
|
121
|
+
The values for which there is no supported equivalent `minVersionForCollab` were never given official support.
|
|
122
|
+
[Contact](https://github.com/microsoft/FluidFramework/issues) the Fluid Framework team if you need help migrating away from them.
|
|
123
|
+
|
|
3
124
|
## 2.71.0
|
|
4
125
|
|
|
5
126
|
### Minor Changes
|
|
@@ -61,7 +182,6 @@
|
|
|
61
182
|
- A minimal set of branching APIs has been promoted to beta. ([#25744](https://github.com/microsoft/FluidFramework/pull/25744)) [32cc2c75d8](https://github.com/microsoft/FluidFramework/commit/32cc2c75d82c35403caa91e67e81f71baee5d092)
|
|
62
183
|
|
|
63
184
|
The following APIs have been promoted to beta in `@fluidframework/tree`:
|
|
64
|
-
|
|
65
185
|
- `TreeBranch.fork()`
|
|
66
186
|
- `TreeBranch.merge()`
|
|
67
187
|
- `TreeBranch.rebaseOnto()`
|
|
@@ -186,7 +306,6 @@
|
|
|
186
306
|
The `@alpha` API `JsonValidator` has been removed: its replacement `FormatValidator` must now be used.
|
|
187
307
|
|
|
188
308
|
As part of this:
|
|
189
|
-
|
|
190
309
|
- `typeboxValidator` has been replaced with `FormatValidatorBasic`.
|
|
191
310
|
- `noopValidator` has been replaced with `FormatValidatorNoOp`.
|
|
192
311
|
|
|
@@ -342,7 +461,6 @@ Dependency updates only.
|
|
|
342
461
|
The APIs that operate on batches should be used instead.
|
|
343
462
|
|
|
344
463
|
Specifically:
|
|
345
|
-
|
|
346
464
|
- `insertColumn`
|
|
347
465
|
- Use `insertColumns` instead
|
|
348
466
|
- `insertRow`
|
|
@@ -362,7 +480,6 @@ Dependency updates only.
|
|
|
362
480
|
- Remove unnecessary and internal APIs in ISequenceIntervalCollection and related interval types ([#25244](https://github.com/microsoft/FluidFramework/pull/25244)) [15d476ea706](https://github.com/microsoft/FluidFramework/commit/15d476ea7069eb4de317a726733aa8fb9e8486e8)
|
|
363
481
|
|
|
364
482
|
The following APIs are now removed:
|
|
365
|
-
|
|
366
483
|
- `IInterval.clone`
|
|
367
484
|
- `IInterval.modify`
|
|
368
485
|
- `IInterval.union`
|
|
@@ -508,7 +625,6 @@ Dependency updates only.
|
|
|
508
625
|
- Allow edits in arrays to be concurrent to dependent edits of transactions with violated constraints ([#25191](https://github.com/microsoft/FluidFramework/pull/25191)) [ef64bae6ab2](https://github.com/microsoft/FluidFramework/commit/ef64bae6ab2848c67d778d14ad56ae021f54ac7a)
|
|
509
626
|
|
|
510
627
|
Before this release, making concurrent edits to an array could lead to assertion error `0x8a2` being thrown if the following conditions were met:
|
|
511
|
-
|
|
512
628
|
- Some edit `e1` was a transaction with a constraint that turned out to be violated by edits concurrent to (and sequenced before) `e1`
|
|
513
629
|
- Some edit `e2` was dependent on `e1` (from before the violation of its constraint)
|
|
514
630
|
- Some edit `e3` was concurrent to and sequenced after both `e1` and `e2`
|
|
@@ -558,7 +674,6 @@ Dependency updates only.
|
|
|
558
674
|
(This is the case when nodes are removed before attaching and there is a local branch that forks from a commit that made such a removal or from an earlier commit. This is also the case when retaining `Revertible` objects for those commits).
|
|
559
675
|
|
|
560
676
|
After this release, the behavior depends on the `CodecWriteOptions.oldestCompatibleClient` value:
|
|
561
|
-
|
|
562
677
|
- For values < `FluidClientVersion.v2_52`, the behavior is the same.
|
|
563
678
|
- For values >= `FluidClientVersion.v2_52`, the attach will succeed, but use a newer storage format.
|
|
564
679
|
|
|
@@ -654,7 +769,6 @@ Dependency updates only.
|
|
|
654
769
|
We recommend updating your code to be more tolerant of unknown node kinds going forward.
|
|
655
770
|
|
|
656
771
|
Also see alternative options for schema-agnostic tree traversal if needed:
|
|
657
|
-
|
|
658
772
|
- [Tree.parent](https://fluidframework.com/docs/api/fluid-framework/treenodeapi-interface#parent-methodsignature)
|
|
659
773
|
- [TreeAlpha.child](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#child-methodsignature)
|
|
660
774
|
- [TreeAlpha.children](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#children-methodsignature)
|
|
@@ -1066,7 +1180,6 @@ Dependency updates only.
|
|
|
1066
1180
|
|
|
1067
1181
|
Table trees created using `TableSchema` offer various APIs to make working with tabular data easy.
|
|
1068
1182
|
These include:
|
|
1069
|
-
|
|
1070
1183
|
- Insertion and removal of columns, rows, and cells.
|
|
1071
1184
|
- Cell access by column/row.
|
|
1072
1185
|
|
|
@@ -1212,7 +1325,6 @@ Dependency updates only.
|
|
|
1212
1325
|
You can retrieve the long identifier with `TreeAlpha.identifier(node)`, where `node` is a `TreeNode`. The long identifier is a stable, compressible UUID generated by the tree.
|
|
1213
1326
|
In cases where the node does not yet have an identifier assigned, this will return `undefined`.
|
|
1214
1327
|
These cases include:
|
|
1215
|
-
|
|
1216
1328
|
- The node does not contain an identifier field.
|
|
1217
1329
|
- The node is a non-hydrated node with a user provided identifier. Note that if it is a non-hydrated node without an identifier provided, it will throw an error.
|
|
1218
1330
|
|
|
@@ -1223,7 +1335,6 @@ Dependency updates only.
|
|
|
1223
1335
|
to get the original valid long `identifier` back.
|
|
1224
1336
|
In the cases where it's not possible to shorten the `identifier`, it will return `undefined`.
|
|
1225
1337
|
These cases include:
|
|
1226
|
-
|
|
1227
1338
|
- A compressible long identifier, but it is unrecognized by the tree that the node belongs to. This can occur if the identifier is not generated from the tree.
|
|
1228
1339
|
- An identifier which is not compressible by the tree. This can occur if the node's identifier was a user provided string.
|
|
1229
1340
|
|
|
@@ -1233,7 +1344,6 @@ Dependency updates only.
|
|
|
1233
1344
|
If the method returns a valid long identifier, this identifier can be passed into `TreeAlpha.identifier.shorten` to get the original `identifier` back.
|
|
1234
1345
|
In the cases where it's not possible to lengthen the `identifier`, this method will throw an error.
|
|
1235
1346
|
These cases include:
|
|
1236
|
-
|
|
1237
1347
|
- An unrecognized short identifier. This can occur if the identifier is not generated from the tree.
|
|
1238
1348
|
|
|
1239
1349
|
#### TreeAlpha.identifier.getShort
|
|
@@ -1254,7 +1364,6 @@ Dependency updates only.
|
|
|
1254
1364
|
|
|
1255
1365
|
In cases where the node provided does not contain an identifier that is recognized or compressible by the tree that the node belongs to, this method will return undefined.
|
|
1256
1366
|
This will occur in the following cases:
|
|
1257
|
-
|
|
1258
1367
|
- The node is an non-hydrated node with a user provided identifier. Note that if it is an non-hydrated node without an identifier provided, it will throw an error.
|
|
1259
1368
|
- The node does not contain an identifier field.
|
|
1260
1369
|
- The node contains a compressible long identifier, but it is unrecognized by the tree that the node belongs to. This can occur if the identifier is not generated from the tree.
|
|
@@ -1389,7 +1498,6 @@ Dependency updates only.
|
|
|
1389
1498
|
|
|
1390
1499
|
[TreeNodes](https://fluidframework.com/docs/api/fluid-framework/treenode-class) which are [deleted](https://fluidframework.com/docs/api/fluid-framework/treestatus-enum#deleted-enummember) were not handled correctly.
|
|
1391
1500
|
This has been improved in two ways:
|
|
1392
|
-
|
|
1393
1501
|
1. Accessing fields of deleted nodes now consistently throws a usage error indicating that doing so is invalid.
|
|
1394
1502
|
Previously, this would throw an assertion error, which was a bug.
|
|
1395
1503
|
2. When a `TreeNode` is deleted, but that node still exists within the [`ITree`](https://fluidframework.com/docs/api/driver-definitions/itree-interface), then becomes accessible again later, a new `TreeNode` is now allocated instead of trying to reuse the deleted one.
|
|
@@ -1399,7 +1507,6 @@ Dependency updates only.
|
|
|
1399
1507
|
- Generic types for IntervalCollections have been replaced with non-generic types ([#24411](https://github.com/microsoft/FluidFramework/pull/24411)) [1c743e825ed](https://github.com/microsoft/FluidFramework/commit/1c743e825ed29a81b0e66775ce3553477361d335)
|
|
1400
1508
|
|
|
1401
1509
|
This change deprecates the following generic types and provides non-generic alternatives where necessary:
|
|
1402
|
-
|
|
1403
1510
|
- `IIntervalCollection` is replaced by `ISequenceIntervalCollection`
|
|
1404
1511
|
- `IIntervalCollectionEvent` is replaced by `ISequenceIntervalCollectionEvents`
|
|
1405
1512
|
- `IntervalIndex` is replaced by `SequenceIntervalIndex`
|
|
@@ -1467,7 +1574,6 @@ Dependency updates only.
|
|
|
1467
1574
|
As a side effect of this work, some schema which violated the documented allowed patterns specified by [SchemaFactory](https://fluidframework.com/docs/api/fluid-framework/schemafactory-class#schemafactory-remarks) but used to work (as long as they were not package exported) no longer compile.
|
|
1468
1575
|
|
|
1469
1576
|
The specific case known to break is when:
|
|
1470
|
-
|
|
1471
1577
|
1. An Object node schema is co-recursive with an Array node schema.
|
|
1472
1578
|
2. The Array does not declare a named subclass.
|
|
1473
1579
|
3. The schema reference from the Object to the Array is not using the [lazy syntax](https://fluidframework.com/docs/api/fluid-framework/lazyitem-typealias).
|
|
@@ -1517,7 +1623,6 @@ Dependency updates only.
|
|
|
1517
1623
|
trunk commits and 100 peer commits, the performance increases by 97%.
|
|
1518
1624
|
|
|
1519
1625
|
Some example scenarios where the performance will be improved:
|
|
1520
|
-
|
|
1521
1626
|
- A client makes some local changes and another client simultaneously makes a large number of changes in a single JavaScript turn.
|
|
1522
1627
|
For example, a client is typing into a canvas while another client pastes a large amount of content into a table.
|
|
1523
1628
|
- A client makes a local branch with some changes and rebases it into the trunk. For example, an AI agent makes changes
|
|
@@ -1538,7 +1643,6 @@ Dependency updates only.
|
|
|
1538
1643
|
Additionally an alpha `ObjectNodeSchema` object is added to enable support for `schema instanceof ObjectNodeSchema` to safely narrow `TreeNodeSchema` to this new type.
|
|
1539
1644
|
|
|
1540
1645
|
In support of this work, several typing details were fixed including:
|
|
1541
|
-
|
|
1542
1646
|
- `info` field of `[typeSchemaSymbol]` type brand on recursive object schema was specified to match non-recursive variants.
|
|
1543
1647
|
- Type of field metadata was correctly plumbed through `optionalReclusive` and `requiredRecursive`.
|
|
1544
1648
|
- When fields object provided to [SchemaFactory.object](https://fluidframework.com/docs/api/fluid-framework/schemafactory-class#object-method) is typed as `RestrictiveStringRecord<ImplicitFieldSchema>` the resulting [TreeObjectNode](https://fluidframework.com/docs/api/fluid-framework/treeobjectnode-typealias) no longer gets a `Record<string, TreeNode | TreeLeafValue>` signature which could incorrectly conflict with custom members added to the object. Instead `{}` is used to provide no information about felids on the type when the schema provides no information about them. Additionally this case is explicitly made non-constructable: the constructor takes in `never` instead of a `Record<string,never>` which could be erroneously satisfied with an empty object due to how TypeScript assignability rules consider records to have all allowed fields, but also allow objects missing those fields to be assigned to them.
|
|
@@ -1565,7 +1669,6 @@ Dependency updates only.
|
|
|
1565
1669
|
The various import and export [`VerboseTree`](https://fluidframework.com/docs/api/fluid-framework/verbosetree-typealias) and [`ConciseTree`](https://fluidframework.com/docs/api/fluid-framework/concisetree-typealias) APIs no longer include `valueConverter` options.
|
|
1566
1670
|
Instead the resulting tree can be further processed to do any desired replacements.
|
|
1567
1671
|
The following `@alpha` APIs have been added to assist with this:
|
|
1568
|
-
|
|
1569
1672
|
1. `cloneWithReplacements`
|
|
1570
1673
|
2. `replaceHandles`
|
|
1571
1674
|
3. `replaceConciseTreeHandles`
|
|
@@ -1616,7 +1719,6 @@ Dependency updates only.
|
|
|
1616
1719
|
For example, with 10 local ops + 10 incoming ops, the performance increases by 70%; with 100 local ops + 100 incoming ops, the performance increases by 94%.
|
|
1617
1720
|
|
|
1618
1721
|
This will help improve performance in the following scenarios:
|
|
1619
|
-
|
|
1620
1722
|
- A client makes a large number of changes in a single JS turn. For example, copy pasting large data like a table.
|
|
1621
1723
|
- A client has a large number of local changes. For example, slow clients whose changes are slow to ack or clients with
|
|
1622
1724
|
a local branch with large number of changes.
|
|
@@ -1693,7 +1795,6 @@ Dependency updates only.
|
|
|
1693
1795
|
These properties will not be used by the system by default, but can be used to associate common application-specific properties with Node Schema.
|
|
1694
1796
|
|
|
1695
1797
|
#### `SchemaFactoryAlpha` Updates
|
|
1696
|
-
|
|
1697
1798
|
- `object` and `objectRecursive`, `arrayRecursive`, and `mapRecursive` now support `metadata` in their `options` parameter.
|
|
1698
1799
|
- (new) `arrayAlpha` - Variant of `array` that accepts an options parameter which supports `metadata`
|
|
1699
1800
|
- (new) `mapAlpha` - Variant of `map` that accepts an options parameter which supports `metadata`
|
|
@@ -1746,7 +1847,6 @@ Dependency updates only.
|
|
|
1746
1847
|
One of these checks verifies that the view schema (defined in application's code) aligns with the document schema (determined by the document data at rest).
|
|
1747
1848
|
This helps to ensure that clients running incompatible versions of the application's code don't collaborate at the same time on some document, which could cause data loss or disrupt application invariants.
|
|
1748
1849
|
One general solution application authors can perform is to stage the rollout of a feature which changes document schema into multiple phases:
|
|
1749
|
-
|
|
1750
1850
|
1. Release an application version which understands documents written with the new format but doesn't attempt to upgrade any documents
|
|
1751
1851
|
2. Wait for this application version to saturate in the app's ecosystem
|
|
1752
1852
|
3. Release an application version which upgrades documents to start leveraging the new format.
|
|
@@ -1863,7 +1963,6 @@ Dependency updates only.
|
|
|
1863
1963
|
As part of ongoing improvements, several internal types and related APIs have been removed. These types are unnecessary for any supported scenarios and could lead to errors if used. Since directly using these types would likely result in errors, these changes are not likely to impact any Fluid Framework consumers.
|
|
1864
1964
|
|
|
1865
1965
|
Removed types:
|
|
1866
|
-
|
|
1867
1966
|
- IMergeTreeTextHelper
|
|
1868
1967
|
- MergeNode
|
|
1869
1968
|
- ObliterateInfo
|
|
@@ -1875,12 +1974,10 @@ Dependency updates only.
|
|
|
1875
1974
|
In addition to removing the above types, they are no longer exposed through the following interfaces and their implementations: `ISegment`, `ReferencePosition`, and `ISerializableInterval`.
|
|
1876
1975
|
|
|
1877
1976
|
Removed functions:
|
|
1878
|
-
|
|
1879
1977
|
- addProperties
|
|
1880
1978
|
- ack
|
|
1881
1979
|
|
|
1882
1980
|
Removed properties:
|
|
1883
|
-
|
|
1884
1981
|
- propertyManager
|
|
1885
1982
|
- segmentGroups
|
|
1886
1983
|
|
|
@@ -1963,7 +2060,6 @@ Dependency updates only.
|
|
|
1963
2060
|
An adjustment is a modification applied to a property value within a specified range. Adjustments can be used to increment or decrement property values dynamically. They are particularly useful in scenarios where property values need to be updated based on user interactions or other events. For example, in a rich text editor, adjustments can be used for modifying indentation levels or font sizes, where multiple users could apply differing numerical adjustments.
|
|
1964
2061
|
|
|
1965
2062
|
### Key Features and Use Cases:
|
|
1966
|
-
|
|
1967
2063
|
- **Adjustments with Constraints**: Adjustments can include optional minimum and maximum constraints to ensure the final value falls within specified bounds. This is particularly useful for maintaining consistent formatting in rich text editors.
|
|
1968
2064
|
- **Consistent Property Changes**: The feature ensures that property changes are consistent, managing both local and remote changes effectively. This is essential for collaborative rich text editing where multiple users may be making adjustments simultaneously.
|
|
1969
2065
|
- **Rich Text Formatting**: Adjustments can be used to modify text properties such as font size, indentation, or other formatting attributes dynamically based on user actions.
|
|
@@ -1985,7 +2081,6 @@ Dependency updates only.
|
|
|
1985
2081
|
The `Client` class in the merge-tree package has been removed. Types that directly or indirectly expose the merge-tree `Client` class have also been removed.
|
|
1986
2082
|
|
|
1987
2083
|
The removed types were not meant to be used directly, and direct usage was not supported:
|
|
1988
|
-
|
|
1989
2084
|
- AttributionPolicy
|
|
1990
2085
|
- IClientEvents
|
|
1991
2086
|
- IMergeTreeAttributionOptions
|
|
@@ -1993,7 +2088,6 @@ Dependency updates only.
|
|
|
1993
2088
|
- SharedStringClass
|
|
1994
2089
|
|
|
1995
2090
|
Some classes that referenced the `Client` class have been transitioned to interfaces. Direct instantiation of these classes was not supported or necessary for any supported scenario, so the change to an interface should not impact usage. This applies to the following types:
|
|
1996
|
-
|
|
1997
2091
|
- SequenceInterval
|
|
1998
2092
|
- SequenceEvent
|
|
1999
2093
|
- SequenceDeltaEvent
|
|
@@ -2018,7 +2112,6 @@ Dependency updates only.
|
|
|
2018
2112
|
`independentView` has also been added, which is similar but handles the case of creating a new view without an existing schema or tree.
|
|
2019
2113
|
|
|
2020
2114
|
Together these APIs address several use-cases:
|
|
2021
|
-
|
|
2022
2115
|
1. Using SharedTree as an in-memory non-collaborative datastore.
|
|
2023
2116
|
2. Importing and exporting data from a SharedTree to and from other services or storage locations (such as locally saved files).
|
|
2024
2117
|
3. Testing various scenarios without relying on a service.
|
|
@@ -2513,7 +2606,6 @@ Dependency updates only.
|
|
|
2513
2606
|
|
|
2514
2607
|
The `PropertyManager` class, along with the `propertyManager` properties and `addProperties` functions on segments and intervals, are not intended for external use.
|
|
2515
2608
|
These elements will be removed in a future release for the following reasons:
|
|
2516
|
-
|
|
2517
2609
|
- There are no scenarios where they need to be used directly.
|
|
2518
2610
|
- Using them directly will cause eventual consistency problems.
|
|
2519
2611
|
- Upcoming features will require modifications to these mechanisms.
|
|
@@ -2616,7 +2708,6 @@ Dependency updates only.
|
|
|
2616
2708
|
The runtime behavior is unaffected: any code which worked and still compiles is fine and does not need changes.
|
|
2617
2709
|
|
|
2618
2710
|
`Tree.schema` was changed to mitigate two different issues:
|
|
2619
|
-
|
|
2620
2711
|
1. It tried to give a more specific type based on the type of the passed in value.
|
|
2621
2712
|
When the type of the input is not known precisely (for example it is a union of node types like `Foo | Bar`, or `TreeNode` or even `TreeNode | TreeLeafValue`), this was fine since schema are covariant over their node type.
|
|
2622
2713
|
However when the input was more specific that the schema type, for example the type is simply `0`, this would result in unsound typing, since the create function could actually return values that did not conform with that schema (for example `schema.create(1)` for the number schema typed with `0` would return `1` with type `0`).
|
|
@@ -2743,7 +2834,6 @@ Dependency updates only.
|
|
|
2743
2834
|
```
|
|
2744
2835
|
|
|
2745
2836
|
Skipping the constructor causes the following problems:
|
|
2746
|
-
|
|
2747
2837
|
1. `TreeViewConfiguration` does validation in its constructor, so skipping it also skips the validation which leads to much less friendly error messages for invalid schema.
|
|
2748
2838
|
2. Skipping the constructor also discards any default values for options like `enableSchemaValidation`.
|
|
2749
2839
|
This means that code written in that style would break if more options were added. Since such changes are planned,
|
|
@@ -2778,7 +2868,6 @@ Dependency updates only.
|
|
|
2778
2868
|
already the case, but the documentation was not clear.
|
|
2779
2869
|
|
|
2780
2870
|
Updated APIs:
|
|
2781
|
-
|
|
2782
2871
|
- [IDirectory](https://fluidframework.com/docs/api/v2/fluid-framework/idirectory-interface) sealed
|
|
2783
2872
|
- [IDirectoryEvents](https://fluidframework.com/docs/api/v2/fluid-framework/idirectoryevents-interface) sealed
|
|
2784
2873
|
- [IDirectoryValueChanged](https://fluidframework.com/docs/api/v2/fluid-framework/idirectoryvaluechanged-interface) sealed and path property is readonly
|
|
@@ -2803,7 +2892,6 @@ Dependency updates only.
|
|
|
2803
2892
|
|
|
2804
2893
|
Several cases of invalid usage patterns for tree APIs have gained improved error reporting, as well as improved documentation on the APIs detailing what usage is supported.
|
|
2805
2894
|
These improvements include:
|
|
2806
|
-
|
|
2807
2895
|
- Unsupported usages of schema classes: using more than one schema class derived from a single SchemaFactory generated base class. This used to hit internal asserts, but now has a descriptive user-facing UsageError. Most of this work was done in [9fb3dcf](https://github.com/microsoft/FluidFramework/commit/9fb3dcf491a7f0d66f4abbdc64ab97ccabef4707).
|
|
2808
2896
|
- Improved detection of when prior exception may have left SharedTree in an invalid state.
|
|
2809
2897
|
These cases now report a UsageError including a reference to the prior exception. This was mainly done in [9fb3dcf](https://github.com/microsoft/FluidFramework/commit/9fb3dcf491a7f0d66f4abbdc64ab97ccabef4707) and [b77d530](https://github.com/microsoft/FluidFramework/commit/b77d530b9252201c40a90d1a2a6315f76f1a4a4b).
|
|
@@ -2822,7 +2910,6 @@ Dependency updates only.
|
|
|
2822
2910
|
|
|
2823
2911
|
Access to these now less public types should not be required for users of the `@public` "declarative API" exposed in the `fluid-framework` package, but can still be accessed for those who need them under the `/legacy` import paths.
|
|
2824
2912
|
The full list of such types is:
|
|
2825
|
-
|
|
2826
2913
|
- `SharedTree` as exported from `@fluidframwork/tree`: It is still exported as `@public` from `fluid-framework` as `SharedObjectKind`.
|
|
2827
2914
|
- `ISharedObjectKind`: See new `SharedObjectKind` type for use in `@public` APIs.
|
|
2828
2915
|
`ISharedObject`
|
|
@@ -2840,7 +2927,6 @@ Dependency updates only.
|
|
|
2840
2927
|
- `IProvideFluidHandleContext`
|
|
2841
2928
|
|
|
2842
2929
|
Removed APIs:
|
|
2843
|
-
|
|
2844
2930
|
- `DataObjectClass`: Usages replaced with `SharedObjectKind`.
|
|
2845
2931
|
- `LoadableObjectClass`: Replaced with `SharedObjectKind`.
|
|
2846
2932
|
- `LoadableObjectClassRecord`: Replaced with `Record<string, SharedObjectKind>`.
|
|
@@ -2864,7 +2950,6 @@ Dependency updates only.
|
|
|
2864
2950
|
- fluid-framework: Remove some types from `@public` that are not needed ([#21326](https://github.com/microsoft/FluidFramework/pull/21326)) [b629cb80b0](https://github.com/microsoft/FluidFramework/commit/b629cb80b0e5ecdc750270807f77a0e30fab4559)
|
|
2865
2951
|
|
|
2866
2952
|
Mark the following APIs `@alpha` instead of `@public`:
|
|
2867
|
-
|
|
2868
2953
|
- IBranchOrigin
|
|
2869
2954
|
- ISequencedDocumentMessage
|
|
2870
2955
|
- ISignalMessage
|
|
@@ -2879,7 +2964,6 @@ Dependency updates only.
|
|
|
2879
2964
|
- fluid-framework: Remove several types from `@public` scope ([#21142](https://github.com/microsoft/FluidFramework/pull/21142)) [983e9f09f7](https://github.com/microsoft/FluidFramework/commit/983e9f09f7b10fef9ffa1e9af86166f0ccda7e14)
|
|
2880
2965
|
|
|
2881
2966
|
The following types have been moved from `@public` to `@alpha`:
|
|
2882
|
-
|
|
2883
2967
|
- `IFluidSerializer`
|
|
2884
2968
|
- `ISharedObjectEvents`
|
|
2885
2969
|
- `IChannelServices`
|
|
@@ -2903,7 +2987,6 @@ Dependency updates only.
|
|
|
2903
2987
|
|
|
2904
2988
|
The stable public API surface for Tree has been reduced.
|
|
2905
2989
|
Several types have been moved into InternalTypes, indicating that they are not fully stable nor intended to be referenced by users of Tree.
|
|
2906
|
-
|
|
2907
2990
|
- NodeBuilderData
|
|
2908
2991
|
- FieldHasDefault
|
|
2909
2992
|
- TreeNodeSchemaNonClass
|
|
@@ -2930,7 +3013,6 @@ Dependency updates only.
|
|
|
2930
3013
|
- TreeApi
|
|
2931
3014
|
|
|
2932
3015
|
Additionally a few more types which could not be moved due to technically limitations have been documented that they should be treated similarly.
|
|
2933
|
-
|
|
2934
3016
|
- TreeNodeApi
|
|
2935
3017
|
- TreeNodeSchemaCore
|
|
2936
3018
|
- All \*Unsafe type (use for construction of recursive schema).
|
|
@@ -3006,7 +3088,6 @@ Dependency updates only.
|
|
|
3006
3088
|
- Make several driver types no longer public [b7ad7d0b55](https://github.com/microsoft/FluidFramework/commit/b7ad7d0b55884dd8954abf7c398e518838b9bda0)
|
|
3007
3089
|
|
|
3008
3090
|
Move the following types from `@public` to `@alpha`:
|
|
3009
|
-
|
|
3010
3091
|
- ITokenClaims
|
|
3011
3092
|
- IDocumentMessage
|
|
3012
3093
|
- IClientConfiguration
|
|
@@ -3017,7 +3098,6 @@ Dependency updates only.
|
|
|
3017
3098
|
`DriverErrorTypes` is no longer exported from the `fluid-framework` package.
|
|
3018
3099
|
|
|
3019
3100
|
- Rename `AzureMember.userName` to `AzureMember.name` and `IMember.userId` to `IMember.id` [96872186d0](https://github.com/microsoft/FluidFramework/commit/96872186d0d0f245c1fece7d19b3743e501679b6)
|
|
3020
|
-
|
|
3021
3101
|
1. Renamed `AzureMember.userName` to `AzureMember.name` to establish uniform naming across odsp-client and azure-client.
|
|
3022
3102
|
2. Renamed `IMember.userId` to `IMember.id` to align with the properties received from AFR.
|
|
3023
3103
|
|
|
@@ -3041,7 +3121,6 @@ Dependency updates only.
|
|
|
3041
3121
|
TypeScript types and implementation code.
|
|
3042
3122
|
|
|
3043
3123
|
This means that using Fluid Framework packages require the following TypeScript settings in tsconfig.json:
|
|
3044
|
-
|
|
3045
3124
|
- `"moduleResolution": "Node16"` with `"module": "Node16"`
|
|
3046
3125
|
- `"moduleResolution": "Bundler"` with `"module": "ESNext"`
|
|
3047
3126
|
|
|
@@ -3105,7 +3184,7 @@ Dependency updates only.
|
|
|
3105
3184
|
become build errors. The fix is to use only public APIs from @fluidframework/foo.
|
|
3106
3185
|
|
|
3107
3186
|
**Coming soon:** Build resolutions (`moduleResolution` in tsconfig compilerOptions) will need to be resolved with
|
|
3108
|
-
Node16, NodeNext, or a bundler that supports resolution of named import/export paths. Internally, some FF packages will
|
|
3187
|
+
Node16, NodeNext, or a bundler that supports resolution of named import-x/export paths. Internally, some FF packages will
|
|
3109
3188
|
use `@fluidframework/foo/internal` import paths that allow packages to talk to each other using non-public APIs.
|
|
3110
3189
|
|
|
3111
3190
|
**Final stage:** APIs that are not tagged @public will be removed from @fluidframework/foo imports.
|
|
@@ -3148,7 +3227,6 @@ Dependency updates only.
|
|
|
3148
3227
|
Several FluidStatic classes were unnecessarily exposed and were deprecated in an earlier release. They have been replaced with creation functions. This helps us
|
|
3149
3228
|
keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the
|
|
3150
3229
|
public surface area of downstream packages. The removed classes are as follows:
|
|
3151
|
-
|
|
3152
3230
|
- `AzureAudience` (use `IAzureAudience` instead)
|
|
3153
3231
|
- `TinyliciousAudience` (use `ITinyliciousAudience` instead)
|
|
3154
3232
|
- `DOProviderContainerRuntimeFactory`
|
|
@@ -3164,7 +3242,6 @@ Dependency updates only.
|
|
|
3164
3242
|
Several FluidStatic classes were unnecessarily exposed. They have been replaced with creation functions. This helps us
|
|
3165
3243
|
keep implementations decoupled from usage which is easier to maintain and extend. It has very minimal impact on the
|
|
3166
3244
|
public surface area of downstream packages. The deprecated classes are as follows:
|
|
3167
|
-
|
|
3168
3245
|
- `AzureAudience` (use `IAzureAudience` instead)
|
|
3169
3246
|
- `TinyliciousAudience` (use `ITinyliciousAudience` instead)
|
|
3170
3247
|
- `DOProviderContainerRuntimeFactory`
|