fluid-framework 2.43.0 → 2.50.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 CHANGED
@@ -1,5 +1,105 @@
1
1
  # fluid-framework
2
2
 
3
+ ## 2.50.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Record node kind was added (alpha) ([#24908](https://github.com/microsoft/FluidFramework/pull/24908)) [b25667bcdc](https://github.com/microsoft/FluidFramework/commit/b25667bcdcad5584f35783f6a32270803b6dfb1c)
8
+
9
+ Adds a new kind of node to SharedTree that models a TypeScript record.
10
+ As is the case with map nodes, record nodes only support string keys.
11
+
12
+ ```typescript
13
+ class MyRecord extends schemaFactory.record("my-record", [
14
+ schemaFactory.number,
15
+ schemaFactory.string,
16
+ ]) {}
17
+ const myRecord = new MyRecord({
18
+ foo: 42,
19
+ bar: "Hello world!",
20
+ });
21
+
22
+ const foo = myRecord.foo; // 42
23
+
24
+ delete myRecord.foo;
25
+
26
+ myRecord.baz = 37;
27
+
28
+ const keys = Object.keys(myRecord); // ["bar", "baz"]
29
+ const values = Object.values(myRecord); // ["Hello world!", 37]
30
+ const entries = Object.entries(myRecord); // [["bar", "Hello world!"], ["baz", 37]]
31
+ ```
32
+
33
+ #### `NodeKind` enum update
34
+
35
+ This change includes the addition of a new flag to the [NodeKind](https://fluidframework.com/docs/api/fluid-framework/nodekind-enum) enum.
36
+ This API notes in its documentation that users should not treat its flags as an exhaustive set.
37
+
38
+ This change may break code that treats it that way.
39
+ We recommend updating your code to be more tolerant of unknown node kinds going forward.
40
+
41
+ Also see alternative options for schema-agnostic tree traversal if needed:
42
+
43
+ - [Tree.parent](https://fluidframework.com/docs/api/fluid-framework/treenodeapi-interface#parent-methodsignature)
44
+ - [TreeAlpha.child](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#child-methodsignature)
45
+ - [TreeAlpha.children](https://fluidframework.com/docs/api/fluid-framework/treealpha-interface#children-methodsignature)
46
+
47
+ #### Additional features
48
+
49
+ In addition to the operations afforded by TypeScript records, SharedTree record nodes can be iterated (equivalent to Object.entries).
50
+
51
+ ```typescript
52
+ class MyRecord extends schemaFactory.record("my-record", [schemaFactory.number, schemaFactory.string]) {}
53
+ const myRecord = new MyRecord({
54
+ foo: 42,
55
+ bar: "Hello world!"
56
+ });
57
+
58
+ for (const [key, value] of myRecord) {
59
+ ...
60
+ }
61
+
62
+ const a = { ...myRecord }; // { foo: 42, bar: "Hello world!" }
63
+ const b = [...myRecord]; // [["foo", 42], ["bar, "Hello world!"]]
64
+ ```
65
+
66
+ #### Recursive records
67
+
68
+ Recursive record schema can be defined using `recordRecursive` on [SchemaFactoryAlpha](https://fluidframework.com/docs/api/fluid-framework/schemafactoryalpha-class).
69
+
70
+ ```typescript
71
+ class MyRecord extends schemaFactory.recordRecursive("my-record", [
72
+ schemaFactory.string,
73
+ () => MyRecord,
74
+ ]) {}
75
+ const myRecord = new MyRecord({
76
+ foo: "Hello world!",
77
+ bar: new MyRecord({
78
+ x: "foo",
79
+ y: new MyRecord({}),
80
+ }),
81
+ });
82
+ ```
83
+
84
+ #### TableSchema update (alpha)
85
+
86
+ The [TableSchema](https://fluidframework.com/docs/api/fluid-framework/tableschema-namespace/) APIs have been updated to use record nodes in the schema they generate.
87
+ Specifically, the `Row` representation now uses a record to store its column-cell pairs, rather than a map.
88
+
89
+ The node types derived from these APIs model their data in a row-major format.
90
+ That is, each row in the table contains the set of cells that belong to that row, where each cell is indexed by its corresponding column.
91
+
92
+ Previously, this was modeled using a [MapNode](https://fluidframework.com/docs/api/fluid-framework/treemapnode-interface).
93
+ This format proved cumbersome to interop with popular table rendering libraries like [tanstack](https://tanstack.com/table), which expect a record-like format.
94
+
95
+ The persisted format of documents containing trees derived from these APIs is the same, so this change is forward and backward compatible.
96
+
97
+ #### JsonDomainSchema update (alpha)
98
+
99
+ [JsonObject](https://fluidframework.com/docs/api/fluid-framework/jsonastree-namespace/jsonobject-class) has been updated to a record rather than a map.
100
+
101
+ The persisted format of documents containing trees derived from these APIs is the same, so this change is forward and backward compatible.
102
+
3
103
  ## 2.43.0
4
104
 
5
105
  ### Minor Changes
@@ -768,9 +768,7 @@ export namespace JsonAsTree {
768
768
  export class JsonObject extends _APIExtractorWorkaroundObjectBase {
769
769
  }
770
770
  const // @system
771
- _APIExtractorWorkaroundObjectBase: TreeNodeSchemaClass<"com.fluidframework.json.object", NodeKind.Map, System_Unsafe.TreeMapNodeUnsafe<readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array]> & WithType<"com.fluidframework.json.object", NodeKind.Map, unknown>, {
772
- [Symbol.iterator](): Iterator<[string, string | number | JsonObject | Array | System_Unsafe.InsertableTypedNodeUnsafe<LeafSchema<"boolean", boolean>, LeafSchema<"boolean", boolean>> | null], any, undefined>;
773
- } | {
771
+ _APIExtractorWorkaroundObjectBase: TreeNodeSchemaClass<"com.fluidframework.json.object", NodeKind.Record, TreeRecordNodeUnsafe_2<readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array]> & WithType<"com.fluidframework.json.object", NodeKind.Record, unknown>, {
774
772
  readonly [x: string]: string | number | JsonObject | Array | System_Unsafe.InsertableTypedNodeUnsafe<LeafSchema<"boolean", boolean>, LeafSchema<"boolean", boolean>> | null;
775
773
  }, false, readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array], undefined>;
776
774
  // (undocumented)
@@ -778,9 +776,7 @@ export namespace JsonAsTree {
778
776
  // @system
779
777
  export type _RecursiveArrayWorkaroundJsonArray = FixRecursiveArraySchema<typeof Array>;
780
778
  const // @system
781
- _APIExtractorWorkaroundArrayBase: TreeNodeSchemaClass<"com.fluidframework.json.array", NodeKind.Array, System_Unsafe.TreeArrayNodeUnsafe<readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array]> & WithType<"com.fluidframework.json.array", NodeKind.Array, unknown>, {
782
- [Symbol.iterator](): Iterator<string | number | JsonObject | Array | System_Unsafe.InsertableTypedNodeUnsafe<LeafSchema<"boolean", boolean>, LeafSchema<"boolean", boolean>> | null, any, undefined>;
783
- }, false, readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array], undefined>;
779
+ _APIExtractorWorkaroundArrayBase: ArrayNodeCustomizableSchemaUnsafe_2<"com.fluidframework.json.array", readonly [LeafSchema<"null", null>, LeafSchema<"number", number>, LeafSchema<"string", string>, LeafSchema<"boolean", boolean>, () => typeof JsonObject, () => typeof Array], unknown>;
784
780
  // (undocumented)
785
781
  export type Tree = TreeNodeFromImplicitAllowedTypes<typeof Tree>;
786
782
  }
@@ -818,13 +814,11 @@ export type JsonLeafSchemaType = "string" | "number" | "boolean" | "null";
818
814
 
819
815
  // @alpha @sealed
820
816
  export interface JsonMapNodeSchema extends JsonNodeSchemaBase<NodeKind.Map, "object"> {
821
- readonly patternProperties: {
822
- "^.*$": JsonFieldSchema;
823
- };
817
+ readonly patternProperties: JsonStringKeyPatternProperties;
824
818
  }
825
819
 
826
820
  // @alpha
827
- export type JsonNodeSchema = JsonLeafNodeSchema | JsonMapNodeSchema | JsonArrayNodeSchema | JsonObjectNodeSchema;
821
+ export type JsonNodeSchema = JsonLeafNodeSchema | JsonMapNodeSchema | JsonArrayNodeSchema | JsonObjectNodeSchema | JsonRecordNodeSchema;
828
822
 
829
823
  // @alpha @sealed
830
824
  export interface JsonNodeSchemaBase<TNodeKind extends NodeKind, TJsonSchemaType extends JsonSchemaType> {
@@ -840,6 +834,11 @@ export interface JsonObjectNodeSchema extends JsonNodeSchemaBase<NodeKind.Object
840
834
  readonly required?: string[];
841
835
  }
842
836
 
837
+ // @alpha @sealed
838
+ export interface JsonRecordNodeSchema extends JsonNodeSchemaBase<NodeKind.Record, "object"> {
839
+ readonly patternProperties: JsonStringKeyPatternProperties;
840
+ }
841
+
843
842
  // @alpha
844
843
  export type JsonRefPath = `#/$defs/${JsonSchemaId}`;
845
844
 
@@ -854,6 +853,11 @@ export interface JsonSchemaRef {
854
853
  // @alpha
855
854
  export type JsonSchemaType = "object" | "array" | JsonLeafSchemaType;
856
855
 
856
+ // @alpha @sealed
857
+ export interface JsonStringKeyPatternProperties {
858
+ "^.*$": JsonFieldSchema;
859
+ }
860
+
857
861
  // @alpha @sealed
858
862
  export type JsonTreeSchema = JsonFieldSchema & {
859
863
  readonly $defs: Record<JsonSchemaId, JsonNodeSchema>;
@@ -948,7 +952,8 @@ export enum NodeKind {
948
952
  Array = 1,
949
953
  Leaf = 3,
950
954
  Map = 0,
951
- Object = 2
955
+ Object = 2,
956
+ Record = 4
952
957
  }
953
958
 
954
959
  // @public @sealed
@@ -1015,6 +1020,25 @@ export type ReadSchema<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema
1015
1020
  TSchema
1016
1021
  ] extends [ImplicitFieldSchema] ? TSchema : ImplicitFieldSchema;
1017
1022
 
1023
+ // @alpha @sealed @system
1024
+ export interface RecordNodeCustomizableSchema<out TName extends string = string, in out T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes, out ImplicitlyConstructable extends boolean = true, out TCustomMetadata = unknown> extends TreeNodeSchemaClass<TName, NodeKind.Record, TreeRecordNode<UnannotateImplicitAllowedTypes<T>> & WithType<TName, NodeKind.Record, T>, RecordNodeInsertableData<UnannotateImplicitAllowedTypes<T>>, ImplicitlyConstructable, T, never, TCustomMetadata>, SimpleRecordNodeSchema<TCustomMetadata> {
1025
+ }
1026
+
1027
+ // @alpha @system
1028
+ export type RecordNodeInsertableData<T extends ImplicitAllowedTypes> = RestrictiveStringRecord<InsertableTreeNodeFromImplicitAllowedTypes<T>>;
1029
+
1030
+ // @alpha @sealed @system
1031
+ export interface RecordNodePojoEmulationSchema<out TName extends string = string, in out T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes, out ImplicitlyConstructable extends boolean = true, out TCustomMetadata = unknown> extends TreeNodeSchemaNonClass<TName, NodeKind.Record, TreeRecordNode<UnannotateImplicitAllowedTypes<T>> & WithType<TName, NodeKind.Record, T>, RecordNodeInsertableData<UnannotateImplicitAllowedTypes<T>>, ImplicitlyConstructable, T, never, TCustomMetadata>, SimpleRecordNodeSchema<TCustomMetadata> {
1032
+ }
1033
+
1034
+ // @alpha
1035
+ export type RecordNodeSchema<TName extends string = string, T extends ImplicitAnnotatedAllowedTypes = ImplicitAnnotatedAllowedTypes, ImplicitlyConstructable extends boolean = true, TCustomMetadata = unknown> = RecordNodeCustomizableSchema<TName, T, ImplicitlyConstructable, TCustomMetadata> | RecordNodePojoEmulationSchema<TName, T, ImplicitlyConstructable, TCustomMetadata>;
1036
+
1037
+ // @alpha (undocumented)
1038
+ export const RecordNodeSchema: {
1039
+ readonly [Symbol.hasInstance]: (value: TreeNodeSchema) => value is RecordNodeSchema<string, ImplicitAnnotatedAllowedTypes, true, unknown>;
1040
+ };
1041
+
1018
1042
  // @alpha
1019
1043
  export function replaceConciseTreeHandles<T>(tree: ConciseTree, replacer: HandleConverter<T>): ConciseTree<T>;
1020
1044
 
@@ -1110,6 +1134,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
1110
1134
  }, false, T, undefined>;
1111
1135
  readonly boolean: LeafSchema<"boolean", boolean>;
1112
1136
  static readonly boolean: LeafSchema<"boolean", boolean>;
1137
+ protected getStructuralType(fullName: string, types: TreeNodeSchema | readonly TreeNodeSchema[], builder: () => TreeNodeSchema): TreeNodeSchema;
1113
1138
  readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
1114
1139
  static readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
1115
1140
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
@@ -1167,6 +1192,12 @@ export class SchemaFactoryAlpha<out TScope extends string | undefined = string |
1167
1192
  };
1168
1193
  static readonly optionalRecursive: <const T extends System_Unsafe.ImplicitAllowedTypesUnsafe, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha_2<TCustomMetadata>, "defaultProvider"> | undefined) => FieldSchemaAlphaUnsafe_2<FieldKind_2.Optional, T, TCustomMetadata>;
1169
1194
  readonly optionalRecursive: <const T extends System_Unsafe.ImplicitAllowedTypesUnsafe, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha_2<TCustomMetadata>, "defaultProvider"> | undefined) => FieldSchemaAlphaUnsafe_2<FieldKind_2.Optional, T, TCustomMetadata>;
1195
+ record<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchemaNonClass<ScopedSchemaName<TScope, `Record<${string}>`>, NodeKind.Record, TreeRecordNode<T> & WithType<ScopedSchemaName<TScope, `Record<${string}>`>, NodeKind.Record>, RecordNodeInsertableData<T>, true, T, undefined>;
1196
+ record<const Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Record, TreeRecordNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record>, RecordNodeInsertableData<T>, true, T, undefined>;
1197
+ recordAlpha<const Name extends TName, const T extends ImplicitAnnotatedAllowedTypes, const TCustomMetadata = unknown>(name: Name, allowedTypes: T, options?: NodeSchemaOptionsAlpha<TCustomMetadata>): RecordNodeCustomizableSchema<ScopedSchemaName<TScope, Name>, T, true, TCustomMetadata>;
1198
+ recordRecursive<Name extends TName, const T extends System_Unsafe.ImplicitAllowedTypesUnsafe>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Record, TreeRecordNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Record, unknown>, {
1199
+ readonly [x: string]: System_Unsafe.InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>;
1200
+ }, false, T, undefined>;
1170
1201
  static readonly required: {
1171
1202
  <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldPropsAlpha_2<TCustomMetadata>, "defaultProvider"> | undefined): FieldSchemaAlpha_2<FieldKind_2.Required, T, TCustomMetadata>;
1172
1203
  <const T_1 extends ImplicitAnnotatedAllowedTypes, const TCustomMetadata_1 = unknown>(t: T_1, props?: Omit<FieldPropsAlpha_2<TCustomMetadata_1>, "defaultProvider"> | undefined): FieldSchemaAlpha_2<FieldKind_2.Required, UnannotateImplicitAllowedTypes_2<T_1>, TCustomMetadata_1>;
@@ -1265,7 +1296,7 @@ export interface SimpleMapNodeSchema<out TCustomMetadata = unknown> extends Simp
1265
1296
  }
1266
1297
 
1267
1298
  // @alpha
1268
- export type SimpleNodeSchema = SimpleLeafNodeSchema | SimpleMapNodeSchema | SimpleArrayNodeSchema | SimpleObjectNodeSchema;
1299
+ export type SimpleNodeSchema = SimpleLeafNodeSchema | SimpleMapNodeSchema | SimpleArrayNodeSchema | SimpleObjectNodeSchema | SimpleRecordNodeSchema;
1269
1300
 
1270
1301
  // @public @sealed @system
1271
1302
  export interface SimpleNodeSchemaBase<out TNodeKind extends NodeKind, out TCustomMetadata = unknown> {
@@ -1288,6 +1319,11 @@ export interface SimpleObjectNodeSchema<out TCustomMetadata = unknown> extends S
1288
1319
  readonly fields: ReadonlyMap<string, SimpleObjectFieldSchema>;
1289
1320
  }
1290
1321
 
1322
+ // @alpha @sealed
1323
+ export interface SimpleRecordNodeSchema<out TCustomMetadata = unknown> extends SimpleNodeSchemaBaseAlpha<NodeKind.Record, TCustomMetadata> {
1324
+ readonly allowedTypesIdentifiers: ReadonlySet<string>;
1325
+ }
1326
+
1291
1327
  // @alpha
1292
1328
  export type SimpleTreeIndex<TKey extends TreeIndexKey, TValue> = TreeIndex<TKey, TValue>;
1293
1329
 
@@ -1324,7 +1360,7 @@ export namespace System_TableSchema {
1324
1360
  // @sealed
1325
1361
  export function createRowSchema<const TInputScope extends string | undefined, const TCellSchema extends ImplicitAllowedTypes, const TPropsSchema extends ImplicitAnnotatedFieldSchema>(inputSchemaFactory: SchemaFactoryAlpha<TInputScope>, cellSchema: TCellSchema, propsSchema: TPropsSchema): TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row">, NodeKind.Object, TreeNode & TableSchema.Row<TCellSchema, TPropsSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row">, NodeKind, unknown>, object & {
1326
1362
  readonly id?: string | undefined;
1327
- readonly cells: (InsertableTypedNode_2<TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, TreeMapNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, unknown>, MapNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, TreeNodeSchemaCore_2<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, true, TCellSchema, MapNodeInsertableData_2<TCellSchema>, unknown> & (new (data?: InternalTreeNode | MapNodeInsertableData_2<TCellSchema> | undefined) => TreeMapNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, unknown>)> | undefined) & InsertableTypedNode_2<TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, TreeMapNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, unknown>, MapNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, TreeNodeSchemaCore_2<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, true, TCellSchema, MapNodeInsertableData_2<TCellSchema>, unknown> & (new (data?: InternalTreeNode | MapNodeInsertableData_2<TCellSchema> | undefined) => TreeMapNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, unknown>)>;
1363
+ readonly cells: (InsertableTypedNode_2<TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, TreeRecordNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, unknown>, RecordNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, TreeNodeSchemaCore_2<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, true, TCellSchema, RecordNodeInsertableData_2<TCellSchema>, unknown> & (new (data?: InternalTreeNode | RecordNodeInsertableData_2<TCellSchema> | undefined) => TreeRecordNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, unknown>)> | undefined) & InsertableTypedNode_2<TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, TreeRecordNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, unknown>, RecordNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, TreeNodeSchemaCore_2<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, true, TCellSchema, RecordNodeInsertableData_2<TCellSchema>, unknown> & (new (data?: InternalTreeNode | RecordNodeInsertableData_2<TCellSchema> | undefined) => TreeRecordNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, unknown>)>;
1328
1364
  } & (FieldHasDefault<UnannotateImplicitFieldSchema<TPropsSchema>> extends true ? {
1329
1365
  props?: InsertableTreeFieldFromImplicitField<UnannotateImplicitFieldSchema<TPropsSchema>> | undefined;
1330
1366
  } : {
@@ -1332,7 +1368,7 @@ export namespace System_TableSchema {
1332
1368
  }), true, {
1333
1369
  readonly props: TPropsSchema;
1334
1370
  readonly id: FieldSchema_2<FieldKind_3.Identifier, LeafSchema_3<"string", string>, unknown>;
1335
- readonly cells: FieldSchemaAlpha_3<FieldKind_3.Required, TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, TreeMapNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Map, unknown>, MapNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, unknown>;
1371
+ readonly cells: FieldSchemaAlpha_3<FieldKind_3.Required, TreeNodeSchemaClass<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, TreeRecordNode_2<TCellSchema> & WithType<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Row.cells">, NodeKind.Record, unknown>, RecordNodeInsertableData_2<TCellSchema>, true, TCellSchema, undefined>, unknown>;
1336
1372
  }>;
1337
1373
  // @system
1338
1374
  export function createTableSchema<const TInputScope extends string | undefined, const TCellSchema extends ImplicitAllowedTypes, const TColumnSchema extends ColumnSchemaBase<TInputScope, TCellSchema>, const TRowSchema extends RowSchemaBase<TInputScope, TCellSchema>>(inputSchemaFactory: SchemaFactoryAlpha<TInputScope>, _cellSchema: TCellSchema, columnSchema: TColumnSchema, rowSchema: TRowSchema): TreeNodeSchemaCore_2<ScopedSchemaName<ScopedSchemaName<TInputScope, "table">, "Table">, NodeKind.Object, true, {
@@ -1690,7 +1726,7 @@ export interface TreeChangeEvents {
1690
1726
 
1691
1727
  // @beta @sealed
1692
1728
  export interface TreeChangeEventsBeta<TNode extends TreeNode = TreeNode> extends TreeChangeEvents {
1693
- nodeChanged: (data: NodeChangedData<TNode> & (TNode extends WithType<string, NodeKind.Map | NodeKind.Object> ? Required<Pick<NodeChangedData<TNode>, "changedProperties">> : unknown)) => void;
1729
+ nodeChanged: (data: NodeChangedData<TNode> & (TNode extends WithType<string, NodeKind.Map | NodeKind.Object | NodeKind.Record> ? Required<Pick<NodeChangedData<TNode>, "changedProperties">> : unknown)) => void;
1694
1730
  }
1695
1731
 
1696
1732
  // @alpha
@@ -1795,6 +1831,23 @@ export type TreeNodeSchemaNonClass<Name extends string = string, Kind extends No
1795
1831
  // @public
1796
1832
  export type TreeObjectNode<T extends RestrictiveStringRecord<ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName, NodeKind.Object, T>;
1797
1833
 
1834
+ // @alpha
1835
+ export interface TreeRecordNode<TAllowedTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes> extends TreeNode, Record<string, TreeNodeFromImplicitAllowedTypes<TAllowedTypes>> {
1836
+ [Symbol.iterator](): IterableIterator<[
1837
+ string,
1838
+ TreeNodeFromImplicitAllowedTypes<TAllowedTypes>
1839
+ ]>;
1840
+ }
1841
+
1842
+ // @alpha @sealed @system
1843
+ export interface TreeRecordNodeUnsafe<TAllowedTypes extends System_Unsafe.ImplicitAllowedTypesUnsafe> extends Record<string, System_Unsafe.TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>>, TreeNode {
1844
+ // (undocumented)
1845
+ [Symbol.iterator](): IterableIterator<[
1846
+ string,
1847
+ System_Unsafe.TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>
1848
+ ]>;
1849
+ }
1850
+
1798
1851
  // @alpha @sealed (undocumented)
1799
1852
  export interface TreeSchema extends SimpleTreeSchema {
1800
1853
  readonly definitions: ReadonlyMap<string, SimpleNodeSchema & TreeNodeSchema>;
@@ -1921,15 +1974,19 @@ export type UnsafeUnknownSchema = typeof UnsafeUnknownSchema;
1921
1974
  export type ValidateRecursiveSchema<T extends ValidateRecursiveSchemaTemplate<T>> = true;
1922
1975
 
1923
1976
  // @public @system
1924
- export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1977
+ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record, TreeNode & WithType<T["identifier"], T["kind"]>, {
1925
1978
  [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1926
1979
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1927
1980
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1981
+ [NodeKind.Record]: {
1982
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
1983
+ };
1928
1984
  [NodeKind.Leaf]: unknown;
1929
1985
  }[T["kind"]], false, {
1930
1986
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1931
1987
  [NodeKind.Array]: ImplicitAllowedTypes;
1932
1988
  [NodeKind.Map]: ImplicitAllowedTypes;
1989
+ [NodeKind.Record]: ImplicitAllowedTypes;
1933
1990
  [NodeKind.Leaf]: unknown;
1934
1991
  }[T["kind"]]>;
1935
1992
 
@@ -591,7 +591,8 @@ export enum NodeKind {
591
591
  Array = 1,
592
592
  Leaf = 3,
593
593
  Map = 0,
594
- Object = 2
594
+ Object = 2,
595
+ Record = 4
595
596
  }
596
597
 
597
598
  // @public @sealed
@@ -693,6 +694,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
693
694
  }, false, T, undefined>;
694
695
  readonly boolean: LeafSchema<"boolean", boolean>;
695
696
  static readonly boolean: LeafSchema<"boolean", boolean>;
697
+ protected getStructuralType(fullName: string, types: TreeNodeSchema | readonly TreeNodeSchema[], builder: () => TreeNodeSchema): TreeNodeSchema;
696
698
  readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
697
699
  static readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
698
700
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
@@ -922,7 +924,7 @@ export interface TreeChangeEvents {
922
924
 
923
925
  // @beta @sealed
924
926
  export interface TreeChangeEventsBeta<TNode extends TreeNode = TreeNode> extends TreeChangeEvents {
925
- nodeChanged: (data: NodeChangedData<TNode> & (TNode extends WithType<string, NodeKind.Map | NodeKind.Object> ? Required<Pick<NodeChangedData<TNode>, "changedProperties">> : unknown)) => void;
927
+ nodeChanged: (data: NodeChangedData<TNode> & (TNode extends WithType<string, NodeKind.Map | NodeKind.Object | NodeKind.Record> ? Required<Pick<NodeChangedData<TNode>, "changedProperties">> : unknown)) => void;
926
928
  }
927
929
 
928
930
  // @public
@@ -1055,15 +1057,19 @@ export type UnionToTuple<Union, A extends unknown[] = [], First = PopUnion<Union
1055
1057
  export type ValidateRecursiveSchema<T extends ValidateRecursiveSchemaTemplate<T>> = true;
1056
1058
 
1057
1059
  // @public @system
1058
- export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1060
+ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record, TreeNode & WithType<T["identifier"], T["kind"]>, {
1059
1061
  [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1060
1062
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1061
1063
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1064
+ [NodeKind.Record]: {
1065
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
1066
+ };
1062
1067
  [NodeKind.Leaf]: unknown;
1063
1068
  }[T["kind"]], false, {
1064
1069
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1065
1070
  [NodeKind.Array]: ImplicitAllowedTypes;
1066
1071
  [NodeKind.Map]: ImplicitAllowedTypes;
1072
+ [NodeKind.Record]: ImplicitAllowedTypes;
1067
1073
  [NodeKind.Leaf]: unknown;
1068
1074
  }[T["kind"]]>;
1069
1075
 
@@ -856,7 +856,8 @@ export enum NodeKind {
856
856
  Array = 1,
857
857
  Leaf = 3,
858
858
  Map = 0,
859
- Object = 2
859
+ Object = 2,
860
+ Record = 4
860
861
  }
861
862
 
862
863
  // @public @sealed
@@ -955,6 +956,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
955
956
  }, false, T, undefined>;
956
957
  readonly boolean: LeafSchema<"boolean", boolean>;
957
958
  static readonly boolean: LeafSchema<"boolean", boolean>;
959
+ protected getStructuralType(fullName: string, types: TreeNodeSchema | readonly TreeNodeSchema[], builder: () => TreeNodeSchema): TreeNodeSchema;
958
960
  readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
959
961
  static readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
960
962
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
@@ -1385,15 +1387,19 @@ export type UnionToIntersection<T> = (T extends T ? (k: T) => unknown : never) e
1385
1387
  export type ValidateRecursiveSchema<T extends ValidateRecursiveSchemaTemplate<T>> = true;
1386
1388
 
1387
1389
  // @public @system
1388
- export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1390
+ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record, TreeNode & WithType<T["identifier"], T["kind"]>, {
1389
1391
  [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1390
1392
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1391
1393
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1394
+ [NodeKind.Record]: {
1395
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
1396
+ };
1392
1397
  [NodeKind.Leaf]: unknown;
1393
1398
  }[T["kind"]], false, {
1394
1399
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1395
1400
  [NodeKind.Array]: ImplicitAllowedTypes;
1396
1401
  [NodeKind.Map]: ImplicitAllowedTypes;
1402
+ [NodeKind.Record]: ImplicitAllowedTypes;
1397
1403
  [NodeKind.Leaf]: unknown;
1398
1404
  }[T["kind"]]>;
1399
1405
 
@@ -598,7 +598,8 @@ export enum NodeKind {
598
598
  Array = 1,
599
599
  Leaf = 3,
600
600
  Map = 0,
601
- Object = 2
601
+ Object = 2,
602
+ Record = 4
602
603
  }
603
604
 
604
605
  // @public @sealed
@@ -697,6 +698,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
697
698
  }, false, T, undefined>;
698
699
  readonly boolean: LeafSchema<"boolean", boolean>;
699
700
  static readonly boolean: LeafSchema<"boolean", boolean>;
701
+ protected getStructuralType(fullName: string, types: TreeNodeSchema | readonly TreeNodeSchema[], builder: () => TreeNodeSchema): TreeNodeSchema;
700
702
  readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
701
703
  static readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
702
704
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
@@ -1037,15 +1039,19 @@ export type UnionToIntersection<T> = (T extends T ? (k: T) => unknown : never) e
1037
1039
  export type ValidateRecursiveSchema<T extends ValidateRecursiveSchemaTemplate<T>> = true;
1038
1040
 
1039
1041
  // @public @system
1040
- export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1042
+ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record, TreeNode & WithType<T["identifier"], T["kind"]>, {
1041
1043
  [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1042
1044
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1043
1045
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1046
+ [NodeKind.Record]: {
1047
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
1048
+ };
1044
1049
  [NodeKind.Leaf]: unknown;
1045
1050
  }[T["kind"]], false, {
1046
1051
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1047
1052
  [NodeKind.Array]: ImplicitAllowedTypes;
1048
1053
  [NodeKind.Map]: ImplicitAllowedTypes;
1054
+ [NodeKind.Record]: ImplicitAllowedTypes;
1049
1055
  [NodeKind.Leaf]: unknown;
1050
1056
  }[T["kind"]]>;
1051
1057
 
@@ -564,7 +564,8 @@ export enum NodeKind {
564
564
  Array = 1,
565
565
  Leaf = 3,
566
566
  Map = 0,
567
- Object = 2
567
+ Object = 2,
568
+ Record = 4
568
569
  }
569
570
 
570
571
  // @public @sealed
@@ -663,6 +664,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
663
664
  }, false, T, undefined>;
664
665
  readonly boolean: LeafSchema<"boolean", boolean>;
665
666
  static readonly boolean: LeafSchema<"boolean", boolean>;
667
+ protected getStructuralType(fullName: string, types: TreeNodeSchema | readonly TreeNodeSchema[], builder: () => TreeNodeSchema): TreeNodeSchema;
666
668
  readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
667
669
  static readonly handle: LeafSchema<"handle", IFluidHandle<unknown>>;
668
670
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
@@ -1003,15 +1005,19 @@ export type UnionToIntersection<T> = (T extends T ? (k: T) => unknown : never) e
1003
1005
  export type ValidateRecursiveSchema<T extends ValidateRecursiveSchemaTemplate<T>> = true;
1004
1006
 
1005
1007
  // @public @system
1006
- export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1008
+ export type ValidateRecursiveSchemaTemplate<T extends TreeNodeSchema> = TreeNodeSchema<string, NodeKind.Array | NodeKind.Map | NodeKind.Object | NodeKind.Record, TreeNode & WithType<T["identifier"], T["kind"]>, {
1007
1009
  [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1008
1010
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1009
1011
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1012
+ [NodeKind.Record]: {
1013
+ readonly [P in string]: InsertableTreeNodeFromImplicitAllowedTypes<T>;
1014
+ };
1010
1015
  [NodeKind.Leaf]: unknown;
1011
1016
  }[T["kind"]], false, {
1012
1017
  [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1013
1018
  [NodeKind.Array]: ImplicitAllowedTypes;
1014
1019
  [NodeKind.Map]: ImplicitAllowedTypes;
1020
+ [NodeKind.Record]: ImplicitAllowedTypes;
1015
1021
  [NodeKind.Leaf]: unknown;
1016
1022
  }[T["kind"]]>;
1017
1023
 
package/dist/alpha.d.ts CHANGED
@@ -189,10 +189,12 @@ export {
189
189
  JsonNodeSchema,
190
190
  JsonNodeSchemaBase,
191
191
  JsonObjectNodeSchema,
192
+ JsonRecordNodeSchema,
192
193
  JsonRefPath,
193
194
  JsonSchemaId,
194
195
  JsonSchemaRef,
195
196
  JsonSchemaType,
197
+ JsonStringKeyPatternProperties,
196
198
  JsonTreeSchema,
197
199
  JsonValidator,
198
200
  MapNodeCustomizableSchema,
@@ -204,6 +206,10 @@ export {
204
206
  ObjectNodeSchema,
205
207
  ReadSchema,
206
208
  ReadableField,
209
+ RecordNodeCustomizableSchema,
210
+ RecordNodeInsertableData,
211
+ RecordNodePojoEmulationSchema,
212
+ RecordNodeSchema,
207
213
  RevertibleAlpha,
208
214
  RevertibleAlphaFactory,
209
215
  RunTransactionParams,
@@ -221,6 +227,7 @@ export {
221
227
  SimpleNodeSchemaBaseAlpha,
222
228
  SimpleObjectFieldSchema,
223
229
  SimpleObjectNodeSchema,
230
+ SimpleRecordNodeSchema,
224
231
  SimpleTreeIndex,
225
232
  SimpleTreeSchema,
226
233
  System_TableSchema,
@@ -240,6 +247,8 @@ export {
240
247
  TreeIndex,
241
248
  TreeIndexKey,
242
249
  TreeIndexNodes,
250
+ TreeRecordNode,
251
+ TreeRecordNodeUnsafe,
243
252
  TreeSchema,
244
253
  TreeSchemaEncodingOptions,
245
254
  TreeViewAlpha,
package/lib/alpha.d.ts CHANGED
@@ -189,10 +189,12 @@ export {
189
189
  JsonNodeSchema,
190
190
  JsonNodeSchemaBase,
191
191
  JsonObjectNodeSchema,
192
+ JsonRecordNodeSchema,
192
193
  JsonRefPath,
193
194
  JsonSchemaId,
194
195
  JsonSchemaRef,
195
196
  JsonSchemaType,
197
+ JsonStringKeyPatternProperties,
196
198
  JsonTreeSchema,
197
199
  JsonValidator,
198
200
  MapNodeCustomizableSchema,
@@ -204,6 +206,10 @@ export {
204
206
  ObjectNodeSchema,
205
207
  ReadSchema,
206
208
  ReadableField,
209
+ RecordNodeCustomizableSchema,
210
+ RecordNodeInsertableData,
211
+ RecordNodePojoEmulationSchema,
212
+ RecordNodeSchema,
207
213
  RevertibleAlpha,
208
214
  RevertibleAlphaFactory,
209
215
  RunTransactionParams,
@@ -221,6 +227,7 @@ export {
221
227
  SimpleNodeSchemaBaseAlpha,
222
228
  SimpleObjectFieldSchema,
223
229
  SimpleObjectNodeSchema,
230
+ SimpleRecordNodeSchema,
224
231
  SimpleTreeIndex,
225
232
  SimpleTreeSchema,
226
233
  System_TableSchema,
@@ -240,6 +247,8 @@ export {
240
247
  TreeIndex,
241
248
  TreeIndexKey,
242
249
  TreeIndexNodes,
250
+ TreeRecordNode,
251
+ TreeRecordNodeUnsafe,
243
252
  TreeSchema,
244
253
  TreeSchemaEncodingOptions,
245
254
  TreeViewAlpha,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluid-framework",
3
- "version": "2.43.0",
3
+ "version": "2.50.0",
4
4
  "description": "The main entry point into Fluid Framework public packages",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -57,17 +57,17 @@
57
57
  "main": "lib/index.js",
58
58
  "types": "lib/public.d.ts",
59
59
  "dependencies": {
60
- "@fluidframework/container-definitions": "~2.43.0",
61
- "@fluidframework/container-loader": "~2.43.0",
62
- "@fluidframework/core-interfaces": "~2.43.0",
63
- "@fluidframework/core-utils": "~2.43.0",
64
- "@fluidframework/driver-definitions": "~2.43.0",
65
- "@fluidframework/fluid-static": "~2.43.0",
66
- "@fluidframework/map": "~2.43.0",
67
- "@fluidframework/runtime-utils": "~2.43.0",
68
- "@fluidframework/sequence": "~2.43.0",
69
- "@fluidframework/shared-object-base": "~2.43.0",
70
- "@fluidframework/tree": "~2.43.0"
60
+ "@fluidframework/container-definitions": "~2.50.0",
61
+ "@fluidframework/container-loader": "~2.50.0",
62
+ "@fluidframework/core-interfaces": "~2.50.0",
63
+ "@fluidframework/core-utils": "~2.50.0",
64
+ "@fluidframework/driver-definitions": "~2.50.0",
65
+ "@fluidframework/fluid-static": "~2.50.0",
66
+ "@fluidframework/map": "~2.50.0",
67
+ "@fluidframework/runtime-utils": "~2.50.0",
68
+ "@fluidframework/sequence": "~2.50.0",
69
+ "@fluidframework/shared-object-base": "~2.50.0",
70
+ "@fluidframework/tree": "~2.50.0"
71
71
  },
72
72
  "devDependencies": {
73
73
  "@arethetypeswrong/cli": "^0.17.1",