@fluidframework/tree 2.90.0 → 2.91.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/CHANGELOG.md +247 -0
  2. package/alpha.d.ts +2 -2
  3. package/api-extractor/api-extractor-lint-alpha.cjs.json +1 -1
  4. package/api-extractor/api-extractor-lint-alpha.esm.json +1 -1
  5. package/api-extractor/api-extractor-lint-beta.cjs.json +1 -1
  6. package/api-extractor/api-extractor-lint-beta.esm.json +1 -1
  7. package/api-extractor/api-extractor-lint-bundle.json +1 -1
  8. package/api-extractor/api-extractor-lint-legacy.cjs.json +1 -1
  9. package/api-extractor/api-extractor-lint-legacy.esm.json +1 -1
  10. package/api-extractor/api-extractor-lint-public.cjs.json +1 -1
  11. package/api-extractor/api-extractor-lint-public.esm.json +1 -1
  12. package/api-extractor/api-extractor.current.json +1 -1
  13. package/api-extractor/api-extractor.legacy.json +2 -1
  14. package/api-extractor.json +1 -0
  15. package/api-report/tree.alpha.api.md +81 -15
  16. package/beta.d.ts +2 -2
  17. package/dist/entrypoints/alpha.d.ts +6 -0
  18. package/dist/entrypoints/alpha.d.ts.map +1 -0
  19. package/dist/entrypoints/alpha.js +92 -0
  20. package/dist/entrypoints/alpha.js.map +1 -0
  21. package/dist/entrypoints/beta.d.ts +6 -0
  22. package/dist/entrypoints/beta.d.ts.map +1 -0
  23. package/dist/entrypoints/beta.js +43 -0
  24. package/dist/entrypoints/beta.js.map +1 -0
  25. package/dist/entrypoints/internal.d.ts +6 -0
  26. package/dist/entrypoints/internal.d.ts.map +1 -0
  27. package/dist/entrypoints/internal.js +28 -0
  28. package/dist/entrypoints/internal.js.map +1 -0
  29. package/dist/entrypoints/legacy.d.ts +6 -0
  30. package/dist/entrypoints/legacy.d.ts.map +1 -0
  31. package/dist/entrypoints/legacy.js +49 -0
  32. package/dist/entrypoints/legacy.js.map +1 -0
  33. package/dist/entrypoints/public.d.ts +6 -0
  34. package/dist/entrypoints/public.d.ts.map +1 -0
  35. package/dist/entrypoints/public.js +27 -0
  36. package/dist/entrypoints/public.js.map +1 -0
  37. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts +3 -3
  38. package/dist/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  39. package/dist/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  40. package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts +1 -0
  41. package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts.map +1 -1
  42. package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.js +14 -6
  43. package/dist/feature-libraries/modular-schema/defaultRevisionReplacer.js.map +1 -1
  44. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  45. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +7 -3
  46. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  47. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  48. package/dist/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  49. package/dist/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  50. package/dist/index.d.ts +7 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/packageVersion.d.ts +1 -1
  55. package/dist/packageVersion.js +1 -1
  56. package/dist/packageVersion.js.map +1 -1
  57. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  58. package/dist/shared-tree/treeCheckout.js +2 -1
  59. package/dist/shared-tree/treeCheckout.js.map +1 -1
  60. package/dist/simple-tree/api/eraseSchemaDetails.d.ts +43 -0
  61. package/dist/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  62. package/dist/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  63. package/dist/simple-tree/api/index.d.ts +3 -2
  64. package/dist/simple-tree/api/index.d.ts.map +1 -1
  65. package/dist/simple-tree/api/index.js.map +1 -1
  66. package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
  67. package/dist/simple-tree/api/schemaFactory.js.map +1 -1
  68. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +125 -28
  69. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  70. package/dist/simple-tree/api/schemaFactoryAlpha.js +72 -7
  71. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  72. package/dist/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  73. package/dist/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  74. package/dist/simple-tree/api/schemaStatics.d.ts +10 -11
  75. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  76. package/dist/simple-tree/api/schemaStatics.js +13 -7
  77. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  78. package/dist/simple-tree/api/typesUnsafe.d.ts +23 -2
  79. package/dist/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  80. package/dist/simple-tree/api/typesUnsafe.js.map +1 -1
  81. package/dist/simple-tree/fieldSchema.d.ts +3 -2
  82. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  83. package/dist/simple-tree/fieldSchema.js +3 -4
  84. package/dist/simple-tree/fieldSchema.js.map +1 -1
  85. package/dist/simple-tree/index.d.ts +2 -2
  86. package/dist/simple-tree/index.d.ts.map +1 -1
  87. package/dist/simple-tree/index.js.map +1 -1
  88. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  89. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  90. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  91. package/dist/simple-tree/node-kinds/object/index.d.ts +2 -2
  92. package/dist/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  93. package/dist/simple-tree/node-kinds/object/index.js.map +1 -1
  94. package/dist/simple-tree/node-kinds/object/objectNode.d.ts +43 -7
  95. package/dist/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  96. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  97. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts +26 -2
  98. package/dist/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  99. package/dist/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  100. package/dist/text/textDomainFormatted.d.ts +2 -4
  101. package/dist/text/textDomainFormatted.d.ts.map +1 -1
  102. package/dist/util/rangeMap.d.ts +25 -18
  103. package/dist/util/rangeMap.d.ts.map +1 -1
  104. package/dist/util/rangeMap.js +24 -30
  105. package/dist/util/rangeMap.js.map +1 -1
  106. package/dist/util/typeCheck.d.ts.map +1 -1
  107. package/dist/util/typeCheck.js.map +1 -1
  108. package/dist/util/typeUtils.d.ts.map +1 -1
  109. package/dist/util/typeUtils.js.map +1 -1
  110. package/eslint.config.mts +10 -2
  111. package/internal.d.ts +2 -2
  112. package/legacy.d.ts +4 -3
  113. package/lib/entrypoints/alpha.d.ts +6 -0
  114. package/lib/entrypoints/alpha.d.ts.map +1 -0
  115. package/lib/entrypoints/alpha.js +12 -0
  116. package/lib/entrypoints/alpha.js.map +1 -0
  117. package/lib/entrypoints/beta.d.ts +6 -0
  118. package/lib/entrypoints/beta.d.ts.map +1 -0
  119. package/lib/entrypoints/beta.js +12 -0
  120. package/lib/entrypoints/beta.js.map +1 -0
  121. package/lib/entrypoints/internal.d.ts +6 -0
  122. package/lib/entrypoints/internal.d.ts.map +1 -0
  123. package/lib/entrypoints/internal.js +12 -0
  124. package/lib/entrypoints/internal.js.map +1 -0
  125. package/lib/entrypoints/legacy.d.ts +6 -0
  126. package/lib/entrypoints/legacy.d.ts.map +1 -0
  127. package/lib/entrypoints/legacy.js +15 -0
  128. package/lib/entrypoints/legacy.js.map +1 -0
  129. package/lib/entrypoints/public.d.ts +6 -0
  130. package/lib/entrypoints/public.d.ts.map +1 -0
  131. package/lib/entrypoints/public.js +10 -0
  132. package/lib/entrypoints/public.js.map +1 -0
  133. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts +3 -3
  134. package/lib/feature-libraries/modular-schema/crossFieldQueries.d.ts.map +1 -1
  135. package/lib/feature-libraries/modular-schema/crossFieldQueries.js.map +1 -1
  136. package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts +1 -0
  137. package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.d.ts.map +1 -1
  138. package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.js +14 -6
  139. package/lib/feature-libraries/modular-schema/defaultRevisionReplacer.js.map +1 -1
  140. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  141. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +7 -3
  142. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  143. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts +1 -1
  144. package/lib/feature-libraries/sequence-field/moveEffectTable.d.ts.map +1 -1
  145. package/lib/feature-libraries/sequence-field/moveEffectTable.js.map +1 -1
  146. package/lib/index.d.ts +7 -1
  147. package/lib/index.d.ts.map +1 -1
  148. package/lib/index.js +8 -0
  149. package/lib/index.js.map +1 -1
  150. package/lib/packageVersion.d.ts +1 -1
  151. package/lib/packageVersion.js +1 -1
  152. package/lib/packageVersion.js.map +1 -1
  153. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  154. package/lib/shared-tree/treeCheckout.js +2 -1
  155. package/lib/shared-tree/treeCheckout.js.map +1 -1
  156. package/lib/simple-tree/api/eraseSchemaDetails.d.ts +43 -0
  157. package/lib/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  158. package/lib/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  159. package/lib/simple-tree/api/index.d.ts +3 -2
  160. package/lib/simple-tree/api/index.d.ts.map +1 -1
  161. package/lib/simple-tree/api/index.js +1 -1
  162. package/lib/simple-tree/api/index.js.map +1 -1
  163. package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
  164. package/lib/simple-tree/api/schemaFactory.js.map +1 -1
  165. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +125 -28
  166. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  167. package/lib/simple-tree/api/schemaFactoryAlpha.js +66 -1
  168. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  169. package/lib/simple-tree/api/schemaFactoryBeta.d.ts.map +1 -1
  170. package/lib/simple-tree/api/schemaFactoryBeta.js.map +1 -1
  171. package/lib/simple-tree/api/schemaStatics.d.ts +10 -11
  172. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  173. package/lib/simple-tree/api/schemaStatics.js +14 -8
  174. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  175. package/lib/simple-tree/api/typesUnsafe.d.ts +23 -2
  176. package/lib/simple-tree/api/typesUnsafe.d.ts.map +1 -1
  177. package/lib/simple-tree/api/typesUnsafe.js.map +1 -1
  178. package/lib/simple-tree/fieldSchema.d.ts +3 -2
  179. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  180. package/lib/simple-tree/fieldSchema.js +3 -4
  181. package/lib/simple-tree/fieldSchema.js.map +1 -1
  182. package/lib/simple-tree/index.d.ts +2 -2
  183. package/lib/simple-tree/index.d.ts.map +1 -1
  184. package/lib/simple-tree/index.js.map +1 -1
  185. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  186. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  187. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  188. package/lib/simple-tree/node-kinds/object/index.d.ts +2 -2
  189. package/lib/simple-tree/node-kinds/object/index.d.ts.map +1 -1
  190. package/lib/simple-tree/node-kinds/object/index.js.map +1 -1
  191. package/lib/simple-tree/node-kinds/object/objectNode.d.ts +43 -7
  192. package/lib/simple-tree/node-kinds/object/objectNode.d.ts.map +1 -1
  193. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  194. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts +26 -2
  195. package/lib/simple-tree/node-kinds/object/objectNodeTypes.d.ts.map +1 -1
  196. package/lib/simple-tree/node-kinds/object/objectNodeTypes.js.map +1 -1
  197. package/lib/text/textDomainFormatted.d.ts +2 -4
  198. package/lib/text/textDomainFormatted.d.ts.map +1 -1
  199. package/lib/util/rangeMap.d.ts +25 -18
  200. package/lib/util/rangeMap.d.ts.map +1 -1
  201. package/lib/util/rangeMap.js +25 -31
  202. package/lib/util/rangeMap.js.map +1 -1
  203. package/lib/util/typeCheck.d.ts.map +1 -1
  204. package/lib/util/typeCheck.js.map +1 -1
  205. package/lib/util/typeUtils.d.ts.map +1 -1
  206. package/lib/util/typeUtils.js.map +1 -1
  207. package/package.json +46 -46
  208. package/scripts/generate-entrypoint-sources.sh +29 -0
  209. package/{dist/alpha.d.ts → src/entrypoints/alpha.ts} +12 -5
  210. package/{lib/beta.d.ts → src/entrypoints/beta.ts} +2 -5
  211. package/src/entrypoints/internal.ts +13 -0
  212. package/{dist/legacy.d.ts → src/entrypoints/legacy.ts} +2 -5
  213. package/{lib/public.d.ts → src/entrypoints/public.ts} +2 -5
  214. package/src/feature-libraries/modular-schema/crossFieldQueries.ts +3 -8
  215. package/src/feature-libraries/modular-schema/defaultRevisionReplacer.ts +16 -8
  216. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +9 -4
  217. package/src/feature-libraries/sequence-field/moveEffectTable.ts +1 -1
  218. package/src/index.ts +19 -0
  219. package/src/packageVersion.ts +1 -1
  220. package/src/shared-tree/treeCheckout.ts +2 -1
  221. package/src/simple-tree/api/eraseSchemaDetails.ts +60 -0
  222. package/src/simple-tree/api/index.ts +12 -1
  223. package/src/simple-tree/api/schemaFactory.ts +8 -1
  224. package/src/simple-tree/api/schemaFactoryAlpha.ts +262 -25
  225. package/src/simple-tree/api/schemaFactoryBeta.ts +10 -1
  226. package/src/simple-tree/api/schemaStatics.ts +79 -21
  227. package/src/simple-tree/api/typesUnsafe.ts +49 -1
  228. package/src/simple-tree/fieldSchema.ts +29 -5
  229. package/src/simple-tree/index.ts +10 -0
  230. package/src/simple-tree/node-kinds/index.ts +3 -0
  231. package/src/simple-tree/node-kinds/object/index.ts +3 -0
  232. package/src/simple-tree/node-kinds/object/objectNode.ts +69 -11
  233. package/src/simple-tree/node-kinds/object/objectNodeTypes.ts +33 -2
  234. package/src/util/rangeMap.ts +54 -50
  235. package/src/util/typeCheck.ts +1 -0
  236. package/src/util/typeUtils.ts +4 -7
  237. package/dist/beta.d.ts +0 -152
  238. package/dist/public.d.ts +0 -94
  239. package/lib/alpha.d.ts +0 -304
  240. package/lib/legacy.d.ts +0 -159
@@ -263,7 +263,16 @@ export class SchemaFactoryBeta<
263
263
  return objectSchema(scoped<TScope, TName, Name>(this, name), fields, true, {
264
264
  ...defaultSchemaFactoryObjectOptions,
265
265
  ...options,
266
- });
266
+ }) as TreeNodeSchemaClass<
267
+ ScopedSchemaName<TScope, Name>,
268
+ NodeKind.Object,
269
+ TreeObjectNode<T, ScopedSchemaName<TScope, Name>>,
270
+ object & InsertableObjectFromSchemaRecord<T>,
271
+ true,
272
+ T,
273
+ never,
274
+ TCustomMetadata
275
+ >;
267
276
  }
268
277
 
269
278
  public override objectRecursive<
@@ -6,13 +6,15 @@
6
6
  import type { IFluidHandle } from "@fluidframework/core-interfaces";
7
7
 
8
8
  import type { ImplicitAllowedTypes } from "../core/index.js";
9
- import { FieldKind, getDefaultProvider, createFieldSchema } from "../fieldSchema.js";
10
- import type {
11
- FieldProps,
12
- FieldSchema,
13
- DefaultProvider,
14
- FieldPropsAlpha,
15
- FieldSchemaAlpha,
9
+ import {
10
+ FieldKind,
11
+ getDefaultProvider,
12
+ createFieldSchema,
13
+ type FieldProps,
14
+ type DefaultProvider,
15
+ type FieldPropsAlpha,
16
+ type FieldSchema,
17
+ type FieldSchemaAlpha,
16
18
  } from "../fieldSchema.js";
17
19
  import type { LeafSchema } from "../leafNodeSchema.js";
18
20
  import {
@@ -180,7 +182,12 @@ export const schemaStaticsStable = {
180
182
  optional: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
181
183
  t: T,
182
184
  props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
183
- ): FieldSchemaAlpha<FieldKind.Optional, T, TCustomMetadata> => {
185
+ ): FieldSchemaAlpha<
186
+ FieldKind.Optional,
187
+ T,
188
+ TCustomMetadata,
189
+ FieldPropsAlpha<TCustomMetadata>
190
+ > => {
184
191
  return createFieldSchema(FieldKind.Optional, t, {
185
192
  defaultProvider: defaultOptionalProvider,
186
193
  ...props,
@@ -190,8 +197,13 @@ export const schemaStaticsStable = {
190
197
  required: <const T extends ImplicitAllowedTypes, const TCustomMetadata = unknown>(
191
198
  t: T,
192
199
  props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
193
- ): FieldSchemaAlpha<FieldKind.Required, T, TCustomMetadata> => {
194
- return createFieldSchema(FieldKind.Required, t, props);
200
+ ): FieldSchemaAlpha<
201
+ FieldKind.Required,
202
+ T,
203
+ TCustomMetadata,
204
+ FieldPropsAlpha<TCustomMetadata>
205
+ > => {
206
+ return createFieldSchema(FieldKind.Required, t, { defaultProvider: undefined, ...props });
195
207
  },
196
208
 
197
209
  optionalRecursive: <
@@ -200,7 +212,12 @@ export const schemaStaticsStable = {
200
212
  >(
201
213
  t: T,
202
214
  props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
203
- ): FieldSchemaAlphaUnsafe<FieldKind.Optional, T, TCustomMetadata> => {
215
+ ): FieldSchemaAlphaUnsafe<
216
+ FieldKind.Optional,
217
+ T,
218
+ TCustomMetadata,
219
+ FieldPropsAlpha<TCustomMetadata>
220
+ > => {
204
221
  return createFieldSchemaUnsafe(FieldKind.Optional, t, {
205
222
  defaultProvider: defaultOptionalProvider,
206
223
  ...props,
@@ -213,8 +230,16 @@ export const schemaStaticsStable = {
213
230
  >(
214
231
  t: T,
215
232
  props?: Omit<FieldPropsAlpha<TCustomMetadata>, "defaultProvider">,
216
- ): FieldSchemaAlphaUnsafe<FieldKind.Required, T, TCustomMetadata> => {
217
- return createFieldSchemaUnsafe(FieldKind.Required, t, props);
233
+ ): FieldSchemaAlphaUnsafe<
234
+ FieldKind.Required,
235
+ T,
236
+ TCustomMetadata,
237
+ FieldPropsAlpha<TCustomMetadata>
238
+ > => {
239
+ return createFieldSchemaUnsafe(FieldKind.Required, t, {
240
+ defaultProvider: undefined,
241
+ ...props,
242
+ });
218
243
  },
219
244
  } as const satisfies SchemaStatics;
220
245
 
@@ -225,14 +250,37 @@ export const schemaStatics = {
225
250
  ...schemaStaticsStable,
226
251
  identifier: <const TCustomMetadata = unknown>(
227
252
  props?: Omit<FieldProps<TCustomMetadata>, "defaultProvider">,
228
- ): FieldSchemaAlpha<FieldKind.Identifier, typeof stringSchema, TCustomMetadata> => {
229
- return createFieldSchema(FieldKind.Identifier, stringSchema, props);
253
+ ): FieldSchemaAlpha<
254
+ FieldKind.Identifier,
255
+ typeof stringSchema,
256
+ TCustomMetadata,
257
+ FieldPropsAlpha<TCustomMetadata>
258
+ > => {
259
+ return createFieldSchema(FieldKind.Identifier, stringSchema, {
260
+ defaultProvider: undefined,
261
+ ...props,
262
+ });
230
263
  },
231
264
  } as const;
232
265
 
233
266
  /**
234
267
  * {@link Unenforced} version of {@link createFieldSchema}.
235
268
  */
269
+ function createFieldSchemaUnsafe<
270
+ Kind extends FieldKind,
271
+ Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
272
+ TCustomMetadata = unknown,
273
+ >(kind: Kind, allowedTypes: Types): FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata>;
274
+ function createFieldSchemaUnsafe<
275
+ Kind extends FieldKind,
276
+ Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
277
+ TCustomMetadata = unknown,
278
+ TProps extends FieldProps<TCustomMetadata> = FieldProps<TCustomMetadata>,
279
+ >(
280
+ kind: Kind,
281
+ allowedTypes: Types,
282
+ props: TProps,
283
+ ): FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata, TProps>;
236
284
  function createFieldSchemaUnsafe<
237
285
  Kind extends FieldKind,
238
286
  Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
@@ -241,11 +289,21 @@ function createFieldSchemaUnsafe<
241
289
  kind: Kind,
242
290
  allowedTypes: Types,
243
291
  props?: FieldProps<TCustomMetadata>,
244
- ): FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata> {
292
+ ): FieldSchemaAlphaUnsafe<
293
+ Kind,
294
+ Types,
295
+ TCustomMetadata,
296
+ FieldProps<TCustomMetadata> | undefined
297
+ > {
245
298
  // At runtime, we still want this to be a FieldSchema instance, but we can't satisfy its extends clause, so just return it as an FieldSchemaUnsafe
246
- return createFieldSchema(
247
- kind,
248
- allowedTypes as ImplicitAllowedTypes & Types,
249
- props,
250
- ) as FieldSchemaAlphaUnsafe<Kind, Types, TCustomMetadata>;
299
+ const schema =
300
+ props === undefined
301
+ ? createFieldSchema(kind, allowedTypes as ImplicitAllowedTypes & Types)
302
+ : createFieldSchema(kind, allowedTypes as ImplicitAllowedTypes & Types, props);
303
+ return schema as FieldSchemaAlphaUnsafe<
304
+ Kind,
305
+ Types,
306
+ TCustomMetadata,
307
+ FieldProps<TCustomMetadata> | undefined
308
+ >;
251
309
  }
@@ -27,9 +27,11 @@ import type {
27
27
  import type {
28
28
  ApplyKind,
29
29
  ApplyKindInput,
30
+ DefaultProvider,
30
31
  FieldKind,
31
32
  FieldSchema,
32
33
  FieldSchemaAlpha,
34
+ FieldPropsAlpha,
33
35
  } from "../fieldSchema.js";
34
36
  import type { TreeArrayNode } from "../node-kinds/index.js";
35
37
  import type {
@@ -465,7 +467,8 @@ export interface FieldSchemaAlphaUnsafe<
465
467
  out Kind extends FieldKind,
466
468
  out Types extends System_Unsafe.ImplicitAllowedTypesUnsafe,
467
469
  out TCustomMetadata = unknown,
468
- > extends FieldSchemaAlpha<Kind, any, TCustomMetadata>,
470
+ out TProps extends FieldPropsAlpha<TCustomMetadata> | undefined = undefined,
471
+ > extends FieldSchemaAlpha<Kind, any, TCustomMetadata, TProps>,
469
472
  System_Unsafe.FieldSchemaUnsafe<Kind, Types, TCustomMetadata> {
470
473
  /**
471
474
  * {@inheritDoc FieldSchema.allowedTypes}
@@ -475,6 +478,51 @@ export interface FieldSchemaAlphaUnsafe<
475
478
 
476
479
  /* eslint-enable @typescript-eslint/no-explicit-any */
477
480
 
481
+ /**
482
+ * {@link Unenforced} version of {@link FieldHasDefaultAlpha}.
483
+ * @remarks
484
+ * Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
485
+ * @system @sealed @alpha
486
+ */
487
+ export type FieldHasDefaultAlphaUnsafe<T extends System_Unsafe.ImplicitFieldSchemaUnsafe> =
488
+ T extends FieldSchemaAlphaUnsafe<
489
+ infer Kind,
490
+ System_Unsafe.ImplicitAllowedTypesUnsafe,
491
+ unknown,
492
+ infer TProps
493
+ >
494
+ ? Kind extends FieldKind.Optional | FieldKind.Identifier
495
+ ? true
496
+ : TProps extends { defaultProvider: DefaultProvider }
497
+ ? true
498
+ : false
499
+ : System_Unsafe.FieldHasDefaultUnsafe<T>;
500
+
501
+ /**
502
+ * {@link Unenforced} version of {@link InsertableObjectFromSchemaRecordAlpha}.
503
+ * @see {@link System_Unsafe.InsertableObjectFromSchemaRecordUnsafe}
504
+ * @remarks
505
+ * Do not use this type directly: it's only needed in the implementation of generic logic which define recursive schema, not when using recursive schema.
506
+ * @system @alpha
507
+ */
508
+ export type InsertableObjectFromSchemaRecordAlphaUnsafe<
509
+ T extends RestrictiveStringRecord<System_Unsafe.ImplicitFieldSchemaUnsafe>,
510
+ > = {
511
+ // Field does not have a known default, make it required:
512
+ readonly [Property in keyof T as FieldHasDefaultAlphaUnsafe<
513
+ T[Property & string]
514
+ > extends false
515
+ ? Property
516
+ : never]: System_Unsafe.InsertableTreeFieldFromImplicitFieldUnsafe<T[Property & string]>;
517
+ } & {
518
+ // Field has a known default, make it optional:
519
+ readonly [Property in keyof T as FieldHasDefaultAlphaUnsafe<
520
+ T[Property & string]
521
+ > extends true
522
+ ? Property
523
+ : never]?: System_Unsafe.InsertableTreeFieldFromImplicitFieldUnsafe<T[Property & string]>;
524
+ };
525
+
478
526
  /**
479
527
  * {@link Unenforced} version of {@link ArrayNodeCustomizableSchema}s.
480
528
  * @remarks
@@ -268,6 +268,21 @@ export interface FieldSchemaMetadataAlpha<TCustomMetadata = unknown>
268
268
  /**
269
269
  * Package internal construction API.
270
270
  */
271
+ export function createFieldSchema<
272
+ Kind extends FieldKind,
273
+ Types extends ImplicitAllowedTypes,
274
+ TCustomMetadata = unknown,
275
+ >(kind: Kind, annotatedTypes: Types): FieldSchemaAlpha<Kind, Types, TCustomMetadata>;
276
+ export function createFieldSchema<
277
+ Kind extends FieldKind,
278
+ Types extends ImplicitAllowedTypes,
279
+ TCustomMetadata = unknown,
280
+ TProps extends FieldProps<TCustomMetadata> = FieldProps<TCustomMetadata>,
281
+ >(
282
+ kind: Kind,
283
+ annotatedTypes: Types,
284
+ props: TProps,
285
+ ): FieldSchemaAlpha<Kind, Types, TCustomMetadata, TProps>;
271
286
  export function createFieldSchema<
272
287
  Kind extends FieldKind,
273
288
  Types extends ImplicitAllowedTypes,
@@ -276,7 +291,7 @@ export function createFieldSchema<
276
291
  kind: Kind,
277
292
  annotatedTypes: Types,
278
293
  props?: FieldProps<TCustomMetadata>,
279
- ): FieldSchemaAlpha<Kind, Types, TCustomMetadata> {
294
+ ): FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined> {
280
295
  return createFieldSchemaPrivate(kind, annotatedTypes, props);
281
296
  }
282
297
 
@@ -291,7 +306,7 @@ let createFieldSchemaPrivate: <
291
306
  kind: Kind,
292
307
  annotatedTypes: Types,
293
308
  props?: FieldProps<TCustomMetadata>,
294
- ) => FieldSchemaAlpha<Kind, Types, TCustomMetadata>;
309
+ ) => FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined>;
295
310
 
296
311
  /**
297
312
  * All policy for a specific field,
@@ -384,11 +399,14 @@ export class FieldSchemaAlpha<
384
399
  Kind extends FieldKind = FieldKind,
385
400
  Types extends ImplicitAllowedTypes = ImplicitAllowedTypes,
386
401
  TCustomMetadata = unknown,
402
+ TProps extends FieldPropsAlpha<TCustomMetadata> | undefined =
403
+ | FieldPropsAlpha<TCustomMetadata>
404
+ | undefined,
387
405
  >
388
406
  extends FieldSchema<Kind, Types, TCustomMetadata>
389
407
  implements SimpleFieldSchema<SchemaType.View>
390
408
  {
391
- private readonly propsAlpha: FieldPropsAlpha<TCustomMetadata> | undefined;
409
+ private readonly propsAlpha: TProps;
392
410
 
393
411
  public get persistedMetadata(): JsonCompatibleReadOnlyObject | undefined {
394
412
  return this.propsAlpha?.persistedMetadata;
@@ -403,7 +421,13 @@ export class FieldSchemaAlpha<
403
421
  kind: Kind2,
404
422
  annotatedAllowedTypes: Types2,
405
423
  props?: FieldPropsAlpha<TCustomMetadata2>,
406
- ) => new FieldSchemaAlpha(kind, annotatedAllowedTypes, props);
424
+ ) =>
425
+ // TCustomMetadata2 requires type assertion due to limitations with dependent type parameters
426
+ new FieldSchemaAlpha(kind, annotatedAllowedTypes, props) as unknown as FieldSchemaAlpha<
427
+ Kind2,
428
+ Types2,
429
+ TCustomMetadata2
430
+ >;
407
431
  }
408
432
 
409
433
  /**
@@ -432,7 +456,7 @@ export class FieldSchemaAlpha<
432
456
 
433
457
  const normalizedTypes = normalizeAllowedTypes(types);
434
458
  this.allowedTypesFull = normalizedTypes;
435
- this.propsAlpha = props;
459
+ this.propsAlpha = props as TProps;
436
460
  }
437
461
  }
438
462
 
@@ -79,6 +79,8 @@ export {
79
79
  SchemaFactoryBeta,
80
80
  type SchemaStaticsBeta,
81
81
  SchemaFactoryAlpha,
82
+ type SchemaStaticsAlpha,
83
+ type NodeProvider,
82
84
  type ObjectSchemaOptionsAlpha,
83
85
  type ObjectSchemaOptions,
84
86
  type ScopedSchemaName,
@@ -139,6 +141,8 @@ export {
139
141
  type AllowedTypesFullFromMixedUnsafe,
140
142
  type UnannotateAllowedTypesListUnsafe,
141
143
  type AnnotateAllowedTypesListUnsafe,
144
+ type FieldHasDefaultAlphaUnsafe,
145
+ type InsertableObjectFromSchemaRecordAlphaUnsafe,
142
146
  type TreeViewAlpha,
143
147
  type TreeViewBeta,
144
148
  type TreeBranch,
@@ -197,6 +201,9 @@ export {
197
201
  checkCompatibility,
198
202
  eraseSchemaDetails,
199
203
  eraseSchemaDetailsSubclassable,
204
+ type ErasedSchema,
205
+ type ErasedNode,
206
+ type ErasedSchemaSubclassable,
200
207
  snapshotSchemaCompatibility,
201
208
  type SnapshotFileSystem,
202
209
  type SnapshotSchemaCompatibilityOptions,
@@ -255,9 +262,12 @@ export {
255
262
  type TreeMapNode,
256
263
  type MapNodeInsertableData,
257
264
  type FieldHasDefault,
265
+ type FieldHasDefaultAlpha,
258
266
  type InsertableObjectFromSchemaRecord,
267
+ type InsertableObjectFromSchemaRecordAlpha,
259
268
  type ObjectFromSchemaRecord,
260
269
  ObjectNodeSchema,
270
+ type ObjectNodeSchemaWorkaround,
261
271
  type ObjectNodeSchemaPrivate,
262
272
  objectSchema,
263
273
  isObjectNodeSchema,
@@ -29,10 +29,13 @@ export {
29
29
 
30
30
  export {
31
31
  type FieldHasDefault,
32
+ type FieldHasDefaultAlpha,
32
33
  type InsertableObjectFromSchemaRecord,
34
+ type InsertableObjectFromSchemaRecordAlpha,
33
35
  isObjectNodeSchema,
34
36
  type ObjectFromSchemaRecord,
35
37
  ObjectNodeSchema,
38
+ type ObjectNodeSchemaWorkaround,
36
39
  type ObjectNodeSchemaPrivate,
37
40
  objectSchema,
38
41
  setField,
@@ -5,7 +5,9 @@
5
5
 
6
6
  export {
7
7
  type FieldHasDefault,
8
+ type FieldHasDefaultAlpha,
8
9
  type InsertableObjectFromSchemaRecord,
10
+ type InsertableObjectFromSchemaRecordAlpha,
9
11
  type ObjectFromSchemaRecord,
10
12
  objectSchema,
11
13
  setField,
@@ -15,5 +17,6 @@ export {
15
17
  export {
16
18
  isObjectNodeSchema,
17
19
  ObjectNodeSchema,
20
+ type ObjectNodeSchemaWorkaround,
18
21
  type ObjectNodeSchemaPrivate,
19
22
  } from "./objectNodeTypes.js";
@@ -70,6 +70,7 @@ import {
70
70
  type ContextualFieldProvider,
71
71
  extractFieldProvider,
72
72
  isConstant,
73
+ type DefaultProvider,
73
74
  } from "../../fieldSchema.js";
74
75
  import { tryGetTreeNodeForField } from "../../getTreeNodeForField.js";
75
76
  import { prepareForInsertion } from "../../prepareForInsertion.js";
@@ -99,8 +100,7 @@ import type {
99
100
  */
100
101
  export type ObjectFromSchemaRecord<T extends RestrictiveStringRecord<ImplicitFieldSchema>> =
101
102
  RestrictiveStringRecord<ImplicitFieldSchema> extends T
102
- ? // eslint-disable-next-line @typescript-eslint/no-empty-object-type
103
- {}
103
+ ? {}
104
104
  : {
105
105
  -readonly [Property in keyof T]: Property extends string
106
106
  ? TreeFieldFromImplicitField<T[Property]>
@@ -149,8 +149,11 @@ export type TreeObjectNode<
149
149
  * @remarks Yields `false` when unknown.
150
150
  *
151
151
  * @privateRemarks
152
- * TODO: Account for field schemas with default value providers.
153
- * For now, this only captures field kinds that we know always have defaults - optional fields and identifier fields.
152
+ * This checks for:
153
+ * 1. Optional fields (which have an implicit undefined default)
154
+ * 2. Identifier fields (which have auto-generated defaults)
155
+ *
156
+ * Note that this cannot tell if required fields have defaults. Use `FieldHasDefaultAlpha` for alpha schemas if you need to check for required field defaults.
154
157
  *
155
158
  * @system @public
156
159
  */
@@ -160,6 +163,33 @@ export type FieldHasDefault<T extends ImplicitFieldSchema> = [T] extends [
160
163
  ? true
161
164
  : false;
162
165
 
166
+ /**
167
+ * Type utility for determining if an implicit field schema is known to have a default value.
168
+ * Supports alpha field schemas with explicit default providers.
169
+ *
170
+ * @remarks Yields `false` when unknown.
171
+ *
172
+ * @privateRemarks
173
+ * This checks for:
174
+ * 1. Fields with explicit default providers (computed from the props type)
175
+ * 2. Optional fields (which have an implicit undefined default)
176
+ * 3. Identifier fields (which have auto-generated defaults)
177
+ *
178
+ * @system @alpha
179
+ */
180
+ export type FieldHasDefaultAlpha<T extends ImplicitFieldSchema> =
181
+ // Extract Kind and TProps from FieldSchemaAlpha and compute whether it has a default
182
+ [T] extends [FieldSchemaAlpha<infer Kind, infer _Types, infer _Meta, infer TProps>]
183
+ ? // Optional and Identifier kinds always have defaults
184
+ Kind extends FieldKind.Optional | FieldKind.Identifier
185
+ ? true
186
+ : // Check if props has defaultProvider
187
+ TProps extends { defaultProvider: DefaultProvider }
188
+ ? true
189
+ : false
190
+ : // Fallback to base FieldHasDefault for non-Alpha schemas
191
+ FieldHasDefault<T>;
192
+
163
193
  /**
164
194
  * Helper used to produce types for:
165
195
  *
@@ -209,6 +239,35 @@ export type InsertableObjectFromSchemaRecord<
209
239
  }
210
240
  >;
211
241
 
242
+ /**
243
+ * Alpha version of InsertableObjectFromSchemaRecord that supports field defaults.
244
+ *
245
+ * @system @alpha
246
+ */
247
+ export type InsertableObjectFromSchemaRecordAlpha<
248
+ T extends RestrictiveStringRecord<ImplicitFieldSchema>,
249
+ > =
250
+ RestrictiveStringRecord<ImplicitFieldSchema> extends T
251
+ ? { arbitraryKey: "arbitraryValue" } extends T
252
+ ? // {} case
253
+ Record<string, never>
254
+ : // RestrictiveStringRecord<ImplicitFieldSchema> case
255
+ never
256
+ : FlattenKeys<
257
+ {
258
+ readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<
259
+ T[Property & string]
260
+ >;
261
+ } & {
262
+ // Field does not have a known default, make it required:
263
+ readonly [Property in keyof T as FieldHasDefaultAlpha<
264
+ T[Property & string]
265
+ > extends false
266
+ ? Property
267
+ : never]: InsertableTreeFieldFromImplicitField<T[Property & string]>;
268
+ }
269
+ >;
270
+
212
271
  /**
213
272
  * Maps from simple field keys ("property" keys) to information about the field.
214
273
  *
@@ -387,17 +446,16 @@ export class ObjectFieldSchema<
387
446
  Kind extends FieldKind,
388
447
  Types extends ImplicitAllowedTypes,
389
448
  TCustomMetadata = unknown,
449
+ TProps extends FieldProps<TCustomMetadata> & {
450
+ readonly key: string;
451
+ } = FieldProps<TCustomMetadata> & { readonly key: string },
390
452
  >
391
- extends FieldSchemaAlpha<Kind, Types, TCustomMetadata>
453
+ extends FieldSchemaAlpha<Kind, Types, TCustomMetadata, TProps>
392
454
  implements SimpleObjectFieldSchema
393
455
  {
394
456
  public readonly storedKey: string;
395
457
 
396
- public constructor(
397
- kind: Kind,
398
- allowedTypes: Types,
399
- props: FieldProps<TCustomMetadata> & { readonly key: string },
400
- ) {
458
+ public constructor(kind: Kind, allowedTypes: Types, props: TProps) {
401
459
  super(kind, allowedTypes, props);
402
460
  this.storedKey = props.key;
403
461
  }
@@ -592,7 +650,7 @@ export function objectSchema<
592
650
  }
593
651
  type Output = typeof CustomObjectNode &
594
652
  (new (
595
- input: InsertableObjectFromSchemaRecord<T> | InternalTreeNode,
653
+ input: InsertableObjectFromSchemaRecordAlpha<T> | InternalTreeNode,
596
654
  ) => TreeObjectNode<T, TName>);
597
655
  return CustomObjectNode as Output;
598
656
  }
@@ -21,9 +21,40 @@ import type {
21
21
  import type {
22
22
  TreeObjectNode,
23
23
  SimpleKeyMap,
24
- InsertableObjectFromSchemaRecord,
24
+ InsertableObjectFromSchemaRecordAlpha,
25
25
  } from "./objectNode.js";
26
26
 
27
+ /**
28
+ * {@link (ObjectNodeSchema:interface)} with a workaround to avoid a specific known TypeScript issue which causes it to not be assignable to itself in some cases.
29
+ * @remarks
30
+ * If dealing with a schema whose inferred type includes this workaround (because it was produced by a schema factory API which uses it),
31
+ * if you need to explicitly state that type (for example when using {@link https://www.typescriptlang.org/tsconfig/#isolatedDeclarations | isolatedDeclarations}), it is best to keep this workaround.
32
+ * No other case should need to refer to this workaround type directly.
33
+ * See {@link ObjectNodeSchemaWorkaround.createFromInsertable} for details.
34
+ * @sealed
35
+ * @alpha
36
+ */
37
+ export type ObjectNodeSchemaWorkaround<
38
+ TName extends string = string,
39
+ T extends
40
+ RestrictiveStringRecord<ImplicitFieldSchema> = RestrictiveStringRecord<ImplicitFieldSchema>,
41
+ ImplicitlyConstructable extends boolean = boolean,
42
+ TCustomMetadata = unknown,
43
+ > = ObjectNodeSchema<TName, T, ImplicitlyConstructable, TCustomMetadata> & {
44
+ /**
45
+ * Typing checking workaround: not for for actual use.
46
+ * @remarks
47
+ * This API collides with {@link TreeNodeSchemaCore.createFromInsertable} to disable a type checking optimization which produces different and undesired results.
48
+ * See {@link https://github.com/microsoft/TypeScript/issues/59049#issuecomment-2773459693} for more details.
49
+ *
50
+ * The specific issue here is non-empty POJO mode object schema not being assignable to `ObjectNodeSchema`,
51
+ * @privateRemarks
52
+ * See the above link and the tests in objectNode.spec.ts which reference it.
53
+ * @system
54
+ */
55
+ readonly createFromInsertable: unknown;
56
+ };
57
+
27
58
  /**
28
59
  * A schema for {@link TreeObjectNode}s.
29
60
  * @sealed
@@ -39,7 +70,7 @@ export interface ObjectNodeSchema<
39
70
  TName,
40
71
  NodeKind.Object,
41
72
  TreeObjectNode<T, TName>,
42
- InsertableObjectFromSchemaRecord<T>,
73
+ object & InsertableObjectFromSchemaRecordAlpha<T>,
43
74
  ImplicitlyConstructable,
44
75
  T,
45
76
  never,