@fluidframework/tree 2.4.0 → 2.5.0-302463

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.
Files changed (241) hide show
  1. package/.vscode/settings.json +11 -1
  2. package/api-report/tree.alpha.api.md +148 -51
  3. package/api-report/tree.beta.api.md +83 -38
  4. package/api-report/tree.legacy.alpha.api.md +83 -38
  5. package/api-report/tree.legacy.public.api.md +83 -38
  6. package/api-report/tree.public.api.md +83 -38
  7. package/dist/alpha.d.ts +17 -2
  8. package/dist/beta.d.ts +6 -0
  9. package/dist/events/interop.d.ts +1 -7
  10. package/dist/events/interop.d.ts.map +1 -1
  11. package/dist/events/interop.js.map +1 -1
  12. package/dist/feature-libraries/chunked-forest/basicChunk.js +1 -1
  13. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  14. package/dist/feature-libraries/chunked-forest/uniformChunk.js +1 -1
  15. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  16. package/dist/feature-libraries/object-forest/objectForest.js +1 -1
  17. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  18. package/dist/feature-libraries/treeCursorUtils.js +2 -2
  19. package/dist/feature-libraries/treeCursorUtils.js.map +1 -1
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/internalTypes.d.ts +1 -1
  25. package/dist/internalTypes.d.ts.map +1 -1
  26. package/dist/internalTypes.js.map +1 -1
  27. package/dist/legacy.d.ts +6 -0
  28. package/dist/packageVersion.d.ts +1 -1
  29. package/dist/packageVersion.d.ts.map +1 -1
  30. package/dist/packageVersion.js +1 -1
  31. package/dist/packageVersion.js.map +1 -1
  32. package/dist/public.d.ts +6 -0
  33. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  34. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  35. package/dist/shared-tree/sharedTree.d.ts +1 -1
  36. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  37. package/dist/shared-tree/sharedTree.js.map +1 -1
  38. package/dist/shared-tree/treeApi.d.ts +6 -6
  39. package/dist/shared-tree/treeApi.d.ts.map +1 -1
  40. package/dist/shared-tree/treeApi.js.map +1 -1
  41. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  42. package/dist/shared-tree/treeCheckout.js +2 -0
  43. package/dist/shared-tree/treeCheckout.js.map +1 -1
  44. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  45. package/dist/shared-tree-core/editManager.js +12 -7
  46. package/dist/shared-tree-core/editManager.js.map +1 -1
  47. package/dist/simple-tree/api/create.d.ts +3 -3
  48. package/dist/simple-tree/api/create.d.ts.map +1 -1
  49. package/dist/simple-tree/api/create.js.map +1 -1
  50. package/dist/simple-tree/api/customTree.js +2 -2
  51. package/dist/simple-tree/api/customTree.js.map +1 -1
  52. package/dist/simple-tree/api/index.d.ts +3 -3
  53. package/dist/simple-tree/api/index.d.ts.map +1 -1
  54. package/dist/simple-tree/api/index.js +1 -2
  55. package/dist/simple-tree/api/index.js.map +1 -1
  56. package/dist/simple-tree/api/schemaCreationUtilities.d.ts +33 -25
  57. package/dist/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  58. package/dist/simple-tree/api/schemaCreationUtilities.js +31 -21
  59. package/dist/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  60. package/dist/simple-tree/api/schemaFactory.d.ts +5 -1
  61. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  62. package/dist/simple-tree/api/schemaFactory.js +4 -0
  63. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  64. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +3 -3
  65. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  66. package/dist/simple-tree/api/tree.d.ts +13 -4
  67. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  68. package/dist/simple-tree/api/tree.js.map +1 -1
  69. package/dist/simple-tree/api/treeApiBeta.d.ts.map +1 -1
  70. package/dist/simple-tree/api/treeApiBeta.js.map +1 -1
  71. package/dist/simple-tree/api/typesUnsafe.d.ts +69 -17
  72. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  73. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  74. package/dist/simple-tree/arrayNode.d.ts +14 -3
  75. package/dist/simple-tree/arrayNode.d.ts.map +1 -1
  76. package/dist/simple-tree/arrayNode.js.map +1 -1
  77. package/dist/simple-tree/core/treeNodeSchema.d.ts +10 -6
  78. package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  79. package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
  80. package/dist/simple-tree/core/withType.d.ts +3 -1
  81. package/dist/simple-tree/core/withType.d.ts.map +1 -1
  82. package/dist/simple-tree/core/withType.js.map +1 -1
  83. package/dist/simple-tree/index.d.ts +4 -4
  84. package/dist/simple-tree/index.d.ts.map +1 -1
  85. package/dist/simple-tree/index.js +1 -2
  86. package/dist/simple-tree/index.js.map +1 -1
  87. package/dist/simple-tree/mapNode.d.ts.map +1 -1
  88. package/dist/simple-tree/mapNode.js +3 -0
  89. package/dist/simple-tree/mapNode.js.map +1 -1
  90. package/dist/simple-tree/objectNode.d.ts +4 -2
  91. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  92. package/dist/simple-tree/objectNode.js.map +1 -1
  93. package/dist/simple-tree/schemaTypes.d.ts +168 -14
  94. package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
  95. package/dist/simple-tree/schemaTypes.js +6 -1
  96. package/dist/simple-tree/schemaTypes.js.map +1 -1
  97. package/dist/simple-tree/toMapTree.d.ts +4 -2
  98. package/dist/simple-tree/toMapTree.d.ts.map +1 -1
  99. package/dist/simple-tree/toMapTree.js.map +1 -1
  100. package/dist/util/index.d.ts +2 -1
  101. package/dist/util/index.d.ts.map +1 -1
  102. package/dist/util/index.js +3 -1
  103. package/dist/util/index.js.map +1 -1
  104. package/dist/util/typeUtils.d.ts +61 -0
  105. package/dist/util/typeUtils.d.ts.map +1 -1
  106. package/dist/util/typeUtils.js +27 -0
  107. package/dist/util/typeUtils.js.map +1 -1
  108. package/lib/alpha.d.ts +17 -2
  109. package/lib/beta.d.ts +6 -0
  110. package/lib/events/interop.d.ts +1 -7
  111. package/lib/events/interop.d.ts.map +1 -1
  112. package/lib/events/interop.js.map +1 -1
  113. package/lib/feature-libraries/chunked-forest/basicChunk.js +1 -1
  114. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  115. package/lib/feature-libraries/chunked-forest/uniformChunk.js +1 -1
  116. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  117. package/lib/feature-libraries/object-forest/objectForest.js +1 -1
  118. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  119. package/lib/feature-libraries/treeCursorUtils.js +2 -2
  120. package/lib/feature-libraries/treeCursorUtils.js.map +1 -1
  121. package/lib/index.d.ts +2 -2
  122. package/lib/index.d.ts.map +1 -1
  123. package/lib/index.js +1 -1
  124. package/lib/index.js.map +1 -1
  125. package/lib/internalTypes.d.ts +1 -1
  126. package/lib/internalTypes.d.ts.map +1 -1
  127. package/lib/internalTypes.js.map +1 -1
  128. package/lib/legacy.d.ts +6 -0
  129. package/lib/packageVersion.d.ts +1 -1
  130. package/lib/packageVersion.d.ts.map +1 -1
  131. package/lib/packageVersion.js +1 -1
  132. package/lib/packageVersion.js.map +1 -1
  133. package/lib/public.d.ts +6 -0
  134. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  135. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  136. package/lib/shared-tree/sharedTree.d.ts +1 -1
  137. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  138. package/lib/shared-tree/sharedTree.js.map +1 -1
  139. package/lib/shared-tree/treeApi.d.ts +6 -6
  140. package/lib/shared-tree/treeApi.d.ts.map +1 -1
  141. package/lib/shared-tree/treeApi.js.map +1 -1
  142. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  143. package/lib/shared-tree/treeCheckout.js +2 -0
  144. package/lib/shared-tree/treeCheckout.js.map +1 -1
  145. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  146. package/lib/shared-tree-core/editManager.js +12 -7
  147. package/lib/shared-tree-core/editManager.js.map +1 -1
  148. package/lib/simple-tree/api/create.d.ts +3 -3
  149. package/lib/simple-tree/api/create.d.ts.map +1 -1
  150. package/lib/simple-tree/api/create.js.map +1 -1
  151. package/lib/simple-tree/api/customTree.js +2 -2
  152. package/lib/simple-tree/api/customTree.js.map +1 -1
  153. package/lib/simple-tree/api/index.d.ts +3 -3
  154. package/lib/simple-tree/api/index.d.ts.map +1 -1
  155. package/lib/simple-tree/api/index.js +1 -1
  156. package/lib/simple-tree/api/index.js.map +1 -1
  157. package/lib/simple-tree/api/schemaCreationUtilities.d.ts +33 -25
  158. package/lib/simple-tree/api/schemaCreationUtilities.d.ts.map +1 -1
  159. package/lib/simple-tree/api/schemaCreationUtilities.js +30 -19
  160. package/lib/simple-tree/api/schemaCreationUtilities.js.map +1 -1
  161. package/lib/simple-tree/api/schemaFactory.d.ts +5 -1
  162. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  163. package/lib/simple-tree/api/schemaFactory.js +4 -0
  164. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  165. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +3 -3
  166. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  167. package/lib/simple-tree/api/tree.d.ts +13 -4
  168. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  169. package/lib/simple-tree/api/tree.js.map +1 -1
  170. package/lib/simple-tree/api/treeApiBeta.d.ts.map +1 -1
  171. package/lib/simple-tree/api/treeApiBeta.js.map +1 -1
  172. package/lib/simple-tree/api/typesUnsafe.d.ts +69 -17
  173. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  174. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  175. package/lib/simple-tree/arrayNode.d.ts +14 -3
  176. package/lib/simple-tree/arrayNode.d.ts.map +1 -1
  177. package/lib/simple-tree/arrayNode.js.map +1 -1
  178. package/lib/simple-tree/core/treeNodeSchema.d.ts +10 -6
  179. package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
  180. package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
  181. package/lib/simple-tree/core/withType.d.ts +3 -1
  182. package/lib/simple-tree/core/withType.d.ts.map +1 -1
  183. package/lib/simple-tree/core/withType.js.map +1 -1
  184. package/lib/simple-tree/index.d.ts +4 -4
  185. package/lib/simple-tree/index.d.ts.map +1 -1
  186. package/lib/simple-tree/index.js +2 -2
  187. package/lib/simple-tree/index.js.map +1 -1
  188. package/lib/simple-tree/mapNode.d.ts.map +1 -1
  189. package/lib/simple-tree/mapNode.js +3 -0
  190. package/lib/simple-tree/mapNode.js.map +1 -1
  191. package/lib/simple-tree/objectNode.d.ts +4 -2
  192. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  193. package/lib/simple-tree/objectNode.js.map +1 -1
  194. package/lib/simple-tree/schemaTypes.d.ts +168 -14
  195. package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
  196. package/lib/simple-tree/schemaTypes.js +6 -1
  197. package/lib/simple-tree/schemaTypes.js.map +1 -1
  198. package/lib/simple-tree/toMapTree.d.ts +4 -2
  199. package/lib/simple-tree/toMapTree.d.ts.map +1 -1
  200. package/lib/simple-tree/toMapTree.js.map +1 -1
  201. package/lib/util/index.d.ts +2 -1
  202. package/lib/util/index.d.ts.map +1 -1
  203. package/lib/util/index.js +1 -0
  204. package/lib/util/index.js.map +1 -1
  205. package/lib/util/typeUtils.d.ts +61 -0
  206. package/lib/util/typeUtils.d.ts.map +1 -1
  207. package/lib/util/typeUtils.js +25 -1
  208. package/lib/util/typeUtils.js.map +1 -1
  209. package/package.json +48 -32
  210. package/src/events/interop.ts +1 -12
  211. package/src/feature-libraries/chunked-forest/basicChunk.ts +1 -1
  212. package/src/feature-libraries/chunked-forest/uniformChunk.ts +1 -1
  213. package/src/feature-libraries/object-forest/objectForest.ts +1 -1
  214. package/src/feature-libraries/treeCursorUtils.ts +2 -2
  215. package/src/index.ts +16 -1
  216. package/src/internalTypes.ts +4 -0
  217. package/src/packageVersion.ts +1 -1
  218. package/src/shared-tree/schematizingTreeView.ts +6 -2
  219. package/src/shared-tree/sharedTree.ts +4 -2
  220. package/src/shared-tree/treeApi.ts +19 -9
  221. package/src/shared-tree/treeCheckout.ts +2 -0
  222. package/src/shared-tree-core/editManager.ts +16 -7
  223. package/src/simple-tree/api/create.ts +12 -7
  224. package/src/simple-tree/api/customTree.ts +2 -2
  225. package/src/simple-tree/api/index.ts +6 -1
  226. package/src/simple-tree/api/schemaCreationUtilities.ts +58 -35
  227. package/src/simple-tree/api/schemaFactory.ts +4 -0
  228. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +3 -3
  229. package/src/simple-tree/api/tree.ts +27 -4
  230. package/src/simple-tree/api/treeApiBeta.ts +6 -2
  231. package/src/simple-tree/api/typesUnsafe.ts +126 -30
  232. package/src/simple-tree/arrayNode.ts +34 -14
  233. package/src/simple-tree/core/treeNodeSchema.ts +11 -6
  234. package/src/simple-tree/core/withType.ts +10 -1
  235. package/src/simple-tree/index.ts +19 -2
  236. package/src/simple-tree/mapNode.ts +6 -3
  237. package/src/simple-tree/objectNode.ts +5 -3
  238. package/src/simple-tree/schemaTypes.ts +215 -23
  239. package/src/simple-tree/toMapTree.ts +4 -1
  240. package/src/util/index.ts +6 -0
  241. package/src/util/typeUtils.ts +87 -0
@@ -13,8 +13,10 @@ import type {
13
13
  InternalTreeNode,
14
14
  NodeKind,
15
15
  TreeNode,
16
+ TreeNodeSchema,
16
17
  TreeNodeSchemaClass,
17
18
  } from "../core/index.js";
19
+ import type { UnionToTuple } from "../../util/index.js";
18
20
 
19
21
  /*
20
22
  * This file does two things:
@@ -40,7 +42,7 @@ export function singletonSchema<TScope extends string, TName extends string | nu
40
42
  name: TName,
41
43
  ) {
42
44
  class SingletonSchema extends factory.object(name, {}) {
43
- public constructor(data?: InternalTreeNode) {
45
+ public constructor(data?: InternalTreeNode | Record<string, never>) {
44
46
  super(data ?? {});
45
47
  }
46
48
  public get value(): TName {
@@ -48,7 +50,7 @@ export function singletonSchema<TScope extends string, TName extends string | nu
48
50
  }
49
51
  }
50
52
 
51
- type NodeType = TreeNode & { readonly value: TName };
53
+ type SingletonNodeType = TreeNode & { readonly value: TName };
52
54
 
53
55
  // Returning SingletonSchema without a type conversion results in TypeScript generating something like `readonly "__#124291@#brand": unknown;`
54
56
  // for the private brand field of TreeNode.
@@ -58,11 +60,13 @@ export function singletonSchema<TScope extends string, TName extends string | nu
58
60
  const toReturn: TreeNodeSchemaClass<
59
61
  ScopedSchemaName<TScope, TName>,
60
62
  NodeKind.Object,
61
- NodeType,
62
- never,
63
+ SingletonNodeType,
64
+ Record<string, never>,
63
65
  true
64
66
  > &
65
- (new () => NodeType) = SingletonSchema;
67
+ (new (
68
+ data?: InternalTreeNode | Record<string, never>,
69
+ ) => SingletonNodeType) = SingletonSchema;
66
70
 
67
71
  return toReturn;
68
72
  }
@@ -84,15 +88,14 @@ export function singletonSchema<TScope extends string, TName extends string | nu
84
88
  * // Define the schema for each member of the enum using a nested scope to group them together.
85
89
  * const ModeNodes = adaptEnum(new SchemaFactory(`${schemaFactory.scope}.Mode`), Mode);
86
90
  * // Defined the types of the nodes which correspond to this the schema.
87
- * type ModeNodes = NodeFromSchema<(typeof ModeNodes)[keyof typeof ModeNodes]>;
91
+ * type ModeNodes = NodeFromSchema<(typeof ModeNodes.schema)[number]>;
88
92
  * // An example schema which has an enum as a child.
89
93
  * class Parent extends schemaFactory.object("Parent", {
90
- * // typedObjectValues extracts a list of all the fields of ModeNodes, which are the schema for each enum member.
91
- * // This means any member of the enum is allowed in this field.
92
- * mode: typedObjectValues(ModeNodes),
94
+ * // adaptEnum's return value has a ".schema" property can be use as an `AllowedTypes` array allowing any of the members of the enum.
95
+ * mode: ModeNodes.schema,
93
96
  * }) {}
94
97
  *
95
- * // Example usage of enum-based nodes, showing what type to use and that `.value` can be used to read out the enum value.
98
+ * // Example usage of enum based nodes, showing what type to use and that `.value` can be used to read out the enum value.
96
99
  * function getValue(node: ModeNodes): Mode {
97
100
  * return node.value;
98
101
  * }
@@ -131,35 +134,36 @@ export function adaptEnum<
131
134
  typeof singletonSchema<TScope, TEnum[Property]>
132
135
  >;
133
136
  };
137
+
138
+ type SchemaArray = UnionToTuple<TOut[keyof TEnum]>;
139
+ const schemaArray: TreeNodeSchema[] = [];
140
+
134
141
  // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
135
142
  const factoryOut = <TValue extends Values>(value: TValue) => {
136
143
  return new out[inverse.get(value) ?? fail("missing enum value")]() as NodeFromSchema<
137
144
  ReturnType<typeof singletonSchema<TScope, TValue>>
138
145
  >;
139
146
  };
140
- const out = factoryOut as typeof factoryOut & TOut;
147
+ const out = factoryOut as typeof factoryOut & TOut & { readonly schema: SchemaArray };
141
148
  for (const [key, value] of Object.entries(members)) {
149
+ const schema = singletonSchema(factory, value);
150
+ schemaArray.push(schema);
142
151
  Object.defineProperty(out, key, {
143
152
  enumerable: true,
144
153
  configurable: false,
145
154
  writable: false,
146
- value: singletonSchema(factory, value),
155
+ value: schema,
147
156
  });
148
157
  }
149
158
 
150
- return out;
151
- }
159
+ Object.defineProperty(out, "schema", {
160
+ enumerable: true,
161
+ configurable: false,
162
+ writable: false,
163
+ value: schemaArray,
164
+ });
152
165
 
153
- /**
154
- * `Object.values`, but with more specific types.
155
- * @remarks
156
- * Useful with collections of schema, like those returned by {@link adaptEnum} or {@link enumFromStrings}.
157
- * @alpha
158
- */
159
- export function typedObjectValues<TKey extends string, TValues>(
160
- object: Record<TKey, TValues>,
161
- ): TValues[] {
162
- return Object.values(object);
166
+ return out;
163
167
  }
164
168
 
165
169
  /**
@@ -171,44 +175,63 @@ export function typedObjectValues<TKey extends string, TValues>(
171
175
  * The produced nodes use the provided strings as their `name`, and don't store any data beyond that.
172
176
  * @example
173
177
  * ```typescript
178
+ * const schemaFactory = new SchemaFactory("com.myApp");
174
179
  * const Mode = enumFromStrings(schemaFactory, ["Fun", "Cool"]);
175
- * type Mode = NodeFromSchema<(typeof Mode)[keyof typeof Mode]>;
180
+ * type Mode = NodeFromSchema<(typeof Mode.schema)[number]>;
176
181
  * const nodeFromString: Mode = Mode("Fun");
177
182
  * const nodeFromSchema: Mode = new Mode.Fun();
178
- * const nameFromNode = nodeFromSchema.value;
179
183
  *
180
- * class Parent extends schemaFactory.object("Parent", { mode: typedObjectValues(Mode) }) {}
184
+ * // Schema nodes have a strongly typed `.value` property.
185
+ * const nameFromNode: "Fun" | "Cool" = nodeFromSchema.value;
186
+ *
187
+ * class Parent extends schemaFactory.object("Parent", { mode: Mode.schema }) {}
181
188
  * ```
182
189
  * @see {@link adaptEnum} for a similar function that works on enums instead of arrays of strings.
183
190
  * @alpha
184
191
  */
185
192
  // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
186
- export function enumFromStrings<TScope extends string, const Members extends string>(
187
- factory: SchemaFactory<TScope>,
188
- members: readonly Members[],
189
- ) {
193
+ export function enumFromStrings<
194
+ TScope extends string,
195
+ const Members extends readonly string[],
196
+ >(factory: SchemaFactory<TScope>, members: Members) {
190
197
  const names = new Set(members);
191
198
  if (names.size !== members.length) {
192
199
  throw new UsageError("All members of enums must have distinct names");
193
200
  }
194
201
 
195
- type TOut = Record<Members, ReturnType<typeof singletonSchema<TScope, Members>>>;
202
+ type TOut = Record<
203
+ Members[number],
204
+ ReturnType<typeof singletonSchema<TScope, Members[number]>>
205
+ >;
196
206
  // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
197
- const factoryOut = <TValue extends Members>(value: TValue) => {
207
+ const factoryOut = <TValue extends Members[number]>(value: TValue) => {
198
208
  return new out[value]() as NodeFromSchema<
199
209
  ReturnType<typeof singletonSchema<TScope, TValue>>
200
210
  >;
201
211
  };
202
- const out = factoryOut as typeof factoryOut & TOut;
212
+
213
+ type SchemaArray = UnionToTuple<TOut[Members[number]]>;
214
+ const schemaArray: TreeNodeSchema[] = [];
215
+
216
+ const out = factoryOut as typeof factoryOut & TOut & { readonly schema: SchemaArray };
203
217
  for (const name of members) {
218
+ const schema = singletonSchema(factory, name);
219
+ schemaArray.push(schema);
204
220
  Object.defineProperty(out, name, {
205
221
  enumerable: true,
206
222
  configurable: false,
207
223
  writable: false,
208
- value: singletonSchema(factory, name),
224
+ value: schema,
209
225
  });
210
226
  }
211
227
 
228
+ Object.defineProperty(out, "schema", {
229
+ enumerable: true,
230
+ configurable: false,
231
+ writable: false,
232
+ value: schemaArray,
233
+ });
234
+
212
235
  return out;
213
236
  }
214
237
 
@@ -120,6 +120,10 @@ export type ScopedSchemaName<
120
120
  * Typically this is just `string` but it is also possible to use `string` or `number` based enums if you prefer to identify your types that way.
121
121
  *
122
122
  * @remarks
123
+ * For details related to inputting data constrained by schema (including via assignment), and how non-exact schema types are handled in general refer to {@link Input}.
124
+ * For information about recursive schema support, see methods postfixed with "recursive" and {@link ValidateRecursiveSchema}.
125
+ * To apply schema defined with this factory to a tree, see {@link ViewableTree.viewWith} and {@link TreeViewConfiguration}.
126
+ *
123
127
  * All schema produced by this factory get a {@link TreeNodeSchemaCore.identifier|unique identifier} by combining the {@link SchemaFactory.scope} with the schema's `Name`.
124
128
  * The `Name` part may be explicitly provided as a parameter, or inferred as a structural combination of the provided types.
125
129
  * The APIs which use this second approach, structural naming, also deduplicate all equivalent calls.
@@ -97,7 +97,7 @@ function convertArrayNodeSchema(schema: SimpleArrayNodeSchema): JsonArrayNodeSch
97
97
  });
98
98
 
99
99
  const items: JsonFieldSchema =
100
- allowedTypes.length === 1 ? allowedTypes[0] ?? oob() : { anyOf: allowedTypes };
100
+ allowedTypes.length === 1 ? (allowedTypes[0] ?? oob()) : { anyOf: allowedTypes };
101
101
 
102
102
  return {
103
103
  type: "array",
@@ -144,7 +144,7 @@ function convertObjectNodeSchema(schema: SimpleObjectNodeSchema): JsonObjectNode
144
144
 
145
145
  const output: Mutable<JsonFieldSchema> =
146
146
  allowedTypes.length === 1
147
- ? allowedTypes[0] ?? oob()
147
+ ? (allowedTypes[0] ?? oob())
148
148
  : {
149
149
  anyOf: allowedTypes,
150
150
  };
@@ -180,7 +180,7 @@ function convertMapNodeSchema(schema: SimpleMapNodeSchema): JsonMapNodeSchema {
180
180
  patternProperties: {
181
181
  "^.*$":
182
182
  allowedTypes.length === 1
183
- ? allowedTypes[0] ?? oob()
183
+ ? (allowedTypes[0] ?? oob())
184
184
  : {
185
185
  anyOf: allowedTypes,
186
186
  },
@@ -11,11 +11,14 @@ import type { Listenable } from "../../events/index.js";
11
11
 
12
12
  import {
13
13
  type ImplicitFieldSchema,
14
+ type InsertableField,
14
15
  type InsertableTreeFieldFromImplicitField,
15
16
  type TreeFieldFromImplicitField,
17
+ type TreeLeafValue,
18
+ type UnsafeUnknownSchema,
16
19
  FieldKind,
17
20
  } from "../schemaTypes.js";
18
- import { NodeKind, type TreeNodeSchema } from "../core/index.js";
21
+ import { NodeKind, type TreeNode, type TreeNodeSchema } from "../core/index.js";
19
22
  import { toStoredSchema } from "../toFlexSchema.js";
20
23
  import { LeafNodeSchema } from "../leafNodeSchema.js";
21
24
  import { assert } from "@fluidframework/core-utils/internal";
@@ -190,8 +193,9 @@ export interface ITreeViewConfiguration<
190
193
  * Configuration for {@link ViewableTree.viewWith}.
191
194
  * @sealed @public
192
195
  */
193
- export class TreeViewConfiguration<TSchema extends ImplicitFieldSchema = ImplicitFieldSchema>
194
- implements Required<ITreeViewConfiguration<TSchema>>
196
+ export class TreeViewConfiguration<
197
+ const TSchema extends ImplicitFieldSchema = ImplicitFieldSchema,
198
+ > implements Required<ITreeViewConfiguration<TSchema>>
195
199
  {
196
200
  protected _typeCheck!: MakeNominal;
197
201
 
@@ -363,7 +367,7 @@ export function checkUnion(union: Iterable<TreeNodeSchema>, errors: string[]): v
363
367
  * Thus this design was chosen at the risk of apps blindly accessing `root` then breaking unexpectedly when the document is incompatible.
364
368
  * @sealed @public
365
369
  */
366
- export interface TreeView<TSchema extends ImplicitFieldSchema> extends IDisposable {
370
+ export interface TreeView<in out TSchema extends ImplicitFieldSchema> extends IDisposable {
367
371
  /**
368
372
  * The current root of the tree.
369
373
  *
@@ -424,6 +428,25 @@ export interface TreeView<TSchema extends ImplicitFieldSchema> extends IDisposab
424
428
  readonly schema: TSchema;
425
429
  }
426
430
 
431
+ /**
432
+ * {@link TreeView} with proposed changes to the schema aware typing to allow use with `UnsafeUnknownSchema`.
433
+ * @alpha
434
+ */
435
+ export interface TreeViewAlpha<
436
+ in out TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema,
437
+ > extends Omit<
438
+ TreeView<TSchema extends ImplicitFieldSchema ? TSchema : ImplicitFieldSchema>,
439
+ "root" | "initialize"
440
+ > {
441
+ get root(): TSchema extends ImplicitFieldSchema
442
+ ? TreeFieldFromImplicitField<TSchema>
443
+ : TreeLeafValue | TreeNode;
444
+
445
+ set root(newRoot: InsertableField<TSchema>);
446
+
447
+ initialize(content: InsertableField<TSchema>): void;
448
+ }
449
+
427
450
  /**
428
451
  * Information about a view schema's compatibility with the document's stored schema.
429
452
  *
@@ -12,7 +12,11 @@ import {
12
12
  type Unhydrated,
13
13
  type WithType,
14
14
  } from "../core/index.js";
15
- import type { ImplicitFieldSchema, TreeFieldFromImplicitField } from "../schemaTypes.js";
15
+ import type {
16
+ ImplicitFieldSchema,
17
+ TreeFieldFromImplicitField,
18
+ UnsafeUnknownSchema,
19
+ } from "../schemaTypes.js";
16
20
  import { treeNodeApi } from "./treeNodeApi.js";
17
21
  import { createFromCursor, cursorFromInsertable } from "./create.js";
18
22
  import type { ITreeCursorSynchronous } from "../../core/index.js";
@@ -145,7 +149,7 @@ export const TreeBeta: {
145
149
  if (!kernel.isHydrated()) {
146
150
  return createFromCursor(
147
151
  kernel.schema,
148
- cursorFromInsertable(kernel.schema, node),
152
+ cursorFromInsertable<UnsafeUnknownSchema>(kernel.schema, node),
149
153
  ) as Unhydrated<TreeFieldFromImplicitField<TSchema>>;
150
154
  }
151
155
 
@@ -3,27 +3,28 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { RestrictiveStringRecord, _InlineTrick } from "../../util/index.js";
6
+ import type { RestrictiveStringRecord, UnionToIntersection } from "../../util/index.js";
7
7
 
8
8
  import type {
9
- AllowedTypes,
10
9
  ApplyKind,
10
+ ApplyKindInput,
11
11
  FieldKind,
12
12
  FieldSchema,
13
13
  ImplicitAllowedTypes,
14
14
  ImplicitFieldSchema,
15
- NodeFromSchema,
16
- TreeNodeFromImplicitAllowedTypes,
15
+ TreeLeafValue,
17
16
  } from "../schemaTypes.js";
18
17
  import type {
19
18
  NodeKind,
20
- TreeNodeSchema,
21
19
  WithType,
22
20
  TreeNode,
23
21
  Unhydrated,
22
+ InternalTreeNode,
23
+ TreeNodeSchema,
24
+ TreeNodeSchemaCore,
24
25
  } from "../core/index.js";
25
- import type { TreeArrayNodeBase, TreeArrayNode } from "../arrayNode.js";
26
- import type { FlexListToUnion } from "../flexList.js";
26
+ import type { TreeArrayNodeBase } from "../arrayNode.js";
27
+ import type { FlexListToUnion, LazyItem } from "../flexList.js";
27
28
 
28
29
  /*
29
30
  * TODO:
@@ -59,6 +60,65 @@ export type ObjectFromSchemaRecordUnsafe<
59
60
  -readonly [Property in keyof T]: TreeFieldFromImplicitFieldUnsafe<T[Property]>;
60
61
  };
61
62
 
63
+ /**
64
+ * {@link Unenforced} version of {@link TreeNodeSchema}.
65
+ * @remarks
66
+ * Do not use this type directly: it is only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
67
+ * @system @public
68
+ */
69
+ export type TreeNodeSchemaUnsafe<
70
+ Name extends string = string,
71
+ Kind extends NodeKind = NodeKind,
72
+ TNode extends Unenforced<TreeNode | TreeLeafValue> = unknown,
73
+ TBuild = never,
74
+ ImplicitlyConstructable extends boolean = boolean,
75
+ Info = unknown,
76
+ > =
77
+ | TreeNodeSchemaClassUnsafe<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info>
78
+ | TreeNodeSchemaNonClassUnsafe<Name, Kind, TNode, TBuild, ImplicitlyConstructable, Info>;
79
+
80
+ /**
81
+ * {@link Unenforced} version of {@link TreeNodeSchemaClass}.
82
+ * @remarks
83
+ * Do not use this type directly: it is only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
84
+ * @system @public
85
+ */
86
+ export interface TreeNodeSchemaClassUnsafe<
87
+ out Name extends string,
88
+ out Kind extends NodeKind,
89
+ // TODO: maybe this can be more specific (exclude leaves)
90
+ out TNode extends Unenforced<TreeNode | TreeLeafValue>,
91
+ in TInsertable,
92
+ out ImplicitlyConstructable extends boolean,
93
+ out Info,
94
+ > extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
95
+ /**
96
+ * Constructs an {@link Unhydrated} node with this schema.
97
+ * @remarks
98
+ * This constructor is also used internally to construct hydrated nodes with a different parameter type.
99
+ * Therefore, overriding this constructor with different argument types is not type-safe and is not supported.
100
+ * @sealed
101
+ */
102
+ new (data: TInsertable | InternalTreeNode): Unhydrated<TNode>;
103
+ }
104
+
105
+ /**
106
+ * {@link Unenforced} version of {@link TreeNodeSchemaNonClass}.
107
+ * @remarks
108
+ * Do not use this type directly: it is only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
109
+ * @system @public
110
+ */
111
+ export interface TreeNodeSchemaNonClassUnsafe<
112
+ out Name extends string,
113
+ out Kind extends NodeKind,
114
+ out TNode extends Unenforced<TreeNode | TreeLeafValue>,
115
+ in TInsertable,
116
+ out ImplicitlyConstructable extends boolean,
117
+ out Info = unknown,
118
+ > extends TreeNodeSchemaCore<Name, Kind, ImplicitlyConstructable, Info> {
119
+ create(data: TInsertable): TNode;
120
+ }
121
+
62
122
  /**
63
123
  * {@link Unenforced} version of {@link TreeObjectNode}.
64
124
  * @remarks
@@ -78,11 +138,19 @@ export type TreeObjectNodeUnsafe<
78
138
  */
79
139
  export type TreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<ImplicitFieldSchema>> =
80
140
  TSchema extends FieldSchemaUnsafe<infer Kind, infer Types>
81
- ? ApplyKind<TreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, false>
141
+ ? ApplyKind<TreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind>
82
142
  : TSchema extends ImplicitAllowedTypes
83
143
  ? TreeNodeFromImplicitAllowedTypesUnsafe<TSchema>
84
144
  : unknown;
85
145
 
146
+ /**
147
+ * {@link Unenforced} version of {@link AllowedTypes}.
148
+ * @remarks
149
+ * Do not use this type directly: it is only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
150
+ * @system @public
151
+ */
152
+ export type AllowedTypesUnsafe = readonly LazyItem<TreeNodeSchemaUnsafe>[];
153
+
86
154
  /**
87
155
  * {@link Unenforced} version of {@link TreeNodeFromImplicitAllowedTypes}.
88
156
  * @remarks
@@ -91,36 +159,60 @@ export type TreeFieldFromImplicitFieldUnsafe<TSchema extends Unenforced<Implicit
91
159
  */
92
160
  export type TreeNodeFromImplicitAllowedTypesUnsafe<
93
161
  TSchema extends Unenforced<ImplicitAllowedTypes>,
94
- > = TSchema extends ImplicitAllowedTypes
95
- ? TreeNodeFromImplicitAllowedTypes<TSchema>
96
- : TSchema extends TreeNodeSchema
97
- ? NodeFromSchema<TSchema>
98
- : TSchema extends AllowedTypes
99
- ? NodeFromSchema<FlexListToUnion<TSchema>>
100
- : unknown;
162
+ > = TSchema extends TreeNodeSchemaUnsafe
163
+ ? NodeFromSchemaUnsafe<TSchema>
164
+ : TSchema extends AllowedTypesUnsafe
165
+ ? NodeFromSchemaUnsafe<FlexListToUnion<TSchema>>
166
+ : unknown;
101
167
 
102
168
  /**
103
169
  * {@link Unenforced} version of {@link InsertableTreeNodeFromImplicitAllowedTypes}.
170
+ * @see {@link Input}
104
171
  * @remarks
105
172
  * Do note use this type directly: its only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
106
173
  * @system @public
107
174
  */
108
175
  export type InsertableTreeNodeFromImplicitAllowedTypesUnsafe<
109
176
  TSchema extends Unenforced<ImplicitAllowedTypes>,
110
- > = TSchema extends AllowedTypes
111
- ? InsertableTypedNodeUnsafe<FlexListToUnion<TSchema>>
112
- : InsertableTypedNodeUnsafe<TSchema>;
177
+ > = [TSchema] extends [TreeNodeSchemaUnsafe]
178
+ ? InsertableTypedNodeUnsafe<TSchema>
179
+ : [TSchema] extends [AllowedTypesUnsafe]
180
+ ? InsertableTreeNodeFromAllowedTypesUnsafe<TSchema>
181
+ : never;
182
+
183
+ /**
184
+ * {@link Unenforced} version of {@link InsertableTreeNodeFromAllowedTypes}.
185
+ * @see {@link Input}
186
+ * @system @public
187
+ */
188
+ export type InsertableTreeNodeFromAllowedTypesUnsafe<
189
+ TList extends Unenforced<AllowedTypesUnsafe>,
190
+ > = TList extends readonly [
191
+ LazyItem<infer TSchema extends TreeNodeSchemaUnsafe>,
192
+ ...infer Rest extends AllowedTypesUnsafe,
193
+ ]
194
+ ? InsertableTypedNodeUnsafe<TSchema> | InsertableTreeNodeFromAllowedTypesUnsafe<Rest>
195
+ : never;
113
196
 
114
197
  /**
115
198
  * {@link Unenforced} version of {@link InsertableTypedNode}.
199
+ * @see {@link Input}
116
200
  * @remarks
117
201
  * Do note use this type directly: its only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
202
+ * @privateRemarks
203
+ * TODO:
204
+ * This is less strict than InsertableTypedNode when given non-exact schema to avoid compilation issues.
205
+ * This should probably be fixed or documented somehow.
118
206
  * @system @public
119
207
  */
120
- export type InsertableTypedNodeUnsafe<T extends Unenforced<TreeNodeSchema>> = [
121
- | Unhydrated<NodeFromSchemaUnsafe<T>>
122
- | (T extends { implicitlyConstructable: true } ? NodeBuilderDataUnsafe<T> : never),
123
- ][_InlineTrick];
208
+ export type InsertableTypedNodeUnsafe<
209
+ TSchema extends Unenforced<TreeNodeSchemaUnsafe>,
210
+ T = UnionToIntersection<TSchema>,
211
+ > =
212
+ | (T extends TreeNodeSchemaUnsafe<string, NodeKind, TreeNode | TreeLeafValue, never, true>
213
+ ? NodeBuilderDataUnsafe<T>
214
+ : never)
215
+ | (T extends TreeNodeSchemaUnsafe ? NodeFromSchemaUnsafe<T> : never);
124
216
 
125
217
  /**
126
218
  * {@link Unenforced} version of {@link NodeFromSchema}.
@@ -129,7 +221,7 @@ export type InsertableTypedNodeUnsafe<T extends Unenforced<TreeNodeSchema>> = [
129
221
  * @system @public
130
222
  */
131
223
  export type NodeFromSchemaUnsafe<T extends Unenforced<TreeNodeSchema>> =
132
- T extends TreeNodeSchema<string, NodeKind, infer TNode> ? TNode : never;
224
+ T extends TreeNodeSchemaUnsafe<string, NodeKind, infer TNode> ? TNode : never;
133
225
 
134
226
  /**
135
227
  * {@link Unenforced} version of {@link InsertableTreeNodeFromImplicitAllowedTypes}.
@@ -138,7 +230,7 @@ export type NodeFromSchemaUnsafe<T extends Unenforced<TreeNodeSchema>> =
138
230
  * @system @public
139
231
  */
140
232
  export type NodeBuilderDataUnsafe<T extends Unenforced<TreeNodeSchema>> =
141
- T extends TreeNodeSchema<string, NodeKind, unknown, infer TBuild> ? TBuild : never;
233
+ T extends TreeNodeSchemaUnsafe<string, NodeKind, unknown, infer TBuild> ? TBuild : never;
142
234
 
143
235
  /**
144
236
  * {@link Unenforced} version of {@link (TreeArrayNode:interface)}.
@@ -149,8 +241,7 @@ export type NodeBuilderDataUnsafe<T extends Unenforced<TreeNodeSchema>> =
149
241
  export interface TreeArrayNodeUnsafe<TAllowedTypes extends Unenforced<ImplicitAllowedTypes>>
150
242
  extends TreeArrayNodeBase<
151
243
  TreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>,
152
- InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>,
153
- TreeArrayNode
244
+ InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TAllowedTypes>
154
245
  > {}
155
246
 
156
247
  /**
@@ -235,6 +326,7 @@ export type FieldHasDefaultUnsafe<T extends Unenforced<ImplicitFieldSchema>> =
235
326
 
236
327
  /**
237
328
  * {@link Unenforced} version of `InsertableObjectFromSchemaRecord`.
329
+ * @see {@link Input}
238
330
  * @remarks
239
331
  * Do note use this type directly: its only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
240
332
  * @system @public
@@ -256,15 +348,19 @@ export type InsertableObjectFromSchemaRecordUnsafe<
256
348
 
257
349
  /**
258
350
  * {@link Unenforced} version of {@link InsertableTreeFieldFromImplicitField}.
351
+ * @see {@link Input}
259
352
  * @remarks
260
353
  * Do note use this type directly: its only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
261
354
  * @system @public
262
355
  */
263
356
  export type InsertableTreeFieldFromImplicitFieldUnsafe<
264
- TSchema extends Unenforced<ImplicitFieldSchema>,
265
- > = TSchema extends FieldSchemaUnsafe<infer Kind, infer Types>
266
- ? ApplyKind<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, true>
267
- : InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>;
357
+ TSchemaInput extends Unenforced<ImplicitFieldSchema>,
358
+ TSchema = UnionToIntersection<TSchemaInput>,
359
+ > = [TSchema] extends [FieldSchemaUnsafe<infer Kind, infer Types>]
360
+ ? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypesUnsafe<Types>, Kind, true>
361
+ : [TSchema] extends [ImplicitAllowedTypes]
362
+ ? InsertableTreeNodeFromImplicitAllowedTypesUnsafe<TSchema>
363
+ : never;
268
364
 
269
365
  /**
270
366
  * {@link Unenforced} version of {@link FieldSchema}.