fluid-framework 2.22.1 → 2.23.0-325054

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.
@@ -17,11 +17,22 @@ type ApplyKind<T, Kind extends FieldKind> = {
17
17
  [FieldKind.Identifier]: T;
18
18
  }[Kind];
19
19
 
20
+ // @public
21
+ export type ApplyKindAssignment<T, Kind extends FieldKind> = [Kind] extends [
22
+ FieldKind.Required
23
+ ] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : never;
24
+
20
25
  // @public
21
26
  type ApplyKindInput<T, Kind extends FieldKind, DefaultsAreOptional extends boolean> = [
22
27
  Kind
23
28
  ] extends [FieldKind.Required] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : [Kind] extends [FieldKind.Identifier] ? DefaultsAreOptional extends true ? T | undefined : T : never;
24
29
 
30
+ // @public
31
+ export type AssignableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindAssignment<GetTypes<Types>["readWrite"], Kind> : [TSchema] extends [ImplicitAllowedTypes] ? GetTypes<TSchema>["readWrite"] : never;
32
+
33
+ // @public
34
+ export type AssignableTreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types> ? ApplyKindAssignment<GetTypesUnsafe<Types>["readWrite"], Kind> : GetTypesUnsafe<TSchema>["readWrite"];
35
+
25
36
  // @public
26
37
  export enum AttachState {
27
38
  Attached = "Attached",
@@ -70,10 +81,40 @@ export interface ContainerSchema {
70
81
  readonly initialObjects: Record<string, SharedObjectKind>;
71
82
  }
72
83
 
84
+ // @public
85
+ export type CustomizedSchemaTyping<TSchema, TCustom extends CustomTypes> = TSchema & {
86
+ [CustomizedTyping]: TCustom;
87
+ };
88
+
89
+ // @public
90
+ export const CustomizedTyping: unique symbol;
91
+
92
+ // @public
93
+ export type CustomizedTyping = typeof CustomizedTyping;
94
+
95
+ // @public @sealed
96
+ export interface CustomTypes {
97
+ readonly input: unknown;
98
+ readonly output: TreeLeafValue | TreeNode;
99
+ readonly readWrite: TreeLeafValue | TreeNode;
100
+ }
101
+
102
+ // @public
103
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
104
+
105
+ // @public
106
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
107
+
73
108
  // @public @sealed
74
109
  interface DefaultProvider extends ErasedType<"@fluidframework/tree.FieldProvider"> {
75
110
  }
76
111
 
112
+ // @public
113
+ export type DefaultTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
114
+
115
+ // @public
116
+ export type DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
117
+
77
118
  // @alpha (undocumented)
78
119
  export type DeserializeCallback = (properties: PropertySet) => void;
79
120
 
@@ -149,6 +190,16 @@ export type FluidObject<T = unknown> = {
149
190
  // @public
150
191
  export type FluidObjectProviderKeys<T, TProp extends keyof T = keyof T> = string extends TProp ? never : number extends TProp ? never : TProp extends keyof Required<T>[TProp] ? Required<T>[TProp] extends Required<Required<T>[TProp]>[TProp] ? TProp : never : never;
151
192
 
193
+ // @public
194
+ export type GetTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [
195
+ CustomizedSchemaTyping<unknown, infer TCustom>
196
+ ] ? TCustom : StrictTypes<TSchema>;
197
+
198
+ // @public
199
+ export type GetTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [
200
+ TSchema
201
+ ] extends [CustomizedSchemaTyping<unknown, infer TCustom>] ? TCustom : StrictTypesUnsafe<TSchema>;
202
+
152
203
  // @alpha
153
204
  export interface IBranchOrigin {
154
205
  id: string;
@@ -531,7 +582,7 @@ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<Restrict
531
582
  };
532
583
 
533
584
  // @public
534
- export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
585
+ export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = [TSchemaInput] extends [CustomizedSchemaTyping<unknown, CustomTypes>] ? TSchemaInput : SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
535
586
 
536
587
  // @public
537
588
  export type InsertableTreeFieldFromImplicitFieldUnsafe<TSchemaInput extends Unenforced<ImplicitFieldSchema>, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchemaUnsafe<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema> : never;
@@ -549,12 +600,10 @@ LazyItem<infer TSchema extends TreeNodeSchemaUnsafe>,
549
600
  ] ? InsertableTypedNodeUnsafe<TSchema> | InsertableTreeNodeFromAllowedTypesUnsafe<Rest> : never;
550
601
 
551
602
  // @public
552
- export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [
553
- TSchema
554
- ] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
603
+ export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = GetTypes<TSchema>["input"];
555
604
 
556
605
  // @public
557
- export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
606
+ export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["input"];
558
607
 
559
608
  // @public
560
609
  export type InsertableTypedNode<TSchema extends TreeNodeSchema, T = UnionToIntersection<TSchema>> = (T extends TreeNodeSchema<string, NodeKind, TreeNode | TreeLeafValue, never, true> ? NodeBuilderData<T> : never) | (T extends TreeNodeSchema ? Unhydrated<TreeNode extends NodeFromSchema<T> ? never : NodeFromSchema<T>> : never);
@@ -929,12 +978,30 @@ export interface NodeSchemaOptions<out TCustomMetadata = unknown> {
929
978
 
930
979
  // @public
931
980
  type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = {
932
- -readonly [Property in keyof T]: Property extends string ? TreeFieldFromImplicitField<T[Property]> : unknown;
981
+ -readonly [Property in keyof T as [
982
+ AssignableTreeFieldFromImplicitField<T[Property & string]>
983
+ ] extends [never | undefined] ? never : Property]: AssignableTreeFieldFromImplicitField<T[Property & string]>;
984
+ } & {
985
+ readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property & string]>;
933
986
  };
934
987
 
935
988
  // @public
936
989
  type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
937
- -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
990
+ -readonly [Property in keyof T as [T[Property]] extends [
991
+ CustomizedSchemaTyping<unknown, {
992
+ readonly readWrite: never;
993
+ readonly input: unknown;
994
+ readonly output: TreeNode | TreeLeafValue;
995
+ }>
996
+ ] ? never : Property]: AssignableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
997
+ } & {
998
+ readonly [Property in keyof T as [T[Property]] extends [
999
+ CustomizedSchemaTyping<unknown, {
1000
+ readonly readWrite: never;
1001
+ readonly input: unknown;
1002
+ readonly output: TreeNode | TreeLeafValue;
1003
+ }>
1004
+ ] ? Property : never]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
938
1005
  };
939
1006
 
940
1007
  // @public
@@ -1081,6 +1148,11 @@ export const schemaStatics: {
1081
1148
  readonly requiredRecursive: <const T_3 extends unknown>(t: T_3, props?: Omit<FieldProps, "defaultProvider">) => FieldSchemaUnsafe<FieldKind.Required, T_3>;
1082
1149
  };
1083
1150
 
1151
+ // @public
1152
+ export type SchemaUnionToIntersection<T> = [T] extends [
1153
+ CustomizedSchemaTyping<unknown, CustomTypes>
1154
+ ] ? T : UnionToIntersection<T>;
1155
+
1084
1156
  // @public
1085
1157
  type ScopedSchemaName<TScope extends string | undefined, TName extends number | string> = TScope extends undefined ? `${TName}` : `${TScope}.${TName}`;
1086
1158
 
@@ -1170,6 +1242,26 @@ export const SharedTree: SharedObjectKind<ITree>;
1170
1242
 
1171
1243
  export { Side }
1172
1244
 
1245
+ // @public @sealed
1246
+ export interface StrictTypes<TSchema extends ImplicitAllowedTypes, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema>, TOutput extends TreeNode | TreeLeafValue = DefaultTreeNodeFromImplicitAllowedTypes<TSchema>> {
1247
+ // (undocumented)
1248
+ input: TInput;
1249
+ // (undocumented)
1250
+ output: TOutput;
1251
+ // (undocumented)
1252
+ readWrite: TInput extends never ? never : TOutput;
1253
+ }
1254
+
1255
+ // @public
1256
+ export interface StrictTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>, TOutput = DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>> {
1257
+ // (undocumented)
1258
+ input: TInput;
1259
+ // (undocumented)
1260
+ output: TOutput;
1261
+ // (undocumented)
1262
+ readWrite: TOutput;
1263
+ }
1264
+
1173
1265
  // @public
1174
1266
  export interface Tagged<V, T extends string = string> {
1175
1267
  // (undocumented)
@@ -1280,10 +1372,10 @@ export interface TreeNodeApi {
1280
1372
  }
1281
1373
 
1282
1374
  // @public
1283
- export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
1375
+ export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = GetTypes<TSchema>["output"];
1284
1376
 
1285
1377
  // @public
1286
- type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
1378
+ type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["output"];
1287
1379
 
1288
1380
  // @public @sealed
1289
1381
  export type TreeNodeSchema<Name extends string = string, Kind extends NodeKind = NodeKind, TNode extends TreeNode | TreeLeafValue = TreeNode | TreeLeafValue, TBuild = never, ImplicitlyConstructable extends boolean = boolean, Info = unknown, TCustomMetadata = unknown> = (TNode extends TreeNode ? TreeNodeSchemaClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata> : never) | TreeNodeSchemaNonClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata>;
@@ -17,11 +17,22 @@ type ApplyKind<T, Kind extends FieldKind> = {
17
17
  [FieldKind.Identifier]: T;
18
18
  }[Kind];
19
19
 
20
+ // @public
21
+ export type ApplyKindAssignment<T, Kind extends FieldKind> = [Kind] extends [
22
+ FieldKind.Required
23
+ ] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : never;
24
+
20
25
  // @public
21
26
  type ApplyKindInput<T, Kind extends FieldKind, DefaultsAreOptional extends boolean> = [
22
27
  Kind
23
28
  ] extends [FieldKind.Required] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : [Kind] extends [FieldKind.Identifier] ? DefaultsAreOptional extends true ? T | undefined : T : never;
24
29
 
30
+ // @public
31
+ export type AssignableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindAssignment<GetTypes<Types>["readWrite"], Kind> : [TSchema] extends [ImplicitAllowedTypes] ? GetTypes<TSchema>["readWrite"] : never;
32
+
33
+ // @public
34
+ export type AssignableTreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types> ? ApplyKindAssignment<GetTypesUnsafe<Types>["readWrite"], Kind> : GetTypesUnsafe<TSchema>["readWrite"];
35
+
25
36
  // @public
26
37
  export enum AttachState {
27
38
  Attached = "Attached",
@@ -70,10 +81,40 @@ export interface ContainerSchema {
70
81
  readonly initialObjects: Record<string, SharedObjectKind>;
71
82
  }
72
83
 
84
+ // @public
85
+ export type CustomizedSchemaTyping<TSchema, TCustom extends CustomTypes> = TSchema & {
86
+ [CustomizedTyping]: TCustom;
87
+ };
88
+
89
+ // @public
90
+ export const CustomizedTyping: unique symbol;
91
+
92
+ // @public
93
+ export type CustomizedTyping = typeof CustomizedTyping;
94
+
95
+ // @public @sealed
96
+ export interface CustomTypes {
97
+ readonly input: unknown;
98
+ readonly output: TreeLeafValue | TreeNode;
99
+ readonly readWrite: TreeLeafValue | TreeNode;
100
+ }
101
+
102
+ // @public
103
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
104
+
105
+ // @public
106
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
107
+
73
108
  // @public @sealed
74
109
  interface DefaultProvider extends ErasedType<"@fluidframework/tree.FieldProvider"> {
75
110
  }
76
111
 
112
+ // @public
113
+ export type DefaultTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
114
+
115
+ // @public
116
+ export type DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
117
+
77
118
  // @public @sealed
78
119
  export abstract class ErasedType<out Name = unknown> {
79
120
  static [Symbol.hasInstance](value: never): value is never;
@@ -146,6 +187,16 @@ export type FluidObject<T = unknown> = {
146
187
  // @public
147
188
  export type FluidObjectProviderKeys<T, TProp extends keyof T = keyof T> = string extends TProp ? never : number extends TProp ? never : TProp extends keyof Required<T>[TProp] ? Required<T>[TProp] extends Required<Required<T>[TProp]>[TProp] ? TProp : never : never;
148
189
 
190
+ // @public
191
+ export type GetTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [
192
+ CustomizedSchemaTyping<unknown, infer TCustom>
193
+ ] ? TCustom : StrictTypes<TSchema>;
194
+
195
+ // @public
196
+ export type GetTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [
197
+ TSchema
198
+ ] extends [CustomizedSchemaTyping<unknown, infer TCustom>] ? TCustom : StrictTypesUnsafe<TSchema>;
199
+
149
200
  // @public
150
201
  export interface IConnection {
151
202
  readonly id: string;
@@ -459,7 +510,7 @@ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<Restrict
459
510
  };
460
511
 
461
512
  // @public
462
- export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
513
+ export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = [TSchemaInput] extends [CustomizedSchemaTyping<unknown, CustomTypes>] ? TSchemaInput : SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
463
514
 
464
515
  // @public
465
516
  export type InsertableTreeFieldFromImplicitFieldUnsafe<TSchemaInput extends Unenforced<ImplicitFieldSchema>, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchemaUnsafe<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema> : never;
@@ -477,12 +528,10 @@ LazyItem<infer TSchema extends TreeNodeSchemaUnsafe>,
477
528
  ] ? InsertableTypedNodeUnsafe<TSchema> | InsertableTreeNodeFromAllowedTypesUnsafe<Rest> : never;
478
529
 
479
530
  // @public
480
- export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [
481
- TSchema
482
- ] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
531
+ export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = GetTypes<TSchema>["input"];
483
532
 
484
533
  // @public
485
- export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
534
+ export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["input"];
486
535
 
487
536
  // @public
488
537
  export type InsertableTypedNode<TSchema extends TreeNodeSchema, T = UnionToIntersection<TSchema>> = (T extends TreeNodeSchema<string, NodeKind, TreeNode | TreeLeafValue, never, true> ? NodeBuilderData<T> : never) | (T extends TreeNodeSchema ? Unhydrated<TreeNode extends NodeFromSchema<T> ? never : NodeFromSchema<T>> : never);
@@ -663,12 +712,30 @@ export interface NodeSchemaOptions<out TCustomMetadata = unknown> {
663
712
 
664
713
  // @public
665
714
  type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = {
666
- -readonly [Property in keyof T]: Property extends string ? TreeFieldFromImplicitField<T[Property]> : unknown;
715
+ -readonly [Property in keyof T as [
716
+ AssignableTreeFieldFromImplicitField<T[Property & string]>
717
+ ] extends [never | undefined] ? never : Property]: AssignableTreeFieldFromImplicitField<T[Property & string]>;
718
+ } & {
719
+ readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property & string]>;
667
720
  };
668
721
 
669
722
  // @public
670
723
  type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
671
- -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
724
+ -readonly [Property in keyof T as [T[Property]] extends [
725
+ CustomizedSchemaTyping<unknown, {
726
+ readonly readWrite: never;
727
+ readonly input: unknown;
728
+ readonly output: TreeNode | TreeLeafValue;
729
+ }>
730
+ ] ? never : Property]: AssignableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
731
+ } & {
732
+ readonly [Property in keyof T as [T[Property]] extends [
733
+ CustomizedSchemaTyping<unknown, {
734
+ readonly readWrite: never;
735
+ readonly input: unknown;
736
+ readonly output: TreeNode | TreeLeafValue;
737
+ }>
738
+ ] ? Property : never]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
672
739
  };
673
740
 
674
741
  // @public
@@ -815,6 +882,11 @@ export const schemaStatics: {
815
882
  readonly requiredRecursive: <const T_3 extends unknown>(t: T_3, props?: Omit<FieldProps, "defaultProvider">) => FieldSchemaUnsafe<FieldKind.Required, T_3>;
816
883
  };
817
884
 
885
+ // @public
886
+ export type SchemaUnionToIntersection<T> = [T] extends [
887
+ CustomizedSchemaTyping<unknown, CustomTypes>
888
+ ] ? T : UnionToIntersection<T>;
889
+
818
890
  // @public
819
891
  type ScopedSchemaName<TScope extends string | undefined, TName extends number | string> = TScope extends undefined ? `${TName}` : `${TScope}.${TName}`;
820
892
 
@@ -830,6 +902,26 @@ export const SharedTree: SharedObjectKind<ITree>;
830
902
 
831
903
  export { Side }
832
904
 
905
+ // @public @sealed
906
+ export interface StrictTypes<TSchema extends ImplicitAllowedTypes, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema>, TOutput extends TreeNode | TreeLeafValue = DefaultTreeNodeFromImplicitAllowedTypes<TSchema>> {
907
+ // (undocumented)
908
+ input: TInput;
909
+ // (undocumented)
910
+ output: TOutput;
911
+ // (undocumented)
912
+ readWrite: TInput extends never ? never : TOutput;
913
+ }
914
+
915
+ // @public
916
+ export interface StrictTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>, TOutput = DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>> {
917
+ // (undocumented)
918
+ input: TInput;
919
+ // (undocumented)
920
+ output: TOutput;
921
+ // (undocumented)
922
+ readWrite: TOutput;
923
+ }
924
+
833
925
  // @public
834
926
  export interface Tagged<V, T extends string = string> {
835
927
  // (undocumented)
@@ -940,10 +1032,10 @@ export interface TreeNodeApi {
940
1032
  }
941
1033
 
942
1034
  // @public
943
- export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
1035
+ export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = GetTypes<TSchema>["output"];
944
1036
 
945
1037
  // @public
946
- type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
1038
+ type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["output"];
947
1039
 
948
1040
  // @public @sealed
949
1041
  export type TreeNodeSchema<Name extends string = string, Kind extends NodeKind = NodeKind, TNode extends TreeNode | TreeLeafValue = TreeNode | TreeLeafValue, TBuild = never, ImplicitlyConstructable extends boolean = boolean, Info = unknown, TCustomMetadata = unknown> = (TNode extends TreeNode ? TreeNodeSchemaClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata> : never) | TreeNodeSchemaNonClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata>;
@@ -17,11 +17,22 @@ type ApplyKind<T, Kind extends FieldKind> = {
17
17
  [FieldKind.Identifier]: T;
18
18
  }[Kind];
19
19
 
20
+ // @public
21
+ export type ApplyKindAssignment<T, Kind extends FieldKind> = [Kind] extends [
22
+ FieldKind.Required
23
+ ] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : never;
24
+
20
25
  // @public
21
26
  type ApplyKindInput<T, Kind extends FieldKind, DefaultsAreOptional extends boolean> = [
22
27
  Kind
23
28
  ] extends [FieldKind.Required] ? T : [Kind] extends [FieldKind.Optional] ? T | undefined : [Kind] extends [FieldKind.Identifier] ? DefaultsAreOptional extends true ? T | undefined : T : never;
24
29
 
30
+ // @public
31
+ export type AssignableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindAssignment<GetTypes<Types>["readWrite"], Kind> : [TSchema] extends [ImplicitAllowedTypes] ? GetTypes<TSchema>["readWrite"] : never;
32
+
33
+ // @public
34
+ export type AssignableTreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types> ? ApplyKindAssignment<GetTypesUnsafe<Types>["readWrite"], Kind> : GetTypesUnsafe<TSchema>["readWrite"];
35
+
25
36
  // @public
26
37
  export enum AttachState {
27
38
  Attached = "Attached",
@@ -70,10 +81,40 @@ export interface ContainerSchema {
70
81
  readonly initialObjects: Record<string, SharedObjectKind>;
71
82
  }
72
83
 
84
+ // @public
85
+ export type CustomizedSchemaTyping<TSchema, TCustom extends CustomTypes> = TSchema & {
86
+ [CustomizedTyping]: TCustom;
87
+ };
88
+
89
+ // @public
90
+ export const CustomizedTyping: unique symbol;
91
+
92
+ // @public
93
+ export type CustomizedTyping = typeof CustomizedTyping;
94
+
95
+ // @public @sealed
96
+ export interface CustomTypes {
97
+ readonly input: unknown;
98
+ readonly output: TreeLeafValue | TreeNode;
99
+ readonly readWrite: TreeLeafValue | TreeNode;
100
+ }
101
+
102
+ // @public
103
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
104
+
105
+ // @public
106
+ export type DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
107
+
73
108
  // @public @sealed
74
109
  interface DefaultProvider extends ErasedType<"@fluidframework/tree.FieldProvider"> {
75
110
  }
76
111
 
112
+ // @public
113
+ export type DefaultTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
114
+
115
+ // @public
116
+ export type DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
117
+
77
118
  // @public @sealed
78
119
  export abstract class ErasedType<out Name = unknown> {
79
120
  static [Symbol.hasInstance](value: never): value is never;
@@ -146,6 +187,16 @@ export type FluidObject<T = unknown> = {
146
187
  // @public
147
188
  export type FluidObjectProviderKeys<T, TProp extends keyof T = keyof T> = string extends TProp ? never : number extends TProp ? never : TProp extends keyof Required<T>[TProp] ? Required<T>[TProp] extends Required<Required<T>[TProp]>[TProp] ? TProp : never : never;
148
189
 
190
+ // @public
191
+ export type GetTypes<TSchema extends ImplicitAllowedTypes> = [TSchema] extends [
192
+ CustomizedSchemaTyping<unknown, infer TCustom>
193
+ ] ? TCustom : StrictTypes<TSchema>;
194
+
195
+ // @public
196
+ export type GetTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [
197
+ TSchema
198
+ ] extends [CustomizedSchemaTyping<unknown, infer TCustom>] ? TCustom : StrictTypesUnsafe<TSchema>;
199
+
149
200
  // @public
150
201
  export interface IConnection {
151
202
  readonly id: string;
@@ -431,7 +482,7 @@ export type InsertableObjectFromSchemaRecordUnsafe<T extends Unenforced<Restrict
431
482
  };
432
483
 
433
484
  // @public
434
- export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
485
+ export type InsertableTreeFieldFromImplicitField<TSchemaInput extends ImplicitFieldSchema, TSchema = [TSchemaInput] extends [CustomizedSchemaTyping<unknown, CustomTypes>] ? TSchemaInput : SchemaUnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchema<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypes<TSchema> : never;
435
486
 
436
487
  // @public
437
488
  export type InsertableTreeFieldFromImplicitFieldUnsafe<TSchemaInput extends Unenforced<ImplicitFieldSchema>, TSchema = UnionToIntersection<TSchemaInput>> = [TSchema] extends [FieldSchemaUnsafe<infer Kind, infer Types>] ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, true> : [TSchema] extends [ImplicitAllowedTypes] ? InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema> : never;
@@ -449,12 +500,10 @@ LazyItem<infer TSchema extends TreeNodeSchemaUnsafe>,
449
500
  ] ? InsertableTypedNodeUnsafe<TSchema> | InsertableTreeNodeFromAllowedTypesUnsafe<Rest> : never;
450
501
 
451
502
  // @public
452
- export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = [
453
- TSchema
454
- ] extends [TreeNodeSchema] ? InsertableTypedNode<TSchema> : [TSchema] extends [AllowedTypes] ? InsertableTreeNodeFromAllowedTypes<TSchema> : never;
503
+ export type InsertableTreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes> = GetTypes<TSchema>["input"];
455
504
 
456
505
  // @public
457
- export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = [TSchema] extends [TreeNodeSchemaUnsafe] ? InsertableTypedNodeUnsafe<TSchema> : [TSchema] extends [AllowedTypesUnsafe] ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema> : never;
506
+ export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["input"];
458
507
 
459
508
  // @public
460
509
  export type InsertableTypedNode<TSchema extends TreeNodeSchema, T = UnionToIntersection<TSchema>> = (T extends TreeNodeSchema<string, NodeKind, TreeNode | TreeLeafValue, never, true> ? NodeBuilderData<T> : never) | (T extends TreeNodeSchema ? Unhydrated<TreeNode extends NodeFromSchema<T> ? never : NodeFromSchema<T>> : never);
@@ -627,12 +676,30 @@ export interface NodeSchemaOptions<out TCustomMetadata = unknown> {
627
676
 
628
677
  // @public
629
678
  type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> = {
630
- -readonly [Property in keyof T]: Property extends string ? TreeFieldFromImplicitField<T[Property]> : unknown;
679
+ -readonly [Property in keyof T as [
680
+ AssignableTreeFieldFromImplicitField<T[Property & string]>
681
+ ] extends [never | undefined] ? never : Property]: AssignableTreeFieldFromImplicitField<T[Property & string]>;
682
+ } & {
683
+ readonly [Property in keyof T]: TreeFieldFromImplicitField<T[Property & string]>;
631
684
  };
632
685
 
633
686
  // @public
634
687
  type ObjectFromSchemaRecordUnsafe<T extends Unenforced<RestrictiveStringRecord<ImplicitFieldSchema>>> = {
635
- -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
688
+ -readonly [Property in keyof T as [T[Property]] extends [
689
+ CustomizedSchemaTyping<unknown, {
690
+ readonly readWrite: never;
691
+ readonly input: unknown;
692
+ readonly output: TreeNode | TreeLeafValue;
693
+ }>
694
+ ] ? never : Property]: AssignableTreeFieldFromImplicitFieldUnsafe<T[Property]>;
695
+ } & {
696
+ readonly [Property in keyof T as [T[Property]] extends [
697
+ CustomizedSchemaTyping<unknown, {
698
+ readonly readWrite: never;
699
+ readonly input: unknown;
700
+ readonly output: TreeNode | TreeLeafValue;
701
+ }>
702
+ ] ? Property : never]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
636
703
  };
637
704
 
638
705
  // @public
@@ -779,6 +846,11 @@ export const schemaStatics: {
779
846
  readonly requiredRecursive: <const T_3 extends unknown>(t: T_3, props?: Omit<FieldProps, "defaultProvider">) => FieldSchemaUnsafe<FieldKind.Required, T_3>;
780
847
  };
781
848
 
849
+ // @public
850
+ export type SchemaUnionToIntersection<T> = [T] extends [
851
+ CustomizedSchemaTyping<unknown, CustomTypes>
852
+ ] ? T : UnionToIntersection<T>;
853
+
782
854
  // @public
783
855
  type ScopedSchemaName<TScope extends string | undefined, TName extends number | string> = TScope extends undefined ? `${TName}` : `${TScope}.${TName}`;
784
856
 
@@ -790,6 +862,26 @@ export interface SharedObjectKind<out TSharedObject = unknown> extends ErasedTyp
790
862
  // @public
791
863
  export const SharedTree: SharedObjectKind<ITree>;
792
864
 
865
+ // @public @sealed
866
+ export interface StrictTypes<TSchema extends ImplicitAllowedTypes, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypes<TSchema>, TOutput extends TreeNode | TreeLeafValue = DefaultTreeNodeFromImplicitAllowedTypes<TSchema>> {
867
+ // (undocumented)
868
+ input: TInput;
869
+ // (undocumented)
870
+ output: TOutput;
871
+ // (undocumented)
872
+ readWrite: TInput extends never ? never : TOutput;
873
+ }
874
+
875
+ // @public
876
+ export interface StrictTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>, TInput = DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>, TOutput = DefaultTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>> {
877
+ // (undocumented)
878
+ input: TInput;
879
+ // (undocumented)
880
+ output: TOutput;
881
+ // (undocumented)
882
+ readWrite: TOutput;
883
+ }
884
+
793
885
  // @public
794
886
  export interface Tagged<V, T extends string = string> {
795
887
  // (undocumented)
@@ -900,10 +992,10 @@ export interface TreeNodeApi {
900
992
  }
901
993
 
902
994
  // @public
903
- export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = TSchema extends TreeNodeSchema ? NodeFromSchema<TSchema> : TSchema extends AllowedTypes ? NodeFromSchema<FlexListToUnion<TSchema>> : unknown;
995
+ export type TreeNodeFromImplicitAllowedTypes<TSchema extends ImplicitAllowedTypes = TreeNodeSchema> = GetTypes<TSchema>["output"];
904
996
 
905
997
  // @public
906
- type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = TSchema extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<TSchema> : TSchema extends AllowedTypesUnsafe ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>> : unknown;
998
+ type TreeNodeFromImplicitAllowedTypesUnsafe<TSchema extends Unenforced<ImplicitAllowedTypes>> = GetTypesUnsafe<TSchema>["output"];
907
999
 
908
1000
  // @public @sealed
909
1001
  export type TreeNodeSchema<Name extends string = string, Kind extends NodeKind = NodeKind, TNode extends TreeNode | TreeLeafValue = TreeNode | TreeLeafValue, TBuild = never, ImplicitlyConstructable extends boolean = boolean, Info = unknown, TCustomMetadata = unknown> = (TNode extends TreeNode ? TreeNodeSchemaClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata> : never) | TreeNodeSchemaNonClass<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info, never, TCustomMetadata>;
package/dist/alpha.d.ts CHANGED
@@ -21,6 +21,9 @@ export {
21
21
 
22
22
  // @public APIs
23
23
  AllowedTypes,
24
+ ApplyKindAssignment,
25
+ AssignableTreeFieldFromImplicitField,
26
+ AssignableTreeFieldFromImplicitFieldUnsafe,
24
27
  AttachState,
25
28
  CommitKind,
26
29
  CommitMetadata,
@@ -28,6 +31,13 @@ export {
28
31
  ConnectionStateType,
29
32
  ContainerAttachProps,
30
33
  ContainerSchema,
34
+ CustomTypes,
35
+ CustomizedSchemaTyping,
36
+ CustomizedTyping,
37
+ DefaultInsertableTreeNodeFromImplicitAllowedTypes,
38
+ DefaultInsertableTreeNodeFromImplicitAllowedTypesUnsafe,
39
+ DefaultTreeNodeFromImplicitAllowedTypes,
40
+ DefaultTreeNodeFromImplicitAllowedTypesUnsafe,
31
41
  ErasedType,
32
42
  FieldKind,
33
43
  FieldProps,
@@ -36,6 +46,8 @@ export {
36
46
  FieldSchemaUnsafe,
37
47
  FluidObject,
38
48
  FluidObjectProviderKeys,
49
+ GetTypes,
50
+ GetTypesUnsafe,
39
51
  IConnection,
40
52
  ICriticalContainerError,
41
53
  IDisposable,
@@ -96,8 +108,11 @@ export {
96
108
  RunTransaction,
97
109
  SchemaCompatibilityStatus,
98
110
  SchemaFactory,
111
+ SchemaUnionToIntersection,
99
112
  SharedObjectKind,
100
113
  SharedTree,
114
+ StrictTypes,
115
+ StrictTypesUnsafe,
101
116
  Tagged,
102
117
  TelemetryBaseEventPropertyType,
103
118
  TransactionConstraint,
@@ -142,7 +157,9 @@ export {
142
157
 
143
158
  // @alpha APIs
144
159
  BranchableTree,
160
+ Component,
145
161
  ConciseTree,
162
+ Customizer,
146
163
  EncodeOptions,
147
164
  FactoryContent,
148
165
  FactoryContentObject,
@@ -160,6 +177,7 @@ export {
160
177
  InsertableField,
161
178
  IsUnion,
162
179
  JsonArrayNodeSchema,
180
+ JsonAsTree,
163
181
  JsonCompatible,
164
182
  JsonCompatibleObject,
165
183
  JsonFieldSchema,
@@ -215,7 +233,9 @@ export {
215
233
  configuredSharedTree,
216
234
  createIdentifierIndex,
217
235
  createSimpleTreeIndex,
236
+ customizeSchemaTyping,
218
237
  enumFromStrings,
238
+ evaluateLazySchema,
219
239
  extractPersistedSchema,
220
240
  getBranch,
221
241
  getJsonSchema,