fluid-framework 2.3.1 → 2.4.0-297027

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.
@@ -92,21 +92,29 @@ export enum FieldKind {
92
92
  }
93
93
 
94
94
  // @public
95
- export interface FieldProps {
95
+ export interface FieldProps<TCustomMetadata = unknown> {
96
96
  readonly defaultProvider?: DefaultProvider;
97
97
  readonly key?: string;
98
+ readonly metadata?: FieldSchemaMetadata<TCustomMetadata>;
98
99
  }
99
100
 
100
101
  // @public @sealed
101
- export class FieldSchema<out Kind extends FieldKind = FieldKind, out Types extends ImplicitAllowedTypes = ImplicitAllowedTypes> {
102
+ export class FieldSchema<out Kind extends FieldKind = FieldKind, out Types extends ImplicitAllowedTypes = ImplicitAllowedTypes, out TCustomMetadata = unknown> {
102
103
  readonly allowedTypes: Types;
103
104
  get allowedTypeSet(): ReadonlySet<TreeNodeSchema>;
104
105
  readonly kind: Kind;
105
- readonly props?: FieldProps | undefined;
106
+ get metadata(): FieldSchemaMetadata<TCustomMetadata> | undefined;
107
+ readonly props?: FieldProps<TCustomMetadata> | undefined;
106
108
  readonly requiresValue: boolean;
107
109
  protected _typeCheck: MakeNominal;
108
110
  }
109
111
 
112
+ // @public @sealed
113
+ export interface FieldSchemaMetadata<TCustomMetadata = unknown> {
114
+ readonly custom?: TCustomMetadata;
115
+ readonly description?: string | undefined;
116
+ }
117
+
110
118
  // @public
111
119
  export interface FieldSchemaUnsafe<out Kind extends FieldKind, out Types extends Unenforced<ImplicitAllowedTypes>> extends FieldSchema<Kind, any> {
112
120
  readonly allowedTypes: Types;
@@ -498,14 +506,14 @@ export type InitialObjects<T extends ContainerSchema> = {
498
506
  type _InlineTrick = 0;
499
507
 
500
508
  // @public
501
- type InsertableObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>> = FlattenKeys<{
502
- readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<T[Property]>;
509
+ type InsertableObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = FlattenKeys<{
510
+ readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<T[Property] & string>;
503
511
  } & {
504
- readonly [Property in keyof T as FieldHasDefault<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitField<T[Property]>;
512
+ readonly [Property in keyof T as FieldHasDefault<T[Property] & string> extends false ? Property : never]: InsertableTreeFieldFromImplicitField<T[Property] & string>;
505
513
  }>;
506
514
 
507
515
  // @public
508
- export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
516
+ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
509
517
  readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
510
518
  } & {
511
519
  readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends true ? Property : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
@@ -548,7 +556,6 @@ declare namespace InternalTypes {
548
556
  ApplyKind,
549
557
  NodeBuilderData,
550
558
  FieldHasDefault,
551
- TreeNodeSchemaNonClass,
552
559
  TreeArrayNodeBase,
553
560
  ScopedSchemaName,
554
561
  DefaultProvider,
@@ -814,8 +821,7 @@ export interface ITrace {
814
821
  }
815
822
 
816
823
  // @public @sealed
817
- export interface ITree extends IFluidLoadable {
818
- viewWith<TRoot extends ImplicitFieldSchema>(config: TreeViewConfiguration<TRoot>): TreeView<TRoot>;
824
+ export interface ITree extends ViewableTree, IFluidLoadable {
819
825
  }
820
826
 
821
827
  // @public
@@ -853,7 +859,7 @@ export interface MakeNominal {
853
859
  }
854
860
 
855
861
  // @public
856
- export type MapNodeInsertableData<T extends ImplicitAllowedTypes> = Iterable<readonly [string, InsertableTreeNodeFromImplicitAllowedTypes<T>]> | RestrictiveReadonlyRecord<string, InsertableTreeNodeFromImplicitAllowedTypes<T>>;
862
+ export type MapNodeInsertableData<T extends ImplicitAllowedTypes> = Iterable<readonly [string, InsertableTreeNodeFromImplicitAllowedTypes<T>]> | RestrictiveStringRecord<InsertableTreeNodeFromImplicitAllowedTypes<T>>;
857
863
 
858
864
  // @public
859
865
  export type MemberChangedListener<M extends IMember> = (clientId: string, member: M) => void;
@@ -892,12 +898,12 @@ export enum NodeKind {
892
898
  }
893
899
 
894
900
  // @public
895
- type ObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>> = {
896
- -readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property]>;
901
+ type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = {
902
+ -readonly [Property in keyof T]: Property extends string ? TreeFieldFromImplicitField<T[Property]> : unknown;
897
903
  };
898
904
 
899
905
  // @public
900
- type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
906
+ type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
901
907
  -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
902
908
  };
903
909
 
@@ -925,11 +931,18 @@ export type ReplaceIEventThisPlaceHolder<L extends any[], TThis> = L extends any
925
931
  [K in keyof L]: L[K] extends IEventThisPlaceHolder ? TThis : L[K];
926
932
  } : L;
927
933
 
928
- // @public
934
+ // @public @deprecated
929
935
  export type RestrictiveReadonlyRecord<K extends symbol | string, T> = {
930
936
  readonly [P in symbol | string]: P extends K ? T : never;
931
937
  };
932
938
 
939
+ // @public
940
+ export type RestrictiveStringRecord<T> = {
941
+ readonly [P in string]: T;
942
+ } & {
943
+ readonly [P in symbol]?: never;
944
+ };
945
+
933
946
  // @public @sealed
934
947
  export interface Revertible {
935
948
  dispose(): void;
@@ -978,7 +991,7 @@ export interface SchemaCompatibilityStatus {
978
991
  // @public @sealed
979
992
  export class SchemaFactory<out TScope extends string | undefined = string | undefined, TName extends number | string = string> {
980
993
  constructor(scope: TScope);
981
- array<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
994
+ array<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchemaNonClass<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
982
995
  array<const Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
983
996
  arrayRecursive<const Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Array, unknown>, {
984
997
  [Symbol.iterator](): Iterator<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>>;
@@ -986,7 +999,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
986
999
  readonly boolean: TreeNodeSchema<"com.fluidframework.leaf.boolean", NodeKind.Leaf, boolean, boolean>;
987
1000
  readonly handle: TreeNodeSchema<"com.fluidframework.leaf.handle", NodeKind.Leaf, IFluidHandle<unknown>, IFluidHandle<unknown>>;
988
1001
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
989
- map<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
1002
+ map<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchemaNonClass<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
990
1003
  map<Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
991
1004
  mapRecursive<Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Map, unknown>, {
992
1005
  [Symbol.iterator](): Iterator<[
@@ -996,11 +1009,11 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
996
1009
  }, false, T>;
997
1010
  readonly null: TreeNodeSchema<"com.fluidframework.leaf.null", NodeKind.Leaf, null, null>;
998
1011
  readonly number: TreeNodeSchema<"com.fluidframework.leaf.number", NodeKind.Leaf, number, number>;
999
- object<const Name extends TName, const T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>(name: Name, fields: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNode<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
1000
- objectRecursive<const Name extends TName, const T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNodeUnsafe<T, ScopedSchemaName<TScope, Name>>, object & { readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>; } & { readonly [Property_1 in keyof T as FieldHasDefaultUnsafe<T[Property_1]> extends true ? Property_1 : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property_1]> | undefined; }, false, T>;
1001
- optional<const T extends ImplicitAllowedTypes>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchema<FieldKind.Optional, T>;
1012
+ object<const Name extends TName, const T extends RestrictiveStringRecord<ImplicitFieldSchema>>(name: Name, fields: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNode<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
1013
+ objectRecursive<const Name extends TName, const T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNodeUnsafe<T, ScopedSchemaName<TScope, Name>>, object & { readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>; } & { readonly [Property_1 in keyof T as FieldHasDefaultUnsafe<T[Property_1]> extends true ? Property_1 : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property_1]> | undefined; }, false, T>;
1014
+ optional<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">): FieldSchema<FieldKind.Optional, T, TCustomMetadata>;
1002
1015
  optionalRecursive<const T extends Unenforced<ImplicitAllowedTypes>>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchemaUnsafe<FieldKind.Optional, T>;
1003
- required<const T extends ImplicitAllowedTypes>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchema<FieldKind.Required, T>;
1016
+ required<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">): FieldSchema<FieldKind.Required, T, TCustomMetadata>;
1004
1017
  requiredRecursive<const T extends Unenforced<ImplicitAllowedTypes>>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchemaUnsafe<FieldKind.Required, T>;
1005
1018
  // (undocumented)
1006
1019
  readonly scope: TScope;
@@ -1012,6 +1025,7 @@ type ScopedSchemaName<TScope extends string | undefined, TName extends number |
1012
1025
 
1013
1026
  // @alpha
1014
1027
  export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationType> {
1028
+ // @deprecated
1015
1029
  constructor(opArgs: IMergeTreeDeltaOpArgs, deltaArgs: IMergeTreeDeltaCallbackArgs, mergeTreeClient: Client);
1016
1030
  readonly isLocal: boolean;
1017
1031
  // (undocumented)
@@ -1020,6 +1034,7 @@ export class SequenceDeltaEvent extends SequenceEvent<MergeTreeDeltaOperationTyp
1020
1034
 
1021
1035
  // @alpha
1022
1036
  export abstract class SequenceEvent<TOperation extends MergeTreeDeltaOperationTypes = MergeTreeDeltaOperationTypes> {
1037
+ // @deprecated
1023
1038
  constructor(
1024
1039
  deltaArgs: IMergeTreeDeltaCallbackArgs<TOperation>, mergeTreeClient: Client);
1025
1040
  get clientId(): string | undefined;
@@ -1033,6 +1048,7 @@ export abstract class SequenceEvent<TOperation extends MergeTreeDeltaOperationTy
1033
1048
 
1034
1049
  // @alpha
1035
1050
  export class SequenceInterval implements ISerializableInterval {
1051
+ // @deprecated
1036
1052
  constructor(client: Client,
1037
1053
  start: LocalReferencePosition,
1038
1054
  end: LocalReferencePosition, intervalType: IntervalType, props?: PropertySet, startSide?: Side, endSide?: Side);
@@ -1071,6 +1087,7 @@ export class SequenceInterval implements ISerializableInterval {
1071
1087
 
1072
1088
  // @alpha
1073
1089
  export class SequenceMaintenanceEvent extends SequenceEvent<MergeTreeMaintenanceType> {
1090
+ // @deprecated
1074
1091
  constructor(
1075
1092
  opArgs: IMergeTreeDeltaOpArgs | undefined, deltaArgs: IMergeTreeMaintenanceCallbackArgs, mergeTreeClient: Client);
1076
1093
  readonly opArgs: IMergeTreeDeltaOpArgs | undefined;
@@ -1151,14 +1168,14 @@ interface TreeArrayNodeBase<out T, in TNew, in TMoveFrom> extends ReadonlyArray<
1151
1168
  insertAtStart(...value: readonly (TNew | IterableTreeArrayContent<TNew>)[]): void;
1152
1169
  moveRangeToEnd(sourceStart: number, sourceEnd: number): void;
1153
1170
  moveRangeToEnd(sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
1154
- moveRangeToIndex(index: number, sourceStart: number, sourceEnd: number): void;
1155
- moveRangeToIndex(index: number, sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
1171
+ moveRangeToIndex(destinationGap: number, sourceStart: number, sourceEnd: number): void;
1172
+ moveRangeToIndex(destinationGap: number, sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
1156
1173
  moveRangeToStart(sourceStart: number, sourceEnd: number): void;
1157
1174
  moveRangeToStart(sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
1158
1175
  moveToEnd(sourceIndex: number): void;
1159
1176
  moveToEnd(sourceIndex: number, source: TMoveFrom): void;
1160
- moveToIndex(index: number, sourceIndex: number): void;
1161
- moveToIndex(index: number, sourceIndex: number, source: TMoveFrom): void;
1177
+ moveToIndex(destinationGap: number, sourceIndex: number): void;
1178
+ moveToIndex(destinationGap: number, sourceIndex: number, source: TMoveFrom): void;
1162
1179
  moveToStart(sourceIndex: number): void;
1163
1180
  moveToStart(sourceIndex: number, source: TMoveFrom): void;
1164
1181
  removeAt(index: number): void;
@@ -1239,6 +1256,7 @@ export interface TreeNodeSchemaClass<out Name extends string = string, out Kind
1239
1256
 
1240
1257
  // @public @sealed
1241
1258
  export interface TreeNodeSchemaCore<out Name extends string, out Kind extends NodeKind, out ImplicitlyConstructable extends boolean, out Info = unknown> {
1259
+ readonly childTypes: ReadonlySet<TreeNodeSchema>;
1242
1260
  readonly identifier: Name;
1243
1261
  readonly implicitlyConstructable: ImplicitlyConstructable;
1244
1262
  readonly info: Info;
@@ -1247,16 +1265,16 @@ export interface TreeNodeSchemaCore<out Name extends string, out Kind extends No
1247
1265
  }
1248
1266
 
1249
1267
  // @public @sealed
1250
- interface TreeNodeSchemaNonClass<out Name extends string = string, out Kind extends NodeKind = NodeKind, out TNode = unknown, in TInsertable = never, out ImplicitlyConstructable extends boolean = boolean, out Info = unknown> extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
1268
+ export interface TreeNodeSchemaNonClass<out Name extends string = string, out Kind extends NodeKind = NodeKind, out TNode = unknown, in TInsertable = never, out ImplicitlyConstructable extends boolean = boolean, out Info = unknown> extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
1251
1269
  // (undocumented)
1252
1270
  create(data: TInsertable): TNode;
1253
1271
  }
1254
1272
 
1255
1273
  // @public
1256
- export type TreeObjectNode<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName, NodeKind.Object, T>;
1274
+ export type TreeObjectNode<T extends RestrictiveStringRecord<ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName, NodeKind.Object, T>;
1257
1275
 
1258
1276
  // @public
1259
- export type TreeObjectNodeUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecordUnsafe<T> & WithType<TypeName, NodeKind.Object>;
1277
+ export type TreeObjectNodeUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecordUnsafe<T> & WithType<TypeName, NodeKind.Object>;
1260
1278
 
1261
1279
  // @public
1262
1280
  export enum TreeStatus {
@@ -1273,6 +1291,7 @@ export interface TreeView<TSchema extends ImplicitFieldSchema> extends IDisposab
1273
1291
  initialize(content: InsertableTreeFieldFromImplicitField<TSchema>): void;
1274
1292
  get root(): TreeFieldFromImplicitField<TSchema>;
1275
1293
  set root(newRoot: InsertableTreeFieldFromImplicitField<TSchema>);
1294
+ readonly schema: TSchema;
1276
1295
  upgradeSchema(): void;
1277
1296
  }
1278
1297
 
@@ -1307,15 +1326,20 @@ export type Unhydrated<T> = T;
1307
1326
 
1308
1327
  // @public
1309
1328
  export type ValidateRecursiveSchema<T extends TreeNodeSchemaClass<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
1310
- [NodeKind.Object]: T["info"] extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1329
+ [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
1311
1330
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
1312
1331
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
1313
1332
  }[T["kind"]], false, {
1314
- [NodeKind.Object]: RestrictiveReadonlyRecord<string, ImplicitFieldSchema>;
1333
+ [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
1315
1334
  [NodeKind.Array]: ImplicitAllowedTypes;
1316
1335
  [NodeKind.Map]: ImplicitAllowedTypes;
1317
1336
  }[T["kind"]]>> = true;
1318
1337
 
1338
+ // @public @sealed
1339
+ export interface ViewableTree {
1340
+ viewWith<TRoot extends ImplicitFieldSchema>(config: TreeViewConfiguration<TRoot>): TreeView<TRoot>;
1341
+ }
1342
+
1319
1343
  // @public @sealed
1320
1344
  export interface WithType<out TName extends string = string, out TKind extends NodeKind = NodeKind, out TInfo = unknown> {
1321
1345
  // @deprecated
@@ -89,21 +89,29 @@ export enum FieldKind {
89
89
  }
90
90
 
91
91
  // @public
92
- export interface FieldProps {
92
+ export interface FieldProps<TCustomMetadata = unknown> {
93
93
  readonly defaultProvider?: DefaultProvider;
94
94
  readonly key?: string;
95
+ readonly metadata?: FieldSchemaMetadata<TCustomMetadata>;
95
96
  }
96
97
 
97
98
  // @public @sealed
98
- export class FieldSchema<out Kind extends FieldKind = FieldKind, out Types extends ImplicitAllowedTypes = ImplicitAllowedTypes> {
99
+ export class FieldSchema<out Kind extends FieldKind = FieldKind, out Types extends ImplicitAllowedTypes = ImplicitAllowedTypes, out TCustomMetadata = unknown> {
99
100
  readonly allowedTypes: Types;
100
101
  get allowedTypeSet(): ReadonlySet<TreeNodeSchema>;
101
102
  readonly kind: Kind;
102
- readonly props?: FieldProps | undefined;
103
+ get metadata(): FieldSchemaMetadata<TCustomMetadata> | undefined;
104
+ readonly props?: FieldProps<TCustomMetadata> | undefined;
103
105
  readonly requiresValue: boolean;
104
106
  protected _typeCheck: MakeNominal;
105
107
  }
106
108
 
109
+ // @public @sealed
110
+ export interface FieldSchemaMetadata<TCustomMetadata = unknown> {
111
+ readonly custom?: TCustomMetadata;
112
+ readonly description?: string | undefined;
113
+ }
114
+
107
115
  // @public
108
116
  export interface FieldSchemaUnsafe<out Kind extends FieldKind, out Types extends Unenforced<ImplicitAllowedTypes>> extends FieldSchema<Kind, any> {
109
117
  readonly allowedTypes: Types;
@@ -426,14 +434,14 @@ export type InitialObjects<T extends ContainerSchema> = {
426
434
  type _InlineTrick = 0;
427
435
 
428
436
  // @public
429
- type InsertableObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>> = FlattenKeys<{
430
- readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<T[Property]>;
437
+ type InsertableObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = FlattenKeys<{
438
+ readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<T[Property] & string>;
431
439
  } & {
432
- readonly [Property in keyof T as FieldHasDefault<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitField<T[Property]>;
440
+ readonly [Property in keyof T as FieldHasDefault<T[Property] & string> extends false ? Property : never]: InsertableTreeFieldFromImplicitField<T[Property] & string>;
433
441
  }>;
434
442
 
435
443
  // @public
436
- export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
444
+ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
437
445
  readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
438
446
  } & {
439
447
  readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends true ? Property : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
@@ -476,7 +484,6 @@ declare namespace InternalTypes {
476
484
  ApplyKind,
477
485
  NodeBuilderData,
478
486
  FieldHasDefault,
479
- TreeNodeSchemaNonClass,
480
487
  TreeArrayNodeBase,
481
488
  ScopedSchemaName,
482
489
  DefaultProvider,
@@ -544,8 +551,7 @@ export class IterableTreeArrayContent<T> implements Iterable<T> {
544
551
  }
545
552
 
546
553
  // @public @sealed
547
- export interface ITree extends IFluidLoadable {
548
- viewWith<TRoot extends ImplicitFieldSchema>(config: TreeViewConfiguration<TRoot>): TreeView<TRoot>;
554
+ export interface ITree extends ViewableTree, IFluidLoadable {
549
555
  }
550
556
 
551
557
  // @public
@@ -583,7 +589,7 @@ export interface MakeNominal {
583
589
  }
584
590
 
585
591
  // @public
586
- export type MapNodeInsertableData<T extends ImplicitAllowedTypes> = Iterable<readonly [string, InsertableTreeNodeFromImplicitAllowedTypes<T>]> | RestrictiveReadonlyRecord<string, InsertableTreeNodeFromImplicitAllowedTypes<T>>;
592
+ export type MapNodeInsertableData<T extends ImplicitAllowedTypes> = Iterable<readonly [string, InsertableTreeNodeFromImplicitAllowedTypes<T>]> | RestrictiveStringRecord<InsertableTreeNodeFromImplicitAllowedTypes<T>>;
587
593
 
588
594
  // @public
589
595
  export type MemberChangedListener<M extends IMember> = (clientId: string, member: M) => void;
@@ -622,12 +628,12 @@ export enum NodeKind {
622
628
  }
623
629
 
624
630
  // @public
625
- type ObjectFromSchemaRecord<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>> = {
626
- -readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property]>;
631
+ type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = {
632
+ -readonly [Property in keyof T]: Property extends string ? TreeFieldFromImplicitField<T[Property]> : unknown;
627
633
  };
628
634
 
629
635
  // @public
630
- type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>> = {
636
+ type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
631
637
  -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
632
638
  };
633
639
 
@@ -655,11 +661,18 @@ export type ReplaceIEventThisPlaceHolder<L extends any[], TThis> = L extends any
655
661
  [K in keyof L]: L[K] extends IEventThisPlaceHolder ? TThis : L[K];
656
662
  } : L;
657
663
 
658
- // @public
664
+ // @public @deprecated
659
665
  export type RestrictiveReadonlyRecord<K extends symbol | string, T> = {
660
666
  readonly [P in symbol | string]: P extends K ? T : never;
661
667
  };
662
668
 
669
+ // @public
670
+ export type RestrictiveStringRecord<T> = {
671
+ readonly [P in string]: T;
672
+ } & {
673
+ readonly [P in symbol]?: never;
674
+ };
675
+
663
676
  // @public @sealed
664
677
  export interface Revertible {
665
678
  dispose(): void;
@@ -708,7 +721,7 @@ export interface SchemaCompatibilityStatus {
708
721
  // @public @sealed
709
722
  export class SchemaFactory<out TScope extends string | undefined = string | undefined, TName extends number | string = string> {
710
723
  constructor(scope: TScope);
711
- array<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
724
+ array<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchemaNonClass<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, `Array<${string}>`>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
712
725
  array<const Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Array>, Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T>>, true, T>;
713
726
  arrayRecursive<const Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Array, TreeArrayNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Array, unknown>, {
714
727
  [Symbol.iterator](): Iterator<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<T>>;
@@ -716,7 +729,7 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
716
729
  readonly boolean: TreeNodeSchema<"com.fluidframework.leaf.boolean", NodeKind.Leaf, boolean, boolean>;
717
730
  readonly handle: TreeNodeSchema<"com.fluidframework.leaf.handle", NodeKind.Leaf, IFluidHandle<unknown>, IFluidHandle<unknown>>;
718
731
  get identifier(): FieldSchema<FieldKind.Identifier, typeof SchemaFactory.string>;
719
- map<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchema<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
732
+ map<const T extends TreeNodeSchema | readonly TreeNodeSchema[]>(allowedTypes: T): TreeNodeSchemaNonClass<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, `Map<${string}>`>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
720
733
  map<Name extends TName, const T extends ImplicitAllowedTypes>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNode<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Map>, MapNodeInsertableData<T>, true, T>;
721
734
  mapRecursive<Name extends TName, const T extends Unenforced<ImplicitAllowedTypes>>(name: Name, allowedTypes: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Map, TreeMapNodeUnsafe<T> & WithType<ScopedSchemaName<TScope, Name>, NodeKind.Map, unknown>, {
722
735
  [Symbol.iterator](): Iterator<[
@@ -726,11 +739,11 @@ export class SchemaFactory<out TScope extends string | undefined = string | unde
726
739
  }, false, T>;
727
740
  readonly null: TreeNodeSchema<"com.fluidframework.leaf.null", NodeKind.Leaf, null, null>;
728
741
  readonly number: TreeNodeSchema<"com.fluidframework.leaf.number", NodeKind.Leaf, number, number>;
729
- object<const Name extends TName, const T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>(name: Name, fields: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNode<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
730
- objectRecursive<const Name extends TName, const T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNodeUnsafe<T, ScopedSchemaName<TScope, Name>>, object & { readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>; } & { readonly [Property_1 in keyof T as FieldHasDefaultUnsafe<T[Property_1]> extends true ? Property_1 : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property_1]> | undefined; }, false, T>;
731
- optional<const T extends ImplicitAllowedTypes>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchema<FieldKind.Optional, T>;
742
+ object<const Name extends TName, const T extends RestrictiveStringRecord<ImplicitFieldSchema>>(name: Name, fields: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNode<T, ScopedSchemaName<TScope, Name>>, object & InsertableObjectFromSchemaRecord<T>, true, T>;
743
+ objectRecursive<const Name extends TName, const T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>>(name: Name, t: T): TreeNodeSchemaClass<ScopedSchemaName<TScope, Name>, NodeKind.Object, TreeObjectNodeUnsafe<T, ScopedSchemaName<TScope, Name>>, object & { readonly [Property in keyof T as FieldHasDefaultUnsafe<T[Property]> extends false ? Property : never]: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property]>; } & { readonly [Property_1 in keyof T as FieldHasDefaultUnsafe<T[Property_1]> extends true ? Property_1 : never]?: InsertableTreeFieldFromImplicitFieldUnsafe<T[Property_1]> | undefined; }, false, T>;
744
+ optional<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">): FieldSchema<FieldKind.Optional, T, TCustomMetadata>;
732
745
  optionalRecursive<const T extends Unenforced<ImplicitAllowedTypes>>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchemaUnsafe<FieldKind.Optional, T>;
733
- required<const T extends ImplicitAllowedTypes>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchema<FieldKind.Required, T>;
746
+ required<const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(t: T, props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">): FieldSchema<FieldKind.Required, T, TCustomMetadata>;
734
747
  requiredRecursive<const T extends Unenforced<ImplicitAllowedTypes>>(t: T, props?: Omit<FieldProps, "defaultProvider">): FieldSchemaUnsafe<FieldKind.Required, T>;
735
748
  // (undocumented)
736
749
  readonly scope: TScope;
@@ -794,14 +807,14 @@ interface TreeArrayNodeBase<out T, in TNew, in TMoveFrom> extends ReadonlyArray<
794
807
  insertAtStart(...value: readonly (TNew | IterableTreeArrayContent<TNew>)[]): void;
795
808
  moveRangeToEnd(sourceStart: number, sourceEnd: number): void;
796
809
  moveRangeToEnd(sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
797
- moveRangeToIndex(index: number, sourceStart: number, sourceEnd: number): void;
798
- moveRangeToIndex(index: number, sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
810
+ moveRangeToIndex(destinationGap: number, sourceStart: number, sourceEnd: number): void;
811
+ moveRangeToIndex(destinationGap: number, sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
799
812
  moveRangeToStart(sourceStart: number, sourceEnd: number): void;
800
813
  moveRangeToStart(sourceStart: number, sourceEnd: number, source: TMoveFrom): void;
801
814
  moveToEnd(sourceIndex: number): void;
802
815
  moveToEnd(sourceIndex: number, source: TMoveFrom): void;
803
- moveToIndex(index: number, sourceIndex: number): void;
804
- moveToIndex(index: number, sourceIndex: number, source: TMoveFrom): void;
816
+ moveToIndex(destinationGap: number, sourceIndex: number): void;
817
+ moveToIndex(destinationGap: number, sourceIndex: number, source: TMoveFrom): void;
805
818
  moveToStart(sourceIndex: number): void;
806
819
  moveToStart(sourceIndex: number, source: TMoveFrom): void;
807
820
  removeAt(index: number): void;
@@ -882,6 +895,7 @@ export interface TreeNodeSchemaClass<out Name extends string = string, out Kind
882
895
 
883
896
  // @public @sealed
884
897
  export interface TreeNodeSchemaCore<out Name extends string, out Kind extends NodeKind, out ImplicitlyConstructable extends boolean, out Info = unknown> {
898
+ readonly childTypes: ReadonlySet<TreeNodeSchema>;
885
899
  readonly identifier: Name;
886
900
  readonly implicitlyConstructable: ImplicitlyConstructable;
887
901
  readonly info: Info;
@@ -890,16 +904,16 @@ export interface TreeNodeSchemaCore<out Name extends string, out Kind extends No
890
904
  }
891
905
 
892
906
  // @public @sealed
893
- interface TreeNodeSchemaNonClass<out Name extends string = string, out Kind extends NodeKind = NodeKind, out TNode = unknown, in TInsertable = never, out ImplicitlyConstructable extends boolean = boolean, out Info = unknown> extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
907
+ export interface TreeNodeSchemaNonClass<out Name extends string = string, out Kind extends NodeKind = NodeKind, out TNode = unknown, in TInsertable = never, out ImplicitlyConstructable extends boolean = boolean, out Info = unknown> extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
894
908
  // (undocumented)
895
909
  create(data: TInsertable): TNode;
896
910
  }
897
911
 
898
912
  // @public
899
- export type TreeObjectNode<T extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName, NodeKind.Object, T>;
913
+ export type TreeObjectNode<T extends RestrictiveStringRecord<ImplicitFieldSchema>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecord<T> & WithType<TypeName, NodeKind.Object, T>;
900
914
 
901
915
  // @public
902
- export type TreeObjectNodeUnsafe<T extends Unenforced<RestrictiveReadonlyRecord<string, ImplicitFieldSchema>>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecordUnsafe<T> & WithType<TypeName, NodeKind.Object>;
916
+ export type TreeObjectNodeUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>, TypeName extends string = string> = TreeNode & ObjectFromSchemaRecordUnsafe<T> & WithType<TypeName, NodeKind.Object>;
903
917
 
904
918
  // @public
905
919
  export enum TreeStatus {
@@ -916,6 +930,7 @@ export interface TreeView<TSchema extends ImplicitFieldSchema> extends IDisposab
916
930
  initialize(content: InsertableTreeFieldFromImplicitField<TSchema>): void;
917
931
  get root(): TreeFieldFromImplicitField<TSchema>;
918
932
  set root(newRoot: InsertableTreeFieldFromImplicitField<TSchema>);
933
+ readonly schema: TSchema;
919
934
  upgradeSchema(): void;
920
935
  }
921
936
 
@@ -950,15 +965,20 @@ export type Unhydrated<T> = T;
950
965
 
951
966
  // @public
952
967
  export type ValidateRecursiveSchema<T extends TreeNodeSchemaClass<string, NodeKind.Array | NodeKind.Map | NodeKind.Object, TreeNode & WithType<T["identifier"], T["kind"]>, {
953
- [NodeKind.Object]: T["info"] extends RestrictiveReadonlyRecord<string, ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
968
+ [NodeKind.Object]: T["info"] extends RestrictiveStringRecord<ImplicitFieldSchema> ? InsertableObjectFromSchemaRecord<T["info"]> : unknown;
954
969
  [NodeKind.Array]: T["info"] extends ImplicitAllowedTypes ? Iterable<InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>> : unknown;
955
970
  [NodeKind.Map]: T["info"] extends ImplicitAllowedTypes ? Iterable<[string, InsertableTreeNodeFromImplicitAllowedTypes<T["info"]>]> : unknown;
956
971
  }[T["kind"]], false, {
957
- [NodeKind.Object]: RestrictiveReadonlyRecord<string, ImplicitFieldSchema>;
972
+ [NodeKind.Object]: RestrictiveStringRecord<ImplicitFieldSchema>;
958
973
  [NodeKind.Array]: ImplicitAllowedTypes;
959
974
  [NodeKind.Map]: ImplicitAllowedTypes;
960
975
  }[T["kind"]]>> = true;
961
976
 
977
+ // @public @sealed
978
+ export interface ViewableTree {
979
+ viewWith<TRoot extends ImplicitFieldSchema>(config: TreeViewConfiguration<TRoot>): TreeView<TRoot>;
980
+ }
981
+
962
982
  // @public @sealed
963
983
  export interface WithType<out TName extends string = string, out TKind extends NodeKind = NodeKind, out TInfo = unknown> {
964
984
  // @deprecated