@fluidframework/tree 2.92.0 → 2.100.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 (366) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/INCREMENTAL_SUMMARY.md +89 -0
  3. package/README.md +7 -1
  4. package/api-report/tree.alpha.api.md +60 -29
  5. package/api-report/tree.beta.api.md +41 -12
  6. package/api-report/tree.legacy.beta.api.md +41 -12
  7. package/dist/api.d.ts +6 -1
  8. package/dist/api.d.ts.map +1 -1
  9. package/dist/api.js.map +1 -1
  10. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  11. package/dist/core/tree/anchorSet.js +21 -0
  12. package/dist/core/tree/anchorSet.js.map +1 -1
  13. package/dist/entrypoints/alpha.d.ts +1 -1
  14. package/dist/entrypoints/alpha.d.ts.map +1 -1
  15. package/dist/entrypoints/alpha.js +4 -4
  16. package/dist/entrypoints/alpha.js.map +1 -1
  17. package/dist/entrypoints/beta.d.ts +1 -1
  18. package/dist/entrypoints/beta.d.ts.map +1 -1
  19. package/dist/entrypoints/beta.js +3 -1
  20. package/dist/entrypoints/beta.js.map +1 -1
  21. package/dist/entrypoints/legacy.d.ts +1 -1
  22. package/dist/entrypoints/legacy.d.ts.map +1 -1
  23. package/dist/entrypoints/legacy.js +3 -1
  24. package/dist/entrypoints/legacy.js.map +1 -1
  25. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts +25 -1
  26. package/dist/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  27. package/dist/feature-libraries/chunked-forest/basicChunk.js +71 -18
  28. package/dist/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  29. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts +2 -2
  30. package/dist/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  31. package/dist/feature-libraries/chunked-forest/chunkTree.js +2 -1
  32. package/dist/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  33. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js +1 -1
  34. package/dist/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  35. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  36. package/dist/feature-libraries/chunked-forest/codec/codecs.js +1 -1
  37. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  38. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +1 -1
  39. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  40. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js +1 -1
  41. package/dist/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  42. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +1 -2
  43. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  44. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js +0 -1
  45. package/dist/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/codec/format/index.d.ts +1 -1
  47. package/dist/feature-libraries/chunked-forest/codec/format/index.d.ts.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/codec/format/index.js +2 -1
  49. package/dist/feature-libraries/chunked-forest/codec/format/index.js.map +1 -1
  50. package/dist/feature-libraries/chunked-forest/codec/format/versions.d.ts +10 -2
  51. package/dist/feature-libraries/chunked-forest/codec/format/versions.d.ts.map +1 -1
  52. package/dist/feature-libraries/chunked-forest/codec/format/versions.js +15 -1
  53. package/dist/feature-libraries/chunked-forest/codec/format/versions.js.map +1 -1
  54. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts +18 -5
  55. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  56. package/dist/feature-libraries/chunked-forest/uniformChunk.js +47 -19
  57. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  58. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -0
  59. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  60. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js +76 -22
  61. package/dist/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  62. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +1 -0
  63. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  64. package/dist/feature-libraries/indexing/anchorTreeIndex.js +3 -1
  65. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  66. package/dist/feature-libraries/indexing/types.d.ts +4 -3
  67. package/dist/feature-libraries/indexing/types.d.ts.map +1 -1
  68. package/dist/feature-libraries/indexing/types.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js.map +1 -1
  72. package/dist/packageVersion.d.ts +1 -1
  73. package/dist/packageVersion.d.ts.map +1 -1
  74. package/dist/packageVersion.js +1 -1
  75. package/dist/packageVersion.js.map +1 -1
  76. package/dist/serializableDomainSchema.d.ts +5 -5
  77. package/dist/serializableDomainSchema.d.ts.map +1 -1
  78. package/dist/serializableDomainSchema.js.map +1 -1
  79. package/dist/shared-tree/treeAlpha.d.ts +6 -2
  80. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  81. package/dist/shared-tree/treeAlpha.js.map +1 -1
  82. package/dist/shared-tree/treeCheckout.d.ts +1 -1
  83. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  84. package/dist/simple-tree/api/discrepancies.js +4 -1
  85. package/dist/simple-tree/api/discrepancies.js.map +1 -1
  86. package/dist/simple-tree/api/identifierIndex.d.ts +2 -2
  87. package/dist/simple-tree/api/identifierIndex.js +1 -1
  88. package/dist/simple-tree/api/identifierIndex.js.map +1 -1
  89. package/dist/simple-tree/api/index.d.ts +2 -2
  90. package/dist/simple-tree/api/index.d.ts.map +1 -1
  91. package/dist/simple-tree/api/index.js +3 -2
  92. package/dist/simple-tree/api/index.js.map +1 -1
  93. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +47 -2
  94. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  95. package/dist/simple-tree/api/schemaFactoryAlpha.js +26 -1
  96. package/dist/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  97. package/dist/simple-tree/api/simpleTreeIndex.d.ts +5 -5
  98. package/dist/simple-tree/api/simpleTreeIndex.js +1 -1
  99. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -1
  100. package/dist/simple-tree/api/storedSchema.d.ts.map +1 -1
  101. package/dist/simple-tree/api/storedSchema.js +4 -1
  102. package/dist/simple-tree/api/storedSchema.js.map +1 -1
  103. package/dist/simple-tree/api/treeAlpha.d.ts +70 -13
  104. package/dist/simple-tree/api/treeAlpha.d.ts.map +1 -1
  105. package/dist/simple-tree/api/treeAlpha.js.map +1 -1
  106. package/dist/simple-tree/api/treeChangeEvents.d.ts +1 -1
  107. package/dist/simple-tree/api/treeChangeEvents.js.map +1 -1
  108. package/dist/simple-tree/api/treeNodeApi.d.ts +60 -1
  109. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  110. package/dist/simple-tree/api/treeNodeApi.js +68 -6
  111. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  112. package/dist/simple-tree/core/toStored.d.ts +7 -0
  113. package/dist/simple-tree/core/toStored.d.ts.map +1 -1
  114. package/dist/simple-tree/core/toStored.js.map +1 -1
  115. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +17 -3
  116. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  117. package/dist/simple-tree/core/unhydratedFlexTree.js +114 -12
  118. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  119. package/dist/simple-tree/fieldSchema.d.ts +6 -1
  120. package/dist/simple-tree/fieldSchema.d.ts.map +1 -1
  121. package/dist/simple-tree/fieldSchema.js +3 -0
  122. package/dist/simple-tree/fieldSchema.js.map +1 -1
  123. package/dist/simple-tree/index.d.ts +2 -2
  124. package/dist/simple-tree/index.d.ts.map +1 -1
  125. package/dist/simple-tree/index.js +4 -3
  126. package/dist/simple-tree/index.js.map +1 -1
  127. package/dist/simple-tree/node-kinds/index.d.ts +1 -1
  128. package/dist/simple-tree/node-kinds/index.d.ts.map +1 -1
  129. package/dist/simple-tree/node-kinds/index.js.map +1 -1
  130. package/dist/simple-tree/node-kinds/map/index.d.ts +1 -1
  131. package/dist/simple-tree/node-kinds/map/index.d.ts.map +1 -1
  132. package/dist/simple-tree/node-kinds/map/index.js.map +1 -1
  133. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +13 -0
  134. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  135. package/dist/simple-tree/node-kinds/map/mapNode.js +6 -1
  136. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  137. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts +6 -6
  138. package/dist/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  139. package/dist/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  140. package/dist/simple-tree/simpleSchema.d.ts +17 -0
  141. package/dist/simple-tree/simpleSchema.d.ts.map +1 -1
  142. package/dist/simple-tree/simpleSchema.js.map +1 -1
  143. package/dist/simple-tree/toStoredSchema.d.ts.map +1 -1
  144. package/dist/simple-tree/toStoredSchema.js +23 -1
  145. package/dist/simple-tree/toStoredSchema.js.map +1 -1
  146. package/dist/tableSchema.d.ts +4 -5
  147. package/dist/tableSchema.d.ts.map +1 -1
  148. package/dist/tableSchema.js +12 -23
  149. package/dist/tableSchema.js.map +1 -1
  150. package/dist/text/textDomain.d.ts.map +1 -1
  151. package/dist/text/textDomain.js +27 -0
  152. package/dist/text/textDomain.js.map +1 -1
  153. package/dist/text/textDomainFormatted.d.ts +4 -4
  154. package/dist/util/index.d.ts +1 -1
  155. package/dist/util/index.d.ts.map +1 -1
  156. package/dist/util/index.js +2 -3
  157. package/dist/util/index.js.map +1 -1
  158. package/dist/util/utils.d.ts +0 -1
  159. package/dist/util/utils.d.ts.map +1 -1
  160. package/dist/util/utils.js +1 -6
  161. package/dist/util/utils.js.map +1 -1
  162. package/docs/user-facing/isolated-declarations.md +147 -0
  163. package/eslint.config.mts +1 -1
  164. package/lib/api.d.ts +6 -1
  165. package/lib/api.d.ts.map +1 -1
  166. package/lib/api.js.map +1 -1
  167. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  168. package/lib/core/tree/anchorSet.js +21 -0
  169. package/lib/core/tree/anchorSet.js.map +1 -1
  170. package/lib/entrypoints/alpha.d.ts +1 -1
  171. package/lib/entrypoints/alpha.d.ts.map +1 -1
  172. package/lib/entrypoints/alpha.js +1 -1
  173. package/lib/entrypoints/alpha.js.map +1 -1
  174. package/lib/entrypoints/beta.d.ts +1 -1
  175. package/lib/entrypoints/beta.d.ts.map +1 -1
  176. package/lib/entrypoints/beta.js +1 -1
  177. package/lib/entrypoints/beta.js.map +1 -1
  178. package/lib/entrypoints/legacy.d.ts +1 -1
  179. package/lib/entrypoints/legacy.d.ts.map +1 -1
  180. package/lib/entrypoints/legacy.js +1 -1
  181. package/lib/entrypoints/legacy.js.map +1 -1
  182. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts +25 -1
  183. package/lib/feature-libraries/chunked-forest/basicChunk.d.ts.map +1 -1
  184. package/lib/feature-libraries/chunked-forest/basicChunk.js +72 -19
  185. package/lib/feature-libraries/chunked-forest/basicChunk.js.map +1 -1
  186. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts +2 -2
  187. package/lib/feature-libraries/chunked-forest/chunkTree.d.ts.map +1 -1
  188. package/lib/feature-libraries/chunked-forest/chunkTree.js +2 -1
  189. package/lib/feature-libraries/chunked-forest/chunkTree.js.map +1 -1
  190. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js +2 -2
  191. package/lib/feature-libraries/chunked-forest/codec/chunkDecoding.js.map +1 -1
  192. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  193. package/lib/feature-libraries/chunked-forest/codec/codecs.js +2 -2
  194. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  195. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts +1 -1
  196. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.d.ts.map +1 -1
  197. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js +2 -2
  198. package/lib/feature-libraries/chunked-forest/codec/compressedEncode.js.map +1 -1
  199. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts +1 -2
  200. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.d.ts.map +1 -1
  201. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js +0 -1
  202. package/lib/feature-libraries/chunked-forest/codec/format/formatGeneric.js.map +1 -1
  203. package/lib/feature-libraries/chunked-forest/codec/format/index.d.ts +1 -1
  204. package/lib/feature-libraries/chunked-forest/codec/format/index.d.ts.map +1 -1
  205. package/lib/feature-libraries/chunked-forest/codec/format/index.js +1 -1
  206. package/lib/feature-libraries/chunked-forest/codec/format/index.js.map +1 -1
  207. package/lib/feature-libraries/chunked-forest/codec/format/versions.d.ts +10 -2
  208. package/lib/feature-libraries/chunked-forest/codec/format/versions.d.ts.map +1 -1
  209. package/lib/feature-libraries/chunked-forest/codec/format/versions.js +13 -0
  210. package/lib/feature-libraries/chunked-forest/codec/format/versions.js.map +1 -1
  211. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts +18 -5
  212. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  213. package/lib/feature-libraries/chunked-forest/uniformChunk.js +48 -20
  214. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  215. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts +19 -0
  216. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.d.ts.map +1 -1
  217. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js +76 -22
  218. package/lib/feature-libraries/forest-summary/incrementalSummaryBuilder.js.map +1 -1
  219. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +1 -0
  220. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -1
  221. package/lib/feature-libraries/indexing/anchorTreeIndex.js +3 -1
  222. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -1
  223. package/lib/feature-libraries/indexing/types.d.ts +4 -3
  224. package/lib/feature-libraries/indexing/types.d.ts.map +1 -1
  225. package/lib/feature-libraries/indexing/types.js.map +1 -1
  226. package/lib/index.d.ts +1 -1
  227. package/lib/index.d.ts.map +1 -1
  228. package/lib/index.js.map +1 -1
  229. package/lib/packageVersion.d.ts +1 -1
  230. package/lib/packageVersion.d.ts.map +1 -1
  231. package/lib/packageVersion.js +1 -1
  232. package/lib/packageVersion.js.map +1 -1
  233. package/lib/serializableDomainSchema.d.ts +5 -5
  234. package/lib/serializableDomainSchema.d.ts.map +1 -1
  235. package/lib/serializableDomainSchema.js +4 -1
  236. package/lib/serializableDomainSchema.js.map +1 -1
  237. package/lib/shared-tree/treeAlpha.d.ts +6 -2
  238. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  239. package/lib/shared-tree/treeAlpha.js.map +1 -1
  240. package/lib/shared-tree/treeCheckout.d.ts +1 -1
  241. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  242. package/lib/simple-tree/api/discrepancies.js +4 -1
  243. package/lib/simple-tree/api/discrepancies.js.map +1 -1
  244. package/lib/simple-tree/api/identifierIndex.d.ts +2 -2
  245. package/lib/simple-tree/api/identifierIndex.js +1 -1
  246. package/lib/simple-tree/api/identifierIndex.js.map +1 -1
  247. package/lib/simple-tree/api/index.d.ts +2 -2
  248. package/lib/simple-tree/api/index.d.ts.map +1 -1
  249. package/lib/simple-tree/api/index.js +1 -1
  250. package/lib/simple-tree/api/index.js.map +1 -1
  251. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +47 -2
  252. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  253. package/lib/simple-tree/api/schemaFactoryAlpha.js +28 -3
  254. package/lib/simple-tree/api/schemaFactoryAlpha.js.map +1 -1
  255. package/lib/simple-tree/api/simpleTreeIndex.d.ts +5 -5
  256. package/lib/simple-tree/api/simpleTreeIndex.js +1 -1
  257. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -1
  258. package/lib/simple-tree/api/storedSchema.d.ts.map +1 -1
  259. package/lib/simple-tree/api/storedSchema.js +4 -1
  260. package/lib/simple-tree/api/storedSchema.js.map +1 -1
  261. package/lib/simple-tree/api/treeAlpha.d.ts +70 -13
  262. package/lib/simple-tree/api/treeAlpha.d.ts.map +1 -1
  263. package/lib/simple-tree/api/treeAlpha.js.map +1 -1
  264. package/lib/simple-tree/api/treeChangeEvents.d.ts +1 -1
  265. package/lib/simple-tree/api/treeChangeEvents.js.map +1 -1
  266. package/lib/simple-tree/api/treeNodeApi.d.ts +60 -1
  267. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  268. package/lib/simple-tree/api/treeNodeApi.js +66 -6
  269. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  270. package/lib/simple-tree/core/toStored.d.ts +7 -0
  271. package/lib/simple-tree/core/toStored.d.ts.map +1 -1
  272. package/lib/simple-tree/core/toStored.js.map +1 -1
  273. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +17 -3
  274. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  275. package/lib/simple-tree/core/unhydratedFlexTree.js +115 -13
  276. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  277. package/lib/simple-tree/fieldSchema.d.ts +6 -1
  278. package/lib/simple-tree/fieldSchema.d.ts.map +1 -1
  279. package/lib/simple-tree/fieldSchema.js +3 -0
  280. package/lib/simple-tree/fieldSchema.js.map +1 -1
  281. package/lib/simple-tree/index.d.ts +2 -2
  282. package/lib/simple-tree/index.d.ts.map +1 -1
  283. package/lib/simple-tree/index.js +1 -1
  284. package/lib/simple-tree/index.js.map +1 -1
  285. package/lib/simple-tree/node-kinds/index.d.ts +1 -1
  286. package/lib/simple-tree/node-kinds/index.d.ts.map +1 -1
  287. package/lib/simple-tree/node-kinds/index.js.map +1 -1
  288. package/lib/simple-tree/node-kinds/map/index.d.ts +1 -1
  289. package/lib/simple-tree/node-kinds/map/index.d.ts.map +1 -1
  290. package/lib/simple-tree/node-kinds/map/index.js.map +1 -1
  291. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +13 -0
  292. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  293. package/lib/simple-tree/node-kinds/map/mapNode.js +6 -1
  294. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  295. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts +6 -6
  296. package/lib/simple-tree/node-kinds/map/mapNodeTypes.d.ts.map +1 -1
  297. package/lib/simple-tree/node-kinds/map/mapNodeTypes.js.map +1 -1
  298. package/lib/simple-tree/simpleSchema.d.ts +17 -0
  299. package/lib/simple-tree/simpleSchema.d.ts.map +1 -1
  300. package/lib/simple-tree/simpleSchema.js.map +1 -1
  301. package/lib/simple-tree/toStoredSchema.d.ts.map +1 -1
  302. package/lib/simple-tree/toStoredSchema.js +24 -2
  303. package/lib/simple-tree/toStoredSchema.js.map +1 -1
  304. package/lib/tableSchema.d.ts +4 -5
  305. package/lib/tableSchema.d.ts.map +1 -1
  306. package/lib/tableSchema.js +12 -23
  307. package/lib/tableSchema.js.map +1 -1
  308. package/lib/text/textDomain.d.ts.map +1 -1
  309. package/lib/text/textDomain.js +29 -0
  310. package/lib/text/textDomain.js.map +1 -1
  311. package/lib/text/textDomainFormatted.d.ts +4 -4
  312. package/lib/tsdoc-metadata.json +1 -1
  313. package/lib/util/index.d.ts +1 -1
  314. package/lib/util/index.d.ts.map +1 -1
  315. package/lib/util/index.js +1 -1
  316. package/lib/util/index.js.map +1 -1
  317. package/lib/util/utils.d.ts +0 -1
  318. package/lib/util/utils.d.ts.map +1 -1
  319. package/lib/util/utils.js +0 -1
  320. package/lib/util/utils.js.map +1 -1
  321. package/package.json +32 -37
  322. package/src/api.ts +10 -0
  323. package/src/core/tree/anchorSet.ts +25 -0
  324. package/src/entrypoints/alpha.ts +20 -16
  325. package/src/entrypoints/beta.ts +7 -1
  326. package/src/entrypoints/legacy.ts +8 -10
  327. package/src/feature-libraries/chunked-forest/basicChunk.ts +76 -20
  328. package/src/feature-libraries/chunked-forest/chunkTree.ts +3 -2
  329. package/src/feature-libraries/chunked-forest/codec/chunkDecoding.ts +2 -2
  330. package/src/feature-libraries/chunked-forest/codec/codecs.ts +2 -1
  331. package/src/feature-libraries/chunked-forest/codec/compressedEncode.ts +3 -2
  332. package/src/feature-libraries/chunked-forest/codec/format/formatGeneric.ts +0 -1
  333. package/src/feature-libraries/chunked-forest/codec/format/index.ts +1 -0
  334. package/src/feature-libraries/chunked-forest/codec/format/versions.ts +15 -0
  335. package/src/feature-libraries/chunked-forest/uniformChunk.ts +73 -21
  336. package/src/feature-libraries/forest-summary/incrementalSummaryBuilder.ts +116 -31
  337. package/src/feature-libraries/indexing/anchorTreeIndex.ts +1 -0
  338. package/src/feature-libraries/indexing/types.ts +5 -3
  339. package/src/index.ts +4 -0
  340. package/src/packageVersion.ts +1 -1
  341. package/src/serializableDomainSchema.ts +6 -0
  342. package/src/shared-tree/treeAlpha.ts +6 -2
  343. package/src/simple-tree/api/discrepancies.ts +6 -1
  344. package/src/simple-tree/api/identifierIndex.ts +2 -2
  345. package/src/simple-tree/api/index.ts +4 -0
  346. package/src/simple-tree/api/schemaFactoryAlpha.ts +99 -3
  347. package/src/simple-tree/api/simpleTreeIndex.ts +6 -6
  348. package/src/simple-tree/api/storedSchema.ts +4 -1
  349. package/src/simple-tree/api/treeAlpha.ts +75 -12
  350. package/src/simple-tree/api/treeChangeEvents.ts +1 -1
  351. package/src/simple-tree/api/treeNodeApi.ts +101 -7
  352. package/src/simple-tree/core/toStored.ts +8 -0
  353. package/src/simple-tree/core/unhydratedFlexTree.ts +134 -10
  354. package/src/simple-tree/fieldSchema.ts +10 -0
  355. package/src/simple-tree/index.ts +5 -0
  356. package/src/simple-tree/node-kinds/index.ts +1 -0
  357. package/src/simple-tree/node-kinds/map/index.ts +1 -0
  358. package/src/simple-tree/node-kinds/map/mapNode.ts +20 -3
  359. package/src/simple-tree/node-kinds/map/mapNodeTypes.ts +6 -6
  360. package/src/simple-tree/simpleSchema.ts +20 -0
  361. package/src/simple-tree/toStoredSchema.ts +28 -1
  362. package/src/tableSchema.ts +16 -28
  363. package/src/text/textDomain.ts +68 -1
  364. package/src/util/index.ts +0 -1
  365. package/src/util/utils.ts +0 -2
  366. package/.mocharc.customBenchmarks.cjs +0 -25
@@ -8,7 +8,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
8
8
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
9
9
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
10
10
  };
11
- var _UnhydratedFlexTreeNode_instances, _a, _UnhydratedFlexTreeNode_emitSubtreeChangedEvents, _b, _c;
11
+ var _UnhydratedFlexTreeNode_instances, _a, _UnhydratedFlexTreeNode_emitDeepChangesToAncestorArrays, _UnhydratedFlexTreeNode_emitSubtreeChangedEvents, _b, _c;
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.unsupportedUsageError = exports.createField = exports.UnhydratedSequenceField = exports.UnhydratedOptionalField = exports.UnhydratedFlexTreeField = exports.UnhydratedContext = exports.UnhydratedFlexTreeNode = void 0;
14
14
  const client_utils_1 = require("@fluid-internal/client-utils");
@@ -17,6 +17,12 @@ const internal_2 = require("@fluidframework/telemetry-utils/internal");
17
17
  const index_js_1 = require("../../core/index.js");
18
18
  const index_js_2 = require("../../feature-libraries/index.js");
19
19
  const index_js_3 = require("../../util/index.js");
20
+ /**
21
+ * Placeholder `DeltaDetachedNodeId` used as the attach/detach id in synthetic delta marks produced
22
+ * by the unhydrated sequence-field editor. Only the *presence* of the id is checked by
23
+ * {@link deltaMarksToArrayOps}, so the value itself is arbitrary.
24
+ */
25
+ const syntheticDetachedNodeId = { minor: 0 };
20
26
  /**
21
27
  * The {@link Unhydrated} implementation of {@link FlexTreeNode}.
22
28
  */
@@ -153,20 +159,64 @@ class UnhydratedFlexTreeNode {
153
159
  get value() {
154
160
  return this.data.value;
155
161
  }
156
- emitChangedEvent(key) {
162
+ /**
163
+ * Emit a `childrenChangedAfterBatch` event for this node, then propagate deep-change
164
+ * signals to ancestor array nodes and subtree-changed signals up the entire ancestor chain.
165
+ * @param key - The field key that changed.
166
+ * @param marks - Optional delta marks describing the change to the field. When provided, they
167
+ * are included in the `fieldMarks` payload so that array-node listeners can build a delta.
168
+ * When omitted (e.g. for non-sequence fields), `fieldMarks` is empty.
169
+ */
170
+ emitChangedEvent(key, marks) {
157
171
  this._events.emit("childrenChangedAfterBatch", {
158
172
  changedFields: new Set([key]),
159
- // Unhydrated nodes are not visited by the delta pipeline, so no field marks are available.
160
- fieldMarks: new Map(),
173
+ fieldMarks: marks === undefined ? new Map() : new Map([[key, marks]]),
161
174
  });
162
- // Also emit subtree changed event for this node and all ancestors.
175
+ // Emit subtree-changed events for this node and its non-array ancestors first,
176
+ // so that node.treeChanged fires before any ancestor array.treeChanged.
177
+ // Array ancestors and the nodes above them are handled by
178
+ // #emitDeepChangesToAncestorArrays, which propagates subtree events above
179
+ // each array boundary in the correct order.
163
180
  __classPrivateFieldGet(this, _UnhydratedFlexTreeNode_instances, "m", _UnhydratedFlexTreeNode_emitSubtreeChangedEvents).call(this);
181
+ // Mirrors the onlyDeepChanges block in anchorSet.ts for unhydrated nodes.
182
+ __classPrivateFieldGet(this, _UnhydratedFlexTreeNode_instances, "m", _UnhydratedFlexTreeNode_emitDeepChangesToAncestorArrays).call(this);
164
183
  }
165
184
  }
166
185
  exports.UnhydratedFlexTreeNode = UnhydratedFlexTreeNode;
167
- _a = UnhydratedFlexTreeNode, _UnhydratedFlexTreeNode_emitSubtreeChangedEvents = function _UnhydratedFlexTreeNode_emitSubtreeChangedEvents() {
186
+ _a = UnhydratedFlexTreeNode, _UnhydratedFlexTreeNode_emitDeepChangesToAncestorArrays = function _UnhydratedFlexTreeNode_emitDeepChangesToAncestorArrays() {
187
+ const location = this.parentField;
188
+ const parentField = location.parent;
189
+ const parentNode = parentField.parent;
190
+ if (parentNode === undefined || !(parentNode instanceof _a)) {
191
+ return;
192
+ }
193
+ // Only emit on array ancestors (EmptyKey); object/map ancestors don't carry delta payloads.
194
+ if (parentField.key === index_js_1.EmptyKey) {
195
+ const index = location.index;
196
+ const syntheticMarks = [];
197
+ if (index > 0) {
198
+ syntheticMarks.push({ count: index });
199
+ }
200
+ // `fields` presence (not content) signals a deep change to deltaMarksToArrayOps.
201
+ syntheticMarks.push({ count: 1, fields: new Map([[index_js_1.EmptyKey, { marks: [] }]]) });
202
+ parentNode._events.emit("childrenChangedAfterBatch", {
203
+ changedFields: new Set([index_js_1.EmptyKey]),
204
+ fieldMarks: new Map([[index_js_1.EmptyKey, syntheticMarks]]),
205
+ });
206
+ // Propagate subtree-changed events from the array upward so that
207
+ // ancestors above this array receive treeChanged after the array itself.
208
+ __classPrivateFieldGet(parentNode, _UnhydratedFlexTreeNode_instances, "m", _UnhydratedFlexTreeNode_emitSubtreeChangedEvents).call(parentNode);
209
+ }
210
+ __classPrivateFieldGet(parentNode, _UnhydratedFlexTreeNode_instances, "m", _UnhydratedFlexTreeNode_emitDeepChangesToAncestorArrays).call(parentNode);
211
+ }, _UnhydratedFlexTreeNode_emitSubtreeChangedEvents = function _UnhydratedFlexTreeNode_emitSubtreeChangedEvents() {
168
212
  this._events.emit("subtreeChangedAfterBatch");
169
- const parent = this.parentField.parent.parent;
213
+ const parentField = this.parentField.parent;
214
+ if (parentField.key === index_js_1.EmptyKey) {
215
+ // This node is an array element; stop here so that array ancestor
216
+ // events fire in the correct order relative to this node's treeChanged.
217
+ return;
218
+ }
219
+ const parent = parentField.parent;
170
220
  (0, internal_1.assert)(parent === undefined || parent instanceof _a, 0xb76 /* Unhydrated node's parent should be an unhydrated node */);
171
221
  if (parent !== undefined) {
172
222
  __classPrivateFieldGet(parent, _UnhydratedFlexTreeNode_instances, "m", _UnhydratedFlexTreeNode_emitSubtreeChangedEvents).call(parent);
@@ -297,7 +347,13 @@ class UnhydratedFlexTreeField {
297
347
  * @remarks All edits to the field (i.e. mutations of the field's MapTrees) should be directed through this function.
298
348
  * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.
299
349
  */
300
- edit(edit) {
350
+ edit(edit,
351
+ /**
352
+ * Delta marks describing this edit, forwarded to {@link UnhydratedFlexTreeNode.emitChangedEvent}.
353
+ * Sequence-field subclasses pass pre-computed marks so that array-node listeners receive a
354
+ * meaningful delta; other field kinds omit this parameter.
355
+ */
356
+ marks) {
301
357
  // Clear parents for all old map trees.
302
358
  for (const tree of this.children) {
303
359
  tree.adoptBy(undefined);
@@ -307,7 +363,7 @@ class UnhydratedFlexTreeField {
307
363
  for (const [index, tree] of this.children.entries()) {
308
364
  tree.adoptBy(this, index);
309
365
  }
310
- this.parent?.emitChangedEvent(this.key);
366
+ this.parent?.emitChangedEvent(this.key, marks);
311
367
  }
312
368
  getFieldPath() {
313
369
  throw unsupportedUsageError("Editing an array");
@@ -374,6 +430,11 @@ class UnhydratedSequenceField extends UnhydratedFlexTreeField {
374
430
  (0, internal_1.assert)(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);
375
431
  }
376
432
  const newContentChecked = newContent;
433
+ const insertCount = newContentChecked.length;
434
+ const marks = [];
435
+ if (index > 0)
436
+ marks.push({ count: index });
437
+ marks.push({ count: insertCount, attach: syntheticDetachedNodeId });
377
438
  this.edit((mapTrees) => {
378
439
  if (newContent.length < 1000) {
379
440
  // For "smallish arrays" (`1000` is not empirically derived), the `splice` function is appropriate...
@@ -383,23 +444,28 @@ class UnhydratedSequenceField extends UnhydratedFlexTreeField {
383
444
  // ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).
384
445
  return [...mapTrees.slice(0, index), ...newContentChecked, ...mapTrees.slice(index)];
385
446
  }
386
- });
447
+ }, marks);
387
448
  },
388
449
  remove: (index, count) => {
389
450
  for (let i = index; i < index + count; i++) {
390
451
  const c = this.children[i];
391
452
  (0, internal_1.assert)(c !== undefined, 0xa0b /* Unexpected sparse array */);
392
453
  }
454
+ const marks = [];
455
+ if (index > 0)
456
+ marks.push({ count: index });
457
+ marks.push({ count, detach: syntheticDetachedNodeId });
393
458
  let removed;
394
459
  this.edit((mapTrees) => {
395
460
  removed = mapTrees.splice(index, count);
396
- });
461
+ }, marks);
397
462
  return removed ?? (0, internal_1.fail)(0xb4a /* Expected removed to be set by edit */);
398
463
  },
399
464
  move: (sourceIndex, count, destIndex, source) => {
400
465
  const sourceField = source ?? this;
401
466
  if (sourceField === this) {
402
467
  // Within-field move: do both operations in a single edit to emit only one event
468
+ const marks = buildUnhydratedMoveMarks(sourceIndex, count, destIndex);
403
469
  this.edit((mapTrees) => {
404
470
  const removed = mapTrees.splice(sourceIndex, count);
405
471
  // Adjust destination index if it comes after the source
@@ -416,7 +482,7 @@ class UnhydratedSequenceField extends UnhydratedFlexTreeField {
416
482
  ...mapTrees.slice(adjustedDest),
417
483
  ];
418
484
  }
419
- });
485
+ }, marks);
420
486
  }
421
487
  else {
422
488
  // Cross-field move: remove from source, insert into destination
@@ -440,6 +506,42 @@ class UnhydratedSequenceField extends UnhydratedFlexTreeField {
440
506
  }
441
507
  exports.UnhydratedSequenceField = UnhydratedSequenceField;
442
508
  // #endregion Fields
509
+ /**
510
+ * Builds {@link DeltaMark}s describing a within-field move for use in
511
+ * {@link UnhydratedFlexTreeNode.emitChangedEvent}.
512
+ *
513
+ * @remarks
514
+ * Forward move (`sourceIndex < destIndex`):
515
+ * `[retain(src), detach(n), retain(mid), attach(n)]`
516
+ *
517
+ * Backward move (`destIndex < sourceIndex`):
518
+ * `[retain(dst), attach(n), retain(mid), detach(n)]`
519
+ *
520
+ * A no-op move (`sourceIndex === destIndex`) returns an empty array; the event
521
+ * should not fire in that case, but the empty marks are harmless if it does.
522
+ */
523
+ function buildUnhydratedMoveMarks(sourceIndex, count, destIndex) {
524
+ const marks = [];
525
+ if (sourceIndex < destIndex) {
526
+ if (sourceIndex > 0)
527
+ marks.push({ count: sourceIndex });
528
+ marks.push({ count, detach: syntheticDetachedNodeId });
529
+ const between = destIndex - sourceIndex - count;
530
+ if (between > 0)
531
+ marks.push({ count: between });
532
+ marks.push({ count, attach: syntheticDetachedNodeId });
533
+ }
534
+ else if (destIndex < sourceIndex) {
535
+ if (destIndex > 0)
536
+ marks.push({ count: destIndex });
537
+ marks.push({ count, attach: syntheticDetachedNodeId });
538
+ const between = sourceIndex - destIndex;
539
+ if (between > 0)
540
+ marks.push({ count: between });
541
+ marks.push({ count, detach: syntheticDetachedNodeId });
542
+ }
543
+ return marks;
544
+ }
443
545
  /** Creates a field with the given attributes */
444
546
  function createField(...args) {
445
547
  switch (args[1]) {
@@ -1 +1 @@
1
- {"version":3,"file":"unhydratedFlexTree.js","sourceRoot":"","sources":["../../../src/simple-tree/core/unhydratedFlexTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { HasListeners, Listenable } from \"@fluidframework/core-interfaces/internal\";\nimport { assert, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\ttype AnchorEvents,\n\tdummyRoot,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NodeData,\n\ttype NormalizedFieldUpPath,\n\ttype SchemaPolicy,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeValue,\n\ttype Value,\n} from \"../../core/index.js\";\nimport {\n\ttype FlexTreeContext,\n\tFlexTreeEntityKind,\n\ttype FlexTreeField,\n\ttype FlexTreeNode,\n\ttype FlexTreeOptionalField,\n\ttype FlexTreeRequiredField,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeTypedField,\n\ttype FlexTreeUnknownUnboxed,\n\tflexTreeMarker,\n\tindexForAt,\n\ttype FlexTreeHydratedContext,\n\ttype FlexFieldKind,\n\tFieldKinds,\n\ttype SequenceFieldEditBuilder,\n\tcursorForMapTreeNode,\n\ttype OptionalFieldEditBuilder,\n\ttype ValueFieldEditBuilder,\n\ttype FlexibleNodeContent,\n\ttype FlexTreeHydratedContextMinimal,\n\ttype FlexibleFieldContent,\n\ttype MapTreeFieldViewGeneric,\n\ttype MapTreeNodeViewGeneric,\n\ttype HydratedFlexTreeNode,\n\tcursorForMapTreeField,\n\ttype MinimalFieldMap,\n\tcurrentObserver,\n} from \"../../feature-libraries/index.js\";\nimport { brand, filterIterable, getOrCreate, mapIterable } from \"../../util/index.js\";\nimport type { ContextualFieldProvider } from \"../fieldSchema.js\";\n\nimport type { Context } from \"./context.js\";\nimport type { TreeNode } from \"./treeNode.js\";\n\ninterface UnhydratedTreeSequenceFieldEditBuilder\n\textends SequenceFieldEditBuilder<FlexibleFieldContent, UnhydratedFlexTreeNode[]> {\n\t/**\n\t * Moves elements from a source position to a destination position.\n\t * Can move within the same field or from another unhydrated sequence field.\n\t * @param sourceIndex - The index of the first element to move.\n\t * @param count - The number of elements to move.\n\t * @param destIndex - The index at which to insert the moved elements.\n\t * @param source - The source field to move from (defaults to this field for within-field moves).\n\t */\n\tmove(\n\t\tsourceIndex: number,\n\t\tcount: number,\n\t\tdestIndex: number,\n\t\tsource?: UnhydratedSequenceField,\n\t): void;\n}\n\ntype UnhydratedFlexTreeNodeEvents = Pick<\n\tAnchorEvents,\n\t\"childrenChangedAfterBatch\" | \"subtreeChangedAfterBatch\"\n>;\n\n/** A node's parent field and its index in that field */\ntype LocationInField = FlexTreeNode[\"parentField\"];\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeNode}.\n */\nexport class UnhydratedFlexTreeNode\n\timplements FlexTreeNode, MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic isHydrated(): this is HydratedFlexTreeNode {\n\t\treturn false;\n\t}\n\n\tprivate location = unparentedLocation;\n\n\tpublic get storedSchema(): TreeNodeStoredSchema {\n\t\treturn (\n\t\t\tthis.context.schema.nodeSchema.get(this.data.type) ?? fail(0xb46 /* missing schema */)\n\t\t);\n\t}\n\n\t/**\n\t * Cache storing the {@link TreeNode} for this inner node.\n\t * @remarks\n\t * When creating a `TreeNode` for this `UnhydratedFlexTreeNode`, cache the `TreeNode` in this property.\n\t * Currently this is done by {@link TreeNodeKernel}.\n\t *\n\t * See {@link getOrCreateNodeFromInnerNode} how to get the `TreeNode`, even if not already created, regardless of hydration status.\n\t */\n\tpublic treeNode: TreeNode | undefined;\n\n\tpublic readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;\n\n\tprivate readonly _events = createEmitter<UnhydratedFlexTreeNodeEvents>();\n\tpublic get events(): Listenable<UnhydratedFlexTreeNodeEvents> &\n\t\tHasListeners<UnhydratedFlexTreeNodeEvents> {\n\t\treturn this._events;\n\t}\n\n\tpublic get context(): FlexTreeContext {\n\t\treturn this.simpleContext.flexContext;\n\t}\n\n\t/**\n\t * Create a new UnhydratedFlexTreeNode.\n\t */\n\tpublic constructor(\n\t\t/**\n\t\t * The {@link NodeData} for this node.\n\t\t */\n\t\tpublic readonly data: NodeData,\n\t\t/**\n\t\t * All {@link UnhydratedFlexTreeField} for this node that have been created so far.\n\t\t * @remarks\n\t\t * This includes all non-empty fields, but also any empty fields which have been previously requested.\n\t\t */\n\t\tprivate readonly fieldsAll: Map<FieldKey, UnhydratedFlexTreeField>,\n\t\t/**\n\t\t * The {@link Context} for this node.\n\t\t * @remarks\n\t\t * Provides access to all schema reachable from this node.\n\t\t * See {@link getUnhydratedContext}.\n\t\t */\n\t\tpublic readonly simpleContext: Context,\n\t) {\n\t\tfor (const [_key, field] of this.fieldsAll) {\n\t\t\tfield.parent = this;\n\t\t}\n\t}\n\n\t/**\n\t * The non-empty fields on this node.\n\t * @remarks\n\t * This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.\n\t * Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.\n\t * Use {@link allFieldsLazy} to avoid evaluating pending defaults.\n\t */\n\tpublic readonly fields: MinimalFieldMap<UnhydratedFlexTreeField> = {\n\t\tget: (key: FieldKey): UnhydratedFlexTreeField | undefined => this.tryGetField(key),\n\t\t[Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> => {\n\t\t\tcurrentObserver?.observeNodeFields(this);\n\t\t\treturn filterIterable(this.fieldsAll, ([, field]) => field.length > 0);\n\t\t},\n\t};\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeField> {\n\t\treturn mapIterable(this.fields, ([, field]) => field)[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Gets all fields, without filtering out empty ones.\n\t * @remarks\n\t * This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.\n\t */\n\tpublic get allFieldsLazy(): ReadonlyMap<FieldKey, UnhydratedFlexTreeField> {\n\t\treturn this.fieldsAll;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.data.type;\n\t}\n\n\tprivate getOrCreateField(key: FieldKey): UnhydratedFlexTreeField {\n\t\treturn getOrCreate(this.fieldsAll, key, () => {\n\t\t\tconst stored = this.storedSchema.getFieldSchema(key).kind;\n\t\t\tconst field = createField(this.context, stored, key, []);\n\t\t\tfield.parent = this;\n\t\t\treturn field;\n\t\t});\n\t}\n\n\t/**\n\t * Set this node's parentage (see {@link FlexTreeNode.parentField}).\n\t * @remarks The node may be given a parent if it has none, or may have its parent removed (by passing `undefined`).\n\t * However, a node with a parent may not be directly re-assigned a different parent.\n\t * That likely indicates either an attempted multi-parenting or an attempt to \"move\" the node, neither of which are supported.\n\t * Removing a node's parent twice in a row is also not supported, as it likely indicates a bug.\n\t */\n\tpublic adoptBy(parent: undefined): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField, index: number): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField | undefined, index?: number): void {\n\t\tif (parent === undefined) {\n\t\t\tassert(\n\t\t\t\tthis.location !== unparentedLocation,\n\t\t\t\t0xa09 /* Node may not be un-adopted if it does not have a parent */,\n\t\t\t);\n\t\t\tthis.location = unparentedLocation;\n\t\t} else {\n\t\t\tassert(index !== undefined, 0xa08 /* Expected index */);\n\t\t\tif (this.location !== unparentedLocation) {\n\t\t\t\tthrow new UsageError(\"A node may not be in more than one place in the tree\");\n\t\t\t}\n\t\t\tlet unhydratedNode: UnhydratedFlexTreeNode | undefined = parent.parent;\n\t\t\twhile (unhydratedNode !== undefined) {\n\t\t\t\tif (unhydratedNode === this) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"A node may not be inserted into a location that is under itself\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst parentNode: FlexTreeNode | undefined = unhydratedNode.parentField.parent.parent;\n\t\t\t\tassert(\n\t\t\t\t\tparentNode === undefined || parentNode instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xb77 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t\t\t);\n\t\t\t\tunhydratedNode = parentNode;\n\t\t\t}\n\t\t\tthis.location = { parent, index };\n\t\t}\n\t}\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks If this node is unparented, this method will return the special {@link unparentedLocation} as the parent.\n\t */\n\tpublic get parentField(): LocationInField {\n\t\tcurrentObserver?.observeParentOf(this);\n\t\treturn this.location;\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(this);\n\t}\n\n\tpublic tryGetField(key: FieldKey): UnhydratedFlexTreeField | undefined {\n\t\tcurrentObserver?.observeNodeField(this, key);\n\n\t\tconst field = this.fieldsAll.get(key);\n\t\t// Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.\n\t\tif (field !== undefined && field.length > 0) {\n\t\t\treturn field;\n\t\t}\n\t}\n\n\tpublic getBoxed(key: string): UnhydratedFlexTreeField {\n\t\tconst fieldKey: FieldKey = brand(key);\n\n\t\tcurrentObserver?.observeNodeField(this, fieldKey);\n\n\t\treturn this.getOrCreateField(fieldKey);\n\t}\n\n\tpublic keys(): IterableIterator<FieldKey> {\n\t\treturn Array.from(this.fields, ([key]) => key)[Symbol.iterator]();\n\t}\n\n\tpublic get value(): Value {\n\t\treturn this.data.value;\n\t}\n\n\tpublic emitChangedEvent(key: FieldKey): void {\n\t\tthis._events.emit(\"childrenChangedAfterBatch\", {\n\t\t\tchangedFields: new Set([key]),\n\t\t\t// Unhydrated nodes are not visited by the delta pipeline, so no field marks are available.\n\t\t\tfieldMarks: new Map(),\n\t\t});\n\n\t\t// Also emit subtree changed event for this node and all ancestors.\n\t\tthis.#emitSubtreeChangedEvents();\n\t}\n\n\t/**\n\t * Emit subtree changed events for this node and all ancestors.\n\t */\n\t#emitSubtreeChangedEvents(): void {\n\t\tthis._events.emit(\"subtreeChangedAfterBatch\");\n\n\t\tconst parent = this.parentField.parent.parent;\n\t\tassert(\n\t\t\tparent === undefined || parent instanceof UnhydratedFlexTreeNode,\n\t\t\t0xb76 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t);\n\t\tif (parent !== undefined) {\n\t\t\tparent.#emitSubtreeChangedEvents();\n\t\t}\n\t}\n}\n\n/**\n * Implementation of `FlexTreeContext`.\n *\n * @remarks An editor is required to edit the FlexTree.\n */\nexport class UnhydratedContext implements FlexTreeContext {\n\t/**\n\t * @param flexSchema - Schema to use when working with the tree.\n\t */\n\tpublic constructor(\n\t\tpublic readonly schemaPolicy: SchemaPolicy,\n\t\tpublic readonly schema: TreeStoredSchema,\n\t) {}\n\n\tpublic isDisposed(): boolean {\n\t\treturn false;\n\t}\n\n\tpublic isHydrated(): this is FlexTreeHydratedContext {\n\t\treturn false;\n\t}\n}\n\n// #region Fields\n\n/**\n * A special singleton that is the implicit {@link LocationInField} of all un-parented {@link UnhydratedFlexTreeNode}s.\n * @remarks This exists because {@link UnhydratedFlexTreeNode.parentField} must return a field.\n * If a {@link UnhydratedFlexTreeNode} is created without a parent, its {@link UnhydratedFlexTreeNode.parentField} property will point to this object.\n * However, this field cannot be used in any practical way because it is empty, i.e. it does not actually contain the children that claim to be parented under it.\n * It has the \"empty\" schema and it will always contain zero children if queried.\n * Any nodes with this location will have a dummy parent index of `-1`.\n *\n * TODO: make this make sense.\n */\nconst unparentedLocation: LocationInField = {\n\tparent: {\n\t\tkey: dummyRoot,\n\t\tparent: undefined,\n\t\tschema: brand(FieldKinds.optional.identifier),\n\t},\n\tindex: 0,\n};\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeField}.\n */\nexport class UnhydratedFlexTreeField\n\timplements FlexTreeField, MapTreeFieldViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic [flexTreeMarker] = FlexTreeEntityKind.Field as const;\n\n\tpublic parent: UnhydratedFlexTreeNode | undefined = undefined;\n\n\tpublic constructor(\n\t\tpublic readonly context: FlexTreeContext,\n\t\tpublic readonly schema: FieldKindIdentifier,\n\t\tpublic readonly key: FieldKey,\n\t\t/**\n\t\t * The children of this field.\n\t\t * @remarks\n\t\t * This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).\n\t\t * See {@link fillPendingDefaults}.\n\t\t * Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.\n\t\t */\n\t\tprivate lazyChildren: UnhydratedFlexTreeNode[] | ContextualFieldProvider,\n\t) {\n\t\t// When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.\n\t\t// \"Adopt\" each child by updating its parent information to point to this field.\n\t\tif (Array.isArray(lazyChildren)) {\n\t\t\tfor (const [i, child] of lazyChildren.entries()) {\n\t\t\t\tchild.adoptBy(this, i);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeField<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(\n\t\t\tthis.children,\n\t\t);\n\t}\n\n\tprivate getPendingDefault(): ContextualFieldProvider | undefined {\n\t\treturn Array.isArray(this.lazyChildren) ? undefined : this.lazyChildren;\n\t}\n\n\t/**\n\t * Populate pending default (if present) using the provided context.\n\t * @remarks\n\t * This apply to just this field: caller will likely want to recursively walk the tree.\n\t * @see {@link pendingDefault}.\n\t */\n\tpublic fillPendingDefaults(context: FlexTreeHydratedContextMinimal): void {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(context);\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.\n\t */\n\tpublic get pendingDefault(): boolean {\n\t\treturn this.getPendingDefault() !== undefined;\n\t}\n\n\tpublic get children(): UnhydratedFlexTreeNode[] {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(\"UseGlobalContext\");\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t\treturn this.lazyChildren as UnhydratedFlexTreeNode[];\n\t}\n\n\tpublic get length(): number {\n\t\treturn this.children.length;\n\t}\n\n\tpublic is<TKind2 extends FlexFieldKind>(kind: TKind2): this is FlexTreeTypedField<TKind2> {\n\t\treturn this.schema === kind.identifier;\n\t}\n\n\tpublic boxedAt(index: number): FlexTreeNode | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst m = this.children[i];\n\t\treturn m;\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeNode> {\n\t\treturn this.children[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Mutate this field.\n\t * @param edit - A function which receives the current `MapTree`s that comprise the contents of the field so that it may be mutated.\n\t * The function may mutate the array in place or return a new array.\n\t * If a new array is returned then it will be used as the new contents of the field, otherwise the original array will be continue to be used.\n\t * @remarks All edits to the field (i.e. mutations of the field's MapTrees) should be directed through this function.\n\t * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.\n\t */\n\tprotected edit(\n\t\tedit: (mapTrees: UnhydratedFlexTreeNode[]) => void | UnhydratedFlexTreeNode[],\n\t): void {\n\t\t// Clear parents for all old map trees.\n\t\tfor (const tree of this.children) {\n\t\t\ttree.adoptBy(undefined);\n\t\t}\n\n\t\tthis.lazyChildren = edit(this.children) ?? this.children;\n\n\t\t// Set parents for all new map trees.\n\t\tfor (const [index, tree] of this.children.entries()) {\n\t\t\ttree.adoptBy(this, index);\n\t\t}\n\n\t\tthis.parent?.emitChangedEvent(this.key);\n\t}\n\n\tpublic getFieldPath(): NormalizedFieldUpPath {\n\t\tthrow unsupportedUsageError(\"Editing an array\");\n\t}\n\n\t/** Unboxes leaf nodes to their values */\n\tprotected unboxed(index: number): TreeValue | UnhydratedFlexTreeNode {\n\t\tconst child = this.children[index] ?? oob();\n\t\tconst value = child.value;\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t\treturn child;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.\n */\nexport class UnhydratedOptionalField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeOptionalField\n{\n\tpublic readonly editor = {\n\t\tset: (newContent: FlexibleNodeContent | undefined): void => {\n\t\t\tif (newContent !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tnewContent instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xbb7 /* Expected unhydrated node */,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent === undefined) {\n\t\t\t\t\tmapTrees.length = 0;\n\t\t\t\t} else {\n\t\t\t\t\tmapTrees[0] = newContent;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t} satisfies OptionalFieldEditBuilder<FlexibleNodeContent> &\n\t\tValueFieldEditBuilder<FlexibleNodeContent>;\n\n\tpublic get content(): FlexTreeUnknownUnboxed | undefined {\n\t\tconst value = this.children[0];\n\t\tif (value !== undefined) {\n\t\t\treturn this.unboxed(0);\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n\nclass UnhydratedRequiredField\n\textends UnhydratedOptionalField\n\timplements FlexTreeRequiredField\n{\n\tpublic override get content(): FlexTreeUnknownUnboxed {\n\t\t// This cannot use ?? since null is a legal value here.\n\t\tassert(\n\t\t\tsuper.content !== undefined,\n\t\t\t0xa57 /* Expected EagerMapTree required field to have a value */,\n\t\t);\n\t\treturn super.content;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.\n */\nexport class UnhydratedSequenceField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeSequenceField\n{\n\tpublic readonly editor = {\n\t\tinsert: (index, newContent): void => {\n\t\t\tfor (const c of newContent) {\n\t\t\t\tassert(c !== undefined, 0xa0a /* Unexpected sparse array content */);\n\t\t\t\tassert(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);\n\t\t\t}\n\t\t\tconst newContentChecked = newContent as readonly UnhydratedFlexTreeNode[];\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent.length < 1000) {\n\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\tmapTrees.splice(index, 0, ...newContentChecked);\n\t\t\t\t} else {\n\t\t\t\t\t// ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\treturn [...mapTrees.slice(0, index), ...newContentChecked, ...mapTrees.slice(index)];\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tremove: (index, count): UnhydratedFlexTreeNode[] => {\n\t\t\tfor (let i = index; i < index + count; i++) {\n\t\t\t\tconst c = this.children[i];\n\t\t\t\tassert(c !== undefined, 0xa0b /* Unexpected sparse array */);\n\t\t\t}\n\t\t\tlet removed: UnhydratedFlexTreeNode[] | undefined;\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tremoved = mapTrees.splice(index, count);\n\t\t\t});\n\t\t\treturn removed ?? fail(0xb4a /* Expected removed to be set by edit */);\n\t\t},\n\t\tmove: (sourceIndex, count, destIndex, source?): void => {\n\t\t\tconst sourceField = source ?? this;\n\t\t\tif (sourceField === this) {\n\t\t\t\t// Within-field move: do both operations in a single edit to emit only one event\n\t\t\t\tthis.edit((mapTrees) => {\n\t\t\t\t\tconst removed = mapTrees.splice(sourceIndex, count);\n\t\t\t\t\t// Adjust destination index if it comes after the source\n\t\t\t\t\tconst adjustedDest = destIndex > sourceIndex ? destIndex - count : destIndex;\n\t\t\t\t\tif (removed.length < 1000) {\n\t\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\t\tmapTrees.splice(adjustedDest, 0, ...removed);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// ...but we avoid using `splice` + spread for very large arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t...mapTrees.slice(0, adjustedDest),\n\t\t\t\t\t\t\t...removed,\n\t\t\t\t\t\t\t...mapTrees.slice(adjustedDest),\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Cross-field move: remove from source, insert into destination\n\t\t\t\t// Each field emits one event (correct behavior for different fields)\n\t\t\t\tconst removed = sourceField.editor.remove(sourceIndex, count);\n\t\t\t\tthis.editor.insert(destIndex, removed);\n\t\t\t}\n\t\t},\n\t} satisfies UnhydratedTreeSequenceFieldEditBuilder;\n\n\tpublic at(index: number): FlexTreeUnknownUnboxed | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.unboxed(i);\n\t}\n\tpublic map<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[] {\n\t\treturn Array.from(this, callbackfn);\n\t}\n}\n\n// #endregion Fields\n\n/** Creates a field with the given attributes */\nexport function createField(\n\t...args: ConstructorParameters<typeof UnhydratedFlexTreeField>\n): UnhydratedFlexTreeField {\n\tswitch (args[1]) {\n\t\tcase FieldKinds.required.identifier:\n\t\tcase FieldKinds.identifier.identifier: {\n\t\t\treturn new UnhydratedRequiredField(...args);\n\t\t}\n\t\tcase FieldKinds.optional.identifier: {\n\t\t\treturn new UnhydratedOptionalField(...args);\n\t\t}\n\t\tcase FieldKinds.sequence.identifier: {\n\t\t\treturn new UnhydratedSequenceField(...args);\n\t\t}\n\t\tcase FieldKinds.forbidden.identifier: {\n\t\t\t// TODO: this seems to used by unknown optional fields. They should probably use \"optional\" not \"Forbidden\" schema.\n\t\t\treturn new UnhydratedFlexTreeField(...args);\n\t\t}\n\t\tdefault: {\n\t\t\treturn fail(0xb9d /* unsupported field kind */);\n\t\t}\n\t}\n}\n\nexport function unsupportedUsageError(message?: string): Error {\n\treturn new UsageError(\n\t\t`${\n\t\t\tmessage ?? \"Operation\"\n\t\t} is not supported for content that has not yet been inserted into the tree`,\n\t);\n}\n"]}
1
+ {"version":3,"file":"unhydratedFlexTree.js","sourceRoot":"","sources":["../../../src/simple-tree/core/unhydratedFlexTree.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { createEmitter } from \"@fluid-internal/client-utils\";\nimport type { HasListeners, Listenable } from \"@fluidframework/core-interfaces/internal\";\nimport { assert, oob, fail } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport {\n\ttype AnchorEvents,\n\tdummyRoot,\n\tEmptyKey,\n\ttype DeltaDetachedNodeId,\n\ttype DeltaMark,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NodeData,\n\ttype NormalizedFieldUpPath,\n\ttype SchemaPolicy,\n\ttype TreeNodeSchemaIdentifier,\n\ttype TreeNodeStoredSchema,\n\ttype TreeStoredSchema,\n\ttype TreeValue,\n\ttype Value,\n} from \"../../core/index.js\";\nimport {\n\ttype FlexTreeContext,\n\tFlexTreeEntityKind,\n\ttype FlexTreeField,\n\ttype FlexTreeNode,\n\ttype FlexTreeOptionalField,\n\ttype FlexTreeRequiredField,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeTypedField,\n\ttype FlexTreeUnknownUnboxed,\n\tflexTreeMarker,\n\tindexForAt,\n\ttype FlexTreeHydratedContext,\n\ttype FlexFieldKind,\n\tFieldKinds,\n\ttype SequenceFieldEditBuilder,\n\tcursorForMapTreeNode,\n\ttype OptionalFieldEditBuilder,\n\ttype ValueFieldEditBuilder,\n\ttype FlexibleNodeContent,\n\ttype FlexTreeHydratedContextMinimal,\n\ttype FlexibleFieldContent,\n\ttype MapTreeFieldViewGeneric,\n\ttype MapTreeNodeViewGeneric,\n\ttype HydratedFlexTreeNode,\n\tcursorForMapTreeField,\n\ttype MinimalFieldMap,\n\tcurrentObserver,\n} from \"../../feature-libraries/index.js\";\nimport { brand, filterIterable, getOrCreate, mapIterable } from \"../../util/index.js\";\nimport type { ContextualFieldProvider } from \"../fieldSchema.js\";\n\nimport type { Context } from \"./context.js\";\nimport type { TreeNode } from \"./treeNode.js\";\n\ninterface UnhydratedTreeSequenceFieldEditBuilder\n\textends SequenceFieldEditBuilder<FlexibleFieldContent, UnhydratedFlexTreeNode[]> {\n\t/**\n\t * Moves elements from a source position to a destination position.\n\t * Can move within the same field or from another unhydrated sequence field.\n\t * @param sourceIndex - The index of the first element to move.\n\t * @param count - The number of elements to move.\n\t * @param destIndex - The index at which to insert the moved elements.\n\t * @param source - The source field to move from (defaults to this field for within-field moves).\n\t */\n\tmove(\n\t\tsourceIndex: number,\n\t\tcount: number,\n\t\tdestIndex: number,\n\t\tsource?: UnhydratedSequenceField,\n\t): void;\n}\n\ntype UnhydratedFlexTreeNodeEvents = Pick<\n\tAnchorEvents,\n\t\"childrenChangedAfterBatch\" | \"subtreeChangedAfterBatch\"\n>;\n\n/** A node's parent field and its index in that field */\ntype LocationInField = FlexTreeNode[\"parentField\"];\n\n/**\n * Placeholder `DeltaDetachedNodeId` used as the attach/detach id in synthetic delta marks produced\n * by the unhydrated sequence-field editor. Only the *presence* of the id is checked by\n * {@link deltaMarksToArrayOps}, so the value itself is arbitrary.\n */\nconst syntheticDetachedNodeId: DeltaDetachedNodeId = { minor: 0 };\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeNode}.\n */\nexport class UnhydratedFlexTreeNode\n\timplements FlexTreeNode, MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic isHydrated(): this is HydratedFlexTreeNode {\n\t\treturn false;\n\t}\n\n\tprivate location = unparentedLocation;\n\n\tpublic get storedSchema(): TreeNodeStoredSchema {\n\t\treturn (\n\t\t\tthis.context.schema.nodeSchema.get(this.data.type) ?? fail(0xb46 /* missing schema */)\n\t\t);\n\t}\n\n\t/**\n\t * Cache storing the {@link TreeNode} for this inner node.\n\t * @remarks\n\t * When creating a `TreeNode` for this `UnhydratedFlexTreeNode`, cache the `TreeNode` in this property.\n\t * Currently this is done by {@link TreeNodeKernel}.\n\t *\n\t * See {@link getOrCreateNodeFromInnerNode} how to get the `TreeNode`, even if not already created, regardless of hydration status.\n\t */\n\tpublic treeNode: TreeNode | undefined;\n\n\tpublic readonly [flexTreeMarker] = FlexTreeEntityKind.Node as const;\n\n\tprivate readonly _events = createEmitter<UnhydratedFlexTreeNodeEvents>();\n\tpublic get events(): Listenable<UnhydratedFlexTreeNodeEvents> &\n\t\tHasListeners<UnhydratedFlexTreeNodeEvents> {\n\t\treturn this._events;\n\t}\n\n\tpublic get context(): FlexTreeContext {\n\t\treturn this.simpleContext.flexContext;\n\t}\n\n\t/**\n\t * Create a new UnhydratedFlexTreeNode.\n\t */\n\tpublic constructor(\n\t\t/**\n\t\t * The {@link NodeData} for this node.\n\t\t */\n\t\tpublic readonly data: NodeData,\n\t\t/**\n\t\t * All {@link UnhydratedFlexTreeField} for this node that have been created so far.\n\t\t * @remarks\n\t\t * This includes all non-empty fields, but also any empty fields which have been previously requested.\n\t\t */\n\t\tprivate readonly fieldsAll: Map<FieldKey, UnhydratedFlexTreeField>,\n\t\t/**\n\t\t * The {@link Context} for this node.\n\t\t * @remarks\n\t\t * Provides access to all schema reachable from this node.\n\t\t * See {@link getUnhydratedContext}.\n\t\t */\n\t\tpublic readonly simpleContext: Context,\n\t) {\n\t\tfor (const [_key, field] of this.fieldsAll) {\n\t\t\tfield.parent = this;\n\t\t}\n\t}\n\n\t/**\n\t * The non-empty fields on this node.\n\t * @remarks\n\t * This is needed to implement {@link MapTreeNodeViewGeneric.fields}, which must omit empty fields.\n\t * Due to having to detect if a field is empty, this forces the evaluation of any pending defaults in the fields.\n\t * Use {@link allFieldsLazy} to avoid evaluating pending defaults.\n\t */\n\tpublic readonly fields: MinimalFieldMap<UnhydratedFlexTreeField> = {\n\t\tget: (key: FieldKey): UnhydratedFlexTreeField | undefined => this.tryGetField(key),\n\t\t[Symbol.iterator]: (): IterableIterator<[FieldKey, UnhydratedFlexTreeField]> => {\n\t\t\tcurrentObserver?.observeNodeFields(this);\n\t\t\treturn filterIterable(this.fieldsAll, ([, field]) => field.length > 0);\n\t\t},\n\t};\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeField> {\n\t\treturn mapIterable(this.fields, ([, field]) => field)[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Gets all fields, without filtering out empty ones.\n\t * @remarks\n\t * This avoids forcing the evaluating of pending defaults in the fields, and also saves a copy on access.\n\t */\n\tpublic get allFieldsLazy(): ReadonlyMap<FieldKey, UnhydratedFlexTreeField> {\n\t\treturn this.fieldsAll;\n\t}\n\n\tpublic get type(): TreeNodeSchemaIdentifier {\n\t\treturn this.data.type;\n\t}\n\n\tprivate getOrCreateField(key: FieldKey): UnhydratedFlexTreeField {\n\t\treturn getOrCreate(this.fieldsAll, key, () => {\n\t\t\tconst stored = this.storedSchema.getFieldSchema(key).kind;\n\t\t\tconst field = createField(this.context, stored, key, []);\n\t\t\tfield.parent = this;\n\t\t\treturn field;\n\t\t});\n\t}\n\n\t/**\n\t * Set this node's parentage (see {@link FlexTreeNode.parentField}).\n\t * @remarks The node may be given a parent if it has none, or may have its parent removed (by passing `undefined`).\n\t * However, a node with a parent may not be directly re-assigned a different parent.\n\t * That likely indicates either an attempted multi-parenting or an attempt to \"move\" the node, neither of which are supported.\n\t * Removing a node's parent twice in a row is also not supported, as it likely indicates a bug.\n\t */\n\tpublic adoptBy(parent: undefined): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField, index: number): void;\n\tpublic adoptBy(parent: UnhydratedFlexTreeField | undefined, index?: number): void {\n\t\tif (parent === undefined) {\n\t\t\tassert(\n\t\t\t\tthis.location !== unparentedLocation,\n\t\t\t\t0xa09 /* Node may not be un-adopted if it does not have a parent */,\n\t\t\t);\n\t\t\tthis.location = unparentedLocation;\n\t\t} else {\n\t\t\tassert(index !== undefined, 0xa08 /* Expected index */);\n\t\t\tif (this.location !== unparentedLocation) {\n\t\t\t\tthrow new UsageError(\"A node may not be in more than one place in the tree\");\n\t\t\t}\n\t\t\tlet unhydratedNode: UnhydratedFlexTreeNode | undefined = parent.parent;\n\t\t\twhile (unhydratedNode !== undefined) {\n\t\t\t\tif (unhydratedNode === this) {\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"A node may not be inserted into a location that is under itself\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst parentNode: FlexTreeNode | undefined = unhydratedNode.parentField.parent.parent;\n\t\t\t\tassert(\n\t\t\t\t\tparentNode === undefined || parentNode instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xb77 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t\t\t);\n\t\t\t\tunhydratedNode = parentNode;\n\t\t\t}\n\t\t\tthis.location = { parent, index };\n\t\t}\n\t}\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks If this node is unparented, this method will return the special {@link unparentedLocation} as the parent.\n\t */\n\tpublic get parentField(): LocationInField {\n\t\tcurrentObserver?.observeParentOf(this);\n\t\treturn this.location;\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeNode<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(this);\n\t}\n\n\tpublic tryGetField(key: FieldKey): UnhydratedFlexTreeField | undefined {\n\t\tcurrentObserver?.observeNodeField(this, key);\n\n\t\tconst field = this.fieldsAll.get(key);\n\t\t// Only return the field if it is not empty, in order to fulfill the contract of `tryGetField`.\n\t\tif (field !== undefined && field.length > 0) {\n\t\t\treturn field;\n\t\t}\n\t}\n\n\tpublic getBoxed(key: string): UnhydratedFlexTreeField {\n\t\tconst fieldKey: FieldKey = brand(key);\n\n\t\tcurrentObserver?.observeNodeField(this, fieldKey);\n\n\t\treturn this.getOrCreateField(fieldKey);\n\t}\n\n\tpublic keys(): IterableIterator<FieldKey> {\n\t\treturn Array.from(this.fields, ([key]) => key)[Symbol.iterator]();\n\t}\n\n\tpublic get value(): Value {\n\t\treturn this.data.value;\n\t}\n\n\t/**\n\t * Emit a `childrenChangedAfterBatch` event for this node, then propagate deep-change\n\t * signals to ancestor array nodes and subtree-changed signals up the entire ancestor chain.\n\t * @param key - The field key that changed.\n\t * @param marks - Optional delta marks describing the change to the field. When provided, they\n\t * are included in the `fieldMarks` payload so that array-node listeners can build a delta.\n\t * When omitted (e.g. for non-sequence fields), `fieldMarks` is empty.\n\t */\n\tpublic emitChangedEvent(key: FieldKey, marks?: readonly DeltaMark[]): void {\n\t\tthis._events.emit(\"childrenChangedAfterBatch\", {\n\t\t\tchangedFields: new Set([key]),\n\t\t\tfieldMarks: marks === undefined ? new Map() : new Map([[key, marks]]),\n\t\t});\n\n\t\t// Emit subtree-changed events for this node and its non-array ancestors first,\n\t\t// so that node.treeChanged fires before any ancestor array.treeChanged.\n\t\t// Array ancestors and the nodes above them are handled by\n\t\t// #emitDeepChangesToAncestorArrays, which propagates subtree events above\n\t\t// each array boundary in the correct order.\n\t\tthis.#emitSubtreeChangedEvents();\n\n\t\t// Mirrors the onlyDeepChanges block in anchorSet.ts for unhydrated nodes.\n\t\tthis.#emitDeepChangesToAncestorArrays();\n\t}\n\n\t/**\n\t * Emit `childrenChangedAfterBatch` on each ancestor array node with synthetic\n\t * marks indicating a deep change at this node's position within the array.\n\t * After emitting on each array ancestor, propagates subtree-changed events\n\t * upward from that array so that ancestor nodes above the array receive their\n\t * `treeChanged` events after the array's own event.\n\t */\n\t#emitDeepChangesToAncestorArrays(): void {\n\t\tconst location = this.parentField;\n\t\tconst parentField = location.parent;\n\t\tconst parentNode = parentField.parent;\n\n\t\tif (parentNode === undefined || !(parentNode instanceof UnhydratedFlexTreeNode)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Only emit on array ancestors (EmptyKey); object/map ancestors don't carry delta payloads.\n\t\tif (parentField.key === EmptyKey) {\n\t\t\tconst index = location.index;\n\t\t\tconst syntheticMarks: DeltaMark[] = [];\n\t\t\tif (index > 0) {\n\t\t\t\tsyntheticMarks.push({ count: index });\n\t\t\t}\n\t\t\t// `fields` presence (not content) signals a deep change to deltaMarksToArrayOps.\n\t\t\tsyntheticMarks.push({ count: 1, fields: new Map([[EmptyKey, { marks: [] }]]) });\n\n\t\t\tparentNode._events.emit(\"childrenChangedAfterBatch\", {\n\t\t\t\tchangedFields: new Set([EmptyKey]),\n\t\t\t\tfieldMarks: new Map([[EmptyKey, syntheticMarks]]),\n\t\t\t});\n\n\t\t\t// Propagate subtree-changed events from the array upward so that\n\t\t\t// ancestors above this array receive treeChanged after the array itself.\n\t\t\tparentNode.#emitSubtreeChangedEvents();\n\t\t}\n\n\t\tparentNode.#emitDeepChangesToAncestorArrays();\n\t}\n\n\t/**\n\t * Emit `subtreeChangedAfterBatch` on this node and propagate upward to\n\t * ancestors, stopping before the first ancestor array node.\n\t * Propagation stops at an array boundary because\n\t * {@link UnhydratedFlexTreeNode.#emitDeepChangesToAncestorArrays} is\n\t * responsible for emitting on array ancestors and the nodes above them\n\t * in the correct order.\n\t */\n\t#emitSubtreeChangedEvents(): void {\n\t\tthis._events.emit(\"subtreeChangedAfterBatch\");\n\n\t\tconst parentField = this.parentField.parent;\n\t\tif (parentField.key === EmptyKey) {\n\t\t\t// This node is an array element; stop here so that array ancestor\n\t\t\t// events fire in the correct order relative to this node's treeChanged.\n\t\t\treturn;\n\t\t}\n\t\tconst parent = parentField.parent;\n\t\tassert(\n\t\t\tparent === undefined || parent instanceof UnhydratedFlexTreeNode,\n\t\t\t0xb76 /* Unhydrated node's parent should be an unhydrated node */,\n\t\t);\n\t\tif (parent !== undefined) {\n\t\t\tparent.#emitSubtreeChangedEvents();\n\t\t}\n\t}\n}\n\n/**\n * Implementation of `FlexTreeContext`.\n *\n * @remarks An editor is required to edit the FlexTree.\n */\nexport class UnhydratedContext implements FlexTreeContext {\n\t/**\n\t * @param flexSchema - Schema to use when working with the tree.\n\t */\n\tpublic constructor(\n\t\tpublic readonly schemaPolicy: SchemaPolicy,\n\t\tpublic readonly schema: TreeStoredSchema,\n\t) {}\n\n\tpublic isDisposed(): boolean {\n\t\treturn false;\n\t}\n\n\tpublic isHydrated(): this is FlexTreeHydratedContext {\n\t\treturn false;\n\t}\n}\n\n// #region Fields\n\n/**\n * A special singleton that is the implicit {@link LocationInField} of all un-parented {@link UnhydratedFlexTreeNode}s.\n * @remarks This exists because {@link UnhydratedFlexTreeNode.parentField} must return a field.\n * If a {@link UnhydratedFlexTreeNode} is created without a parent, its {@link UnhydratedFlexTreeNode.parentField} property will point to this object.\n * However, this field cannot be used in any practical way because it is empty, i.e. it does not actually contain the children that claim to be parented under it.\n * It has the \"empty\" schema and it will always contain zero children if queried.\n * Any nodes with this location will have a dummy parent index of `-1`.\n *\n * TODO: make this make sense.\n */\nconst unparentedLocation: LocationInField = {\n\tparent: {\n\t\tkey: dummyRoot,\n\t\tparent: undefined,\n\t\tschema: brand(FieldKinds.optional.identifier),\n\t},\n\tindex: 0,\n};\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeField}.\n */\nexport class UnhydratedFlexTreeField\n\timplements FlexTreeField, MapTreeFieldViewGeneric<UnhydratedFlexTreeNode>\n{\n\tpublic [flexTreeMarker] = FlexTreeEntityKind.Field as const;\n\n\tpublic parent: UnhydratedFlexTreeNode | undefined = undefined;\n\n\tpublic constructor(\n\t\tpublic readonly context: FlexTreeContext,\n\t\tpublic readonly schema: FieldKindIdentifier,\n\t\tpublic readonly key: FieldKey,\n\t\t/**\n\t\t * The children of this field.\n\t\t * @remarks\n\t\t * This is either an array of {@link UnhydratedFlexTreeNode}s or a {@link ContextualFieldProvider} that will be used to populate the children lazily (after which it will become an array).\n\t\t * See {@link fillPendingDefaults}.\n\t\t * Note that any fields using a {@link ConstantFieldProvider} should be evaluated before constructing the UnhydratedFlexTreeField.\n\t\t */\n\t\tprivate lazyChildren: UnhydratedFlexTreeNode[] | ContextualFieldProvider,\n\t) {\n\t\t// When this field is created (which only happens one time, because it is cached), all the children become parented for the first time.\n\t\t// \"Adopt\" each child by updating its parent information to point to this field.\n\t\tif (Array.isArray(lazyChildren)) {\n\t\t\tfor (const [i, child] of lazyChildren.entries()) {\n\t\t\t\tchild.adoptBy(this, i);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic borrowCursor(): ITreeCursorSynchronous {\n\t\treturn cursorForMapTreeField<MapTreeNodeViewGeneric<UnhydratedFlexTreeNode>>(\n\t\t\tthis.children,\n\t\t);\n\t}\n\n\tprivate getPendingDefault(): ContextualFieldProvider | undefined {\n\t\treturn Array.isArray(this.lazyChildren) ? undefined : this.lazyChildren;\n\t}\n\n\t/**\n\t * Populate pending default (if present) using the provided context.\n\t * @remarks\n\t * This apply to just this field: caller will likely want to recursively walk the tree.\n\t * @see {@link pendingDefault}.\n\t */\n\tpublic fillPendingDefaults(context: FlexTreeHydratedContextMinimal): void {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(context);\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t}\n\n\t/**\n\t * Returns true if this field has a pending default due to defined defined using a {@link ContextualFieldProvider}.\n\t */\n\tpublic get pendingDefault(): boolean {\n\t\treturn this.getPendingDefault() !== undefined;\n\t}\n\n\tpublic get children(): UnhydratedFlexTreeNode[] {\n\t\tconst provider = this.getPendingDefault();\n\t\tif (provider) {\n\t\t\tconst content = provider(\"UseGlobalContext\");\n\t\t\tthis.lazyChildren = content;\n\t\t}\n\t\treturn this.lazyChildren as UnhydratedFlexTreeNode[];\n\t}\n\n\tpublic get length(): number {\n\t\treturn this.children.length;\n\t}\n\n\tpublic is<TKind2 extends FlexFieldKind>(kind: TKind2): this is FlexTreeTypedField<TKind2> {\n\t\treturn this.schema === kind.identifier;\n\t}\n\n\tpublic boxedAt(index: number): FlexTreeNode | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst m = this.children[i];\n\t\treturn m;\n\t}\n\n\tpublic [Symbol.iterator](): IterableIterator<UnhydratedFlexTreeNode> {\n\t\treturn this.children[Symbol.iterator]();\n\t}\n\n\t/**\n\t * Mutate this field.\n\t * @param edit - A function which receives the current `MapTree`s that comprise the contents of the field so that it may be mutated.\n\t * The function may mutate the array in place or return a new array.\n\t * If a new array is returned then it will be used as the new contents of the field, otherwise the original array will be continue to be used.\n\t * @remarks All edits to the field (i.e. mutations of the field's MapTrees) should be directed through this function.\n\t * This function ensures that the parent MapTree has no empty fields (which is an invariant of `MapTree`) after the mutation.\n\t */\n\tprotected edit(\n\t\tedit: (mapTrees: UnhydratedFlexTreeNode[]) => void | UnhydratedFlexTreeNode[],\n\t\t/**\n\t\t * Delta marks describing this edit, forwarded to {@link UnhydratedFlexTreeNode.emitChangedEvent}.\n\t\t * Sequence-field subclasses pass pre-computed marks so that array-node listeners receive a\n\t\t * meaningful delta; other field kinds omit this parameter.\n\t\t */\n\t\tmarks?: readonly DeltaMark[],\n\t): void {\n\t\t// Clear parents for all old map trees.\n\t\tfor (const tree of this.children) {\n\t\t\ttree.adoptBy(undefined);\n\t\t}\n\n\t\tthis.lazyChildren = edit(this.children) ?? this.children;\n\n\t\t// Set parents for all new map trees.\n\t\tfor (const [index, tree] of this.children.entries()) {\n\t\t\ttree.adoptBy(this, index);\n\t\t}\n\n\t\tthis.parent?.emitChangedEvent(this.key, marks);\n\t}\n\n\tpublic getFieldPath(): NormalizedFieldUpPath {\n\t\tthrow unsupportedUsageError(\"Editing an array\");\n\t}\n\n\t/** Unboxes leaf nodes to their values */\n\tprotected unboxed(index: number): TreeValue | UnhydratedFlexTreeNode {\n\t\tconst child = this.children[index] ?? oob();\n\t\tconst value = child.value;\n\t\tif (value !== undefined) {\n\t\t\treturn value;\n\t\t}\n\t\treturn child;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeOptionalField}.\n */\nexport class UnhydratedOptionalField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeOptionalField\n{\n\tpublic readonly editor = {\n\t\tset: (newContent: FlexibleNodeContent | undefined): void => {\n\t\t\tif (newContent !== undefined) {\n\t\t\t\tassert(\n\t\t\t\t\tnewContent instanceof UnhydratedFlexTreeNode,\n\t\t\t\t\t0xbb7 /* Expected unhydrated node */,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent === undefined) {\n\t\t\t\t\tmapTrees.length = 0;\n\t\t\t\t} else {\n\t\t\t\t\tmapTrees[0] = newContent;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t} satisfies OptionalFieldEditBuilder<FlexibleNodeContent> &\n\t\tValueFieldEditBuilder<FlexibleNodeContent>;\n\n\tpublic get content(): FlexTreeUnknownUnboxed | undefined {\n\t\tconst value = this.children[0];\n\t\tif (value !== undefined) {\n\t\t\treturn this.unboxed(0);\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n\nclass UnhydratedRequiredField\n\textends UnhydratedOptionalField\n\timplements FlexTreeRequiredField\n{\n\tpublic override get content(): FlexTreeUnknownUnboxed {\n\t\t// This cannot use ?? since null is a legal value here.\n\t\tassert(\n\t\t\tsuper.content !== undefined,\n\t\t\t0xa57 /* Expected EagerMapTree required field to have a value */,\n\t\t);\n\t\treturn super.content;\n\t}\n}\n\n/**\n * The {@link Unhydrated} implementation of {@link FlexTreeSequenceField}.\n */\nexport class UnhydratedSequenceField\n\textends UnhydratedFlexTreeField\n\timplements FlexTreeSequenceField\n{\n\tpublic readonly editor = {\n\t\tinsert: (index, newContent): void => {\n\t\t\tfor (const c of newContent) {\n\t\t\t\tassert(c !== undefined, 0xa0a /* Unexpected sparse array content */);\n\t\t\t\tassert(c instanceof UnhydratedFlexTreeNode, 0xbb8 /* Expected unhydrated node */);\n\t\t\t}\n\t\t\tconst newContentChecked = newContent as readonly UnhydratedFlexTreeNode[];\n\t\t\tconst insertCount = newContentChecked.length;\n\t\t\tconst marks: DeltaMark[] = [];\n\t\t\tif (index > 0) marks.push({ count: index });\n\t\t\tmarks.push({ count: insertCount, attach: syntheticDetachedNodeId });\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tif (newContent.length < 1000) {\n\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\tmapTrees.splice(index, 0, ...newContentChecked);\n\t\t\t\t} else {\n\t\t\t\t\t// ...but we avoid using `splice` + spread for very large input arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\treturn [...mapTrees.slice(0, index), ...newContentChecked, ...mapTrees.slice(index)];\n\t\t\t\t}\n\t\t\t}, marks);\n\t\t},\n\t\tremove: (index, count): UnhydratedFlexTreeNode[] => {\n\t\t\tfor (let i = index; i < index + count; i++) {\n\t\t\t\tconst c = this.children[i];\n\t\t\t\tassert(c !== undefined, 0xa0b /* Unexpected sparse array */);\n\t\t\t}\n\t\t\tconst marks: DeltaMark[] = [];\n\t\t\tif (index > 0) marks.push({ count: index });\n\t\t\tmarks.push({ count, detach: syntheticDetachedNodeId });\n\t\t\tlet removed: UnhydratedFlexTreeNode[] | undefined;\n\t\t\tthis.edit((mapTrees) => {\n\t\t\t\tremoved = mapTrees.splice(index, count);\n\t\t\t}, marks);\n\t\t\treturn removed ?? fail(0xb4a /* Expected removed to be set by edit */);\n\t\t},\n\t\tmove: (sourceIndex, count, destIndex, source?): void => {\n\t\t\tconst sourceField = source ?? this;\n\t\t\tif (sourceField === this) {\n\t\t\t\t// Within-field move: do both operations in a single edit to emit only one event\n\t\t\t\tconst marks = buildUnhydratedMoveMarks(sourceIndex, count, destIndex);\n\t\t\t\tthis.edit((mapTrees) => {\n\t\t\t\t\tconst removed = mapTrees.splice(sourceIndex, count);\n\t\t\t\t\t// Adjust destination index if it comes after the source\n\t\t\t\t\tconst adjustedDest = destIndex > sourceIndex ? destIndex - count : destIndex;\n\t\t\t\t\tif (removed.length < 1000) {\n\t\t\t\t\t\t// For \"smallish arrays\" (`1000` is not empirically derived), the `splice` function is appropriate...\n\t\t\t\t\t\tmapTrees.splice(adjustedDest, 0, ...removed);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// ...but we avoid using `splice` + spread for very large arrays since there is a limit on how many elements can be spread (too many will overflow the stack).\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t...mapTrees.slice(0, adjustedDest),\n\t\t\t\t\t\t\t...removed,\n\t\t\t\t\t\t\t...mapTrees.slice(adjustedDest),\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t}, marks);\n\t\t\t} else {\n\t\t\t\t// Cross-field move: remove from source, insert into destination\n\t\t\t\t// Each field emits one event (correct behavior for different fields)\n\t\t\t\tconst removed = sourceField.editor.remove(sourceIndex, count);\n\t\t\t\tthis.editor.insert(destIndex, removed);\n\t\t\t}\n\t\t},\n\t} satisfies UnhydratedTreeSequenceFieldEditBuilder;\n\n\tpublic at(index: number): FlexTreeUnknownUnboxed | undefined {\n\t\tconst i = indexForAt(index, this.length);\n\t\tif (i === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.unboxed(i);\n\t}\n\tpublic map<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[] {\n\t\treturn Array.from(this, callbackfn);\n\t}\n}\n\n// #endregion Fields\n\n/**\n * Builds {@link DeltaMark}s describing a within-field move for use in\n * {@link UnhydratedFlexTreeNode.emitChangedEvent}.\n *\n * @remarks\n * Forward move (`sourceIndex < destIndex`):\n * `[retain(src), detach(n), retain(mid), attach(n)]`\n *\n * Backward move (`destIndex < sourceIndex`):\n * `[retain(dst), attach(n), retain(mid), detach(n)]`\n *\n * A no-op move (`sourceIndex === destIndex`) returns an empty array; the event\n * should not fire in that case, but the empty marks are harmless if it does.\n */\nfunction buildUnhydratedMoveMarks(\n\tsourceIndex: number,\n\tcount: number,\n\tdestIndex: number,\n): readonly DeltaMark[] {\n\tconst marks: DeltaMark[] = [];\n\tif (sourceIndex < destIndex) {\n\t\tif (sourceIndex > 0) marks.push({ count: sourceIndex });\n\t\tmarks.push({ count, detach: syntheticDetachedNodeId });\n\t\tconst between = destIndex - sourceIndex - count;\n\t\tif (between > 0) marks.push({ count: between });\n\t\tmarks.push({ count, attach: syntheticDetachedNodeId });\n\t} else if (destIndex < sourceIndex) {\n\t\tif (destIndex > 0) marks.push({ count: destIndex });\n\t\tmarks.push({ count, attach: syntheticDetachedNodeId });\n\t\tconst between = sourceIndex - destIndex;\n\t\tif (between > 0) marks.push({ count: between });\n\t\tmarks.push({ count, detach: syntheticDetachedNodeId });\n\t}\n\treturn marks;\n}\n\n/** Creates a field with the given attributes */\nexport function createField(\n\t...args: ConstructorParameters<typeof UnhydratedFlexTreeField>\n): UnhydratedFlexTreeField {\n\tswitch (args[1]) {\n\t\tcase FieldKinds.required.identifier:\n\t\tcase FieldKinds.identifier.identifier: {\n\t\t\treturn new UnhydratedRequiredField(...args);\n\t\t}\n\t\tcase FieldKinds.optional.identifier: {\n\t\t\treturn new UnhydratedOptionalField(...args);\n\t\t}\n\t\tcase FieldKinds.sequence.identifier: {\n\t\t\treturn new UnhydratedSequenceField(...args);\n\t\t}\n\t\tcase FieldKinds.forbidden.identifier: {\n\t\t\t// TODO: this seems to used by unknown optional fields. They should probably use \"optional\" not \"Forbidden\" schema.\n\t\t\treturn new UnhydratedFlexTreeField(...args);\n\t\t}\n\t\tdefault: {\n\t\t\treturn fail(0xb9d /* unsupported field kind */);\n\t\t}\n\t}\n}\n\nexport function unsupportedUsageError(message?: string): Error {\n\treturn new UsageError(\n\t\t`${\n\t\t\tmessage ?? \"Operation\"\n\t\t} is not supported for content that has not yet been inserted into the tree`,\n\t);\n}\n"]}
@@ -6,7 +6,7 @@ import type { ErasedType } from "@fluidframework/core-interfaces";
6
6
  import type { FieldKey } from "../core/index.js";
7
7
  import type { FlexTreeHydratedContextMinimal } from "../feature-libraries/index.js";
8
8
  import { type MakeNominal, type UnionToIntersection, type JsonCompatibleReadOnlyObject } from "../util/index.js";
9
- import type { TreeNodeSchema, TreeNode, UnhydratedFlexTreeNode, ImplicitAllowedTypes, TreeNodeFromImplicitAllowedTypes, TreeLeafValue, InsertableTreeNodeFromImplicitAllowedTypes, AllowedTypesFull } from "./core/index.js";
9
+ import type { TreeNodeSchema, TreeNode, UnhydratedFlexTreeNode, ImplicitAllowedTypes, TreeNodeFromImplicitAllowedTypes, TreeLeafValue, InsertableTreeNodeFromImplicitAllowedTypes, AllowedTypesFull, SchemaUpgrade } from "./core/index.js";
10
10
  import type { SchemaType, SimpleAllowedTypeAttributes, SimpleFieldSchema } from "./simpleSchema.js";
11
11
  import type { InsertableContent } from "./unhydratedFlexTreeFromInsertable.js";
12
12
  import type { UnsafeUnknownSchema } from "./unsafeUnknownSchema.js";
@@ -143,6 +143,10 @@ export interface FieldPropsAlpha<TCustomMetadata = unknown> extends FieldProps<T
143
143
  * Sets {@link SimpleFieldSchema.persistedMetadata}.
144
144
  */
145
145
  readonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;
146
+ /**
147
+ * If defined, indicates that this field is a {@link SchemaStaticsAlpha.stagedOptional | staged optional} field.
148
+ */
149
+ readonly stagedOptionalUpgrade?: SchemaUpgrade;
146
150
  }
147
151
  /**
148
152
  * A {@link FieldProvider} which requires additional context in order to produce its content
@@ -292,6 +296,7 @@ export declare class FieldSchema<out Kind extends FieldKind = FieldKind, out Typ
292
296
  export declare class FieldSchemaAlpha<Kind extends FieldKind = FieldKind, Types extends ImplicitAllowedTypes = ImplicitAllowedTypes, TCustomMetadata = unknown, TProps extends FieldPropsAlpha<TCustomMetadata> | undefined = FieldPropsAlpha<TCustomMetadata> | undefined> extends FieldSchema<Kind, Types, TCustomMetadata> implements SimpleFieldSchema<SchemaType.View> {
293
297
  private readonly propsAlpha;
294
298
  get persistedMetadata(): JsonCompatibleReadOnlyObject | undefined;
299
+ get isStagedOptional(): false | SchemaUpgrade;
295
300
  /**
296
301
  * {@link normalizeAllowedTypes|Normalized} version of {@link FieldSchema.allowedTypes}.
297
302
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fieldSchema.d.ts","sourceRoot":"","sources":["../../src/simple-tree/fieldSchema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fieldSchema.d.ts","sourceRoot":"","sources":["../../src/simple-tree/fieldSchema.ts"],"names":[],"mappings":"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"}
@@ -155,6 +155,9 @@ class FieldSchemaAlpha extends FieldSchema {
155
155
  get persistedMetadata() {
156
156
  return this.propsAlpha?.persistedMetadata;
157
157
  }
158
+ get isStagedOptional() {
159
+ return this.propsAlpha?.stagedOptionalUpgrade ?? false;
160
+ }
158
161
  get allowedTypesIdentifiers() {
159
162
  return this.allowedTypesFull.evaluateIdentifiers();
160
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fieldSchema.js","sourceRoot":"","sources":["../../src/simple-tree/fieldSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ErasedType } from \"@fluidframework/core-interfaces\";\nimport { Lazy } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { FieldKey } from \"../core/index.js\";\nimport type { FlexTreeHydratedContextMinimal } from \"../feature-libraries/index.js\";\nimport {\n\ttype MakeNominal,\n\tbrand,\n\ttype UnionToIntersection,\n\tcompareSets,\n\ttype requireTrue,\n\ttype areOnlyKeys,\n\ttype JsonCompatibleReadOnlyObject,\n} from \"../util/index.js\";\n\nimport type {\n\tTreeNodeSchema,\n\tTreeNode,\n\tUnhydratedFlexTreeNode,\n\tImplicitAllowedTypes,\n\tTreeNodeFromImplicitAllowedTypes,\n\tTreeLeafValue,\n\tInsertableTreeNodeFromImplicitAllowedTypes,\n\tAllowedTypesFull,\n} from \"./core/index.js\";\nimport { AnnotatedAllowedTypesInternal, normalizeAllowedTypes } from \"./core/index.js\";\nimport type {\n\tSchemaType,\n\tSimpleAllowedTypeAttributes,\n\tSimpleFieldSchema,\n} from \"./simpleSchema.js\";\nimport type { InsertableContent } from \"./unhydratedFlexTreeFromInsertable.js\";\nimport type { UnsafeUnknownSchema } from \"./unsafeUnknownSchema.js\";\n\n/**\n * Kind of a field on an {@link TreeObjectNode}.\n * @remarks\n * More kinds may be added over time, so do not assume this is an exhaustive set.\n * See {@link FieldSchema} for where these are used, and {@link SchemaFactory} for how to create schema which use them.\n * @public\n */\nexport enum FieldKind {\n\t/**\n\t * A field which can be empty or filled.\n\t * @remarks\n\t * Allows 0 or one child.\n\t */\n\tOptional,\n\t/**\n\t * A field which must always be filled.\n\t * @remarks\n\t * Only allows exactly one child.\n\t */\n\tRequired,\n\t/**\n\t * A special readonly field used for node identifier strings.\n\t * @remarks\n\t * Only allows exactly one child.\n\t *\n\t * See {@link SchemaFactory.identifier} for more details.\n\t */\n\tIdentifier,\n}\n\n/**\n * Maps from a property key to its corresponding {@link FieldProps.key | stored key} for the provided\n * {@link ImplicitFieldSchema | field schema}.\n *\n * @remarks\n * If an explicit stored key was specified in the schema, it will be used.\n * Otherwise, the stored key is the same as the property key.\n */\nexport function getStoredKey(propertyKey: string, fieldSchema: ImplicitFieldSchema): FieldKey {\n\treturn brand(getExplicitStoredKey(fieldSchema) ?? propertyKey);\n}\n\n/**\n * Gets the {@link FieldProps.key | stored key} specified by the schema, if one was explicitly specified.\n * Otherwise, returns undefined.\n */\nexport function getExplicitStoredKey(fieldSchema: ImplicitFieldSchema): string | undefined {\n\treturn fieldSchema instanceof FieldSchema ? fieldSchema.props?.key : undefined;\n}\n\n/**\n * Additional information to provide to a {@link FieldSchema}.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @public\n */\nexport interface FieldProps<TCustomMetadata = unknown> {\n\t/**\n\t * The unique identifier of a field, used in the persisted form of the tree.\n\t *\n\t * @remarks\n\t * If not explicitly set via the schema, this is the same as the schema's property key.\n\t *\n\t * Specifying a stored key that differs from the property key is particularly useful in refactoring scenarios.\n\t * To update the developer-facing API, while maintaining backwards compatibility with existing SharedTree data,\n\t * you can change the property key and specify the previous property key as the stored key.\n\t *\n\t * Notes:\n\t *\n\t * - Stored keys have no impact on standard JavaScript behavior, on tree nodes. For example, `Object.keys`\n\t * will always return the property keys specified in the schema, ignoring any stored keys that differ from\n\t * the property keys.\n\t *\n\t * - When specifying stored keys in an object schema, you must ensure that the final set of stored keys\n\t * (accounting for those implicitly derived from property keys) contains no duplicates.\n\t * This is validated at runtime.\n\t *\n\t * @example Refactoring code without breaking compatibility with existing data\n\t *\n\t * Consider some existing object schema:\n\t *\n\t * ```TypeScript\n\t * class Point extends schemaFactory.object(\"Point\", {\n\t * \txPosition: schemaFactory.number,\n\t * \tyPosition: schemaFactory.number,\n\t * \tzPosition: schemaFactory.optional(schemaFactory.number),\n\t * });\n\t * ```\n\t *\n\t * Developers using nodes of this type would access the the `xPosition` property as `point.xPosition`.\n\t *\n\t * We would like to refactor the schema to omit \"Position\" from the property keys, but application data has\n\t * already been persisted using the original property keys. To maintain compatibility with existing data,\n\t * we can refactor the schema as follows:\n\t *\n\t * ```TypeScript\n\t * class Point extends schemaFactory.object(\"Point\", {\n\t * \tx: schemaFactory.required(schemaFactory.number, { key: \"xPosition\" }),\n\t * \ty: schemaFactory.required(schemaFactory.number, { key: \"yPosition\" }),\n\t * \tz: schemaFactory.optional(schemaFactory.number, { key: \"zPosition\" }),\n\t * });\n\t * ```\n\t *\n\t * Now, developers can access the `x` property as `point.x`, while existing data can still be collaborated on.\n\t *\n\t * @defaultValue If not specified, the key that is persisted is the property key that was specified in the schema.\n\t */\n\treadonly key?: string;\n\n\t/**\n\t * A default provider used for fields which were not provided any values.\n\t * @privateRemarks\n\t * We are using an erased type here, as we want to expose this API but `InsertableContent` and `NodeKeyManager` are not public.\n\t */\n\treadonly defaultProvider?: DefaultProvider;\n\n\t/**\n\t * Optional metadata to associate with the field.\n\t *\n\t * @remarks\n\t * Note: this metadata is not persisted nor made part of the collaborative state; it is strictly client-local.\n\t * Different clients in the same collaborative session may see different metadata for the same field.\n\t */\n\treadonly metadata?: FieldSchemaMetadata<TCustomMetadata>;\n}\n\n/**\n * {@link FieldProps} extended with additional `alpha` options.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @alpha @input\n */\nexport interface FieldPropsAlpha<TCustomMetadata = unknown>\n\textends FieldProps<TCustomMetadata> {\n\t/**\n\t * The persisted metadata for a field schema.\n\t * @remarks\n\t * Sets {@link SimpleFieldSchema.persistedMetadata}.\n\t */\n\treadonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;\n}\n\n/**\n * A {@link FieldProvider} which requires additional context in order to produce its content\n */\nexport type ContextualFieldProvider = (\n\tcontext: FlexTreeHydratedContextMinimal | \"UseGlobalContext\",\n) => UnhydratedFlexTreeNode[];\n/**\n * A {@link FieldProvider} which can produce its content in a vacuum.\n */\nexport type ConstantFieldProvider = () => UnhydratedFlexTreeNode[];\n/**\n * A function which produces content for a field every time that it is called.\n */\nexport type FieldProvider = ContextualFieldProvider | ConstantFieldProvider;\n/**\n * Returns true if the given {@link FieldProvider} is a {@link ConstantFieldProvider}\n */\nexport function isConstant(\n\tfieldProvider: FieldProvider,\n): fieldProvider is ConstantFieldProvider {\n\treturn fieldProvider.length === 0;\n}\n\n/**\n * Provides a default value for a field.\n * @remarks\n * If present in a `FieldSchema`, when constructing new tree content that field can be omitted, and a default will be provided.\n * @system @sealed @public\n */\nexport interface DefaultProvider extends ErasedType<\"@fluidframework/tree.FieldProvider\"> {}\n\nexport function extractFieldProvider(input: DefaultProvider): FieldProvider {\n\treturn input as unknown as FieldProvider;\n}\n\nexport function getDefaultProvider(input: FieldProvider): DefaultProvider {\n\treturn input as unknown as DefaultProvider;\n}\n\n/**\n * Metadata associated with a {@link FieldSchema}.\n *\n * @remarks Specified via {@link FieldProps.metadata}.\n *\n * @sealed\n * @public\n */\nexport interface FieldSchemaMetadata<TCustomMetadata = unknown> {\n\t/**\n\t * User-defined metadata.\n\t */\n\treadonly custom?: TCustomMetadata;\n\n\t/**\n\t * The description of the field.\n\t *\n\t * @remarks\n\t *\n\t * If provided, will be used by the system in scenarios where a description of the field is useful.\n\t * E.g., when converting a field schema to {@link https://json-schema.org/ | JSON Schema}, this description will be\n\t * used as the `description` field.\n\t */\n\treadonly description?: string | undefined;\n}\n\n/**\n * Metadata associated with a {@link FieldSchema}. Includes fields used by alpha features.\n *\n * @remarks Specified via {@link FieldProps.metadata}.\n *\n * @sealed\n * @alpha\n */\nexport interface FieldSchemaMetadataAlpha<TCustomMetadata = unknown>\n\textends FieldSchemaMetadata<TCustomMetadata> {\n\t/**\n\t * The persisted metadata for this schema element.\n\t */\n\treadonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;\n}\n\n/**\n * Package internal construction API.\n */\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n>(kind: Kind, annotatedTypes: Types): FieldSchemaAlpha<Kind, Types, TCustomMetadata>;\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n\tTProps extends FieldProps<TCustomMetadata> = FieldProps<TCustomMetadata>,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops: TProps,\n): FieldSchemaAlpha<Kind, Types, TCustomMetadata, TProps>;\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops?: FieldProps<TCustomMetadata>,\n): FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined> {\n\treturn createFieldSchemaPrivate(kind, annotatedTypes, props);\n}\n\n/**\n * Implementation for {@link createFieldSchema}\n */\nlet createFieldSchemaPrivate: <\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops?: FieldProps<TCustomMetadata>,\n) => FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined>;\n\n/**\n * All policy for a specific field,\n * including functionality that does not have to be kept consistent across versions or deterministic.\n *\n * This can include policy for how to use this schema for \"view\" purposes, and well as how to expose editing APIs.\n * Use {@link SchemaFactory} to create the FieldSchema instances, for example {@link SchemaStatics.optional}.\n * @privateRemarks\n * Public access to the constructor is removed to prevent creating expressible but unsupported (or not stable) configurations.\n * {@link createFieldSchema} can be used internally to create instances.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @remarks\n * All implementations of this are actually {@link FieldSchemaAlpha} which exposes some additional alpha APIs.\n *\n * @sealed @public\n */\nexport class FieldSchema<\n\tout Kind extends FieldKind = FieldKind,\n\tout Types extends ImplicitAllowedTypes = ImplicitAllowedTypes,\n\tout TCustomMetadata = unknown,\n> {\n\t/**\n\t * This class is used with instanceof, and therefore should have nominal typing.\n\t * This field enforces that.\n\t */\n\tprotected _typeCheck!: MakeNominal;\n\n\tprivate readonly lazyTypes: Lazy<ReadonlySet<TreeNodeSchema>>;\n\n\t/**\n\t * What types of tree nodes are allowed in this field.\n\t * @remarks Counterpart to {@link FieldSchema.allowedTypes}, with any lazy definitions evaluated.\n\t */\n\tpublic get allowedTypeSet(): ReadonlySet<TreeNodeSchema> {\n\t\treturn this.lazyTypes.value;\n\t}\n\n\t/**\n\t * True if and only if, when constructing a node with this field, a value must be provided for it.\n\t */\n\tpublic readonly requiresValue: boolean;\n\n\t/**\n\t * {@inheritDoc FieldProps.metadata}\n\t */\n\tpublic get metadata(): FieldSchemaMetadata<TCustomMetadata> {\n\t\treturn this.props?.metadata ?? {};\n\t}\n\n\t/**\n\t * This class is `@sealed`: protected members like this constructor are for internal use only.\n\t * Use {@link SchemaFactory} to create the FieldSchema instances.\n\t */\n\tprotected constructor(\n\t\t/**\n\t\t * The {@link https://en.wikipedia.org/wiki/Kind_(type_theory) | kind } of this field.\n\t\t * Determines the multiplicity, viewing and editing APIs as well as the merge resolution policy.\n\t\t */\n\t\tpublic readonly kind: Kind,\n\t\t/**\n\t\t * What types of tree nodes are allowed in this field.\n\t\t */\n\t\tpublic readonly allowedTypes: Types,\n\t\t/**\n\t\t * Optional properties associated with the field.\n\t\t */\n\t\tpublic readonly props?: FieldProps<TCustomMetadata>,\n\t) {\n\t\tif (!(this instanceof FieldSchemaAlpha)) {\n\t\t\tthrow new UsageError(\"FieldSchema is @sealed: sub-classing is not allowed.\");\n\t\t}\n\n\t\tthis.lazyTypes = new Lazy(() => normalizeAllowedTypes(this.allowedTypes).evaluateSet());\n\t\t// TODO: optional fields should (by default) get a default provider that returns undefined, removing the need to special case them here:\n\t\tthis.requiresValue =\n\t\t\tthis.props?.defaultProvider === undefined && this.kind !== FieldKind.Optional;\n\t}\n}\n\n/**\n * {@link FieldSchema} including alpha APIs (currently {@link SimpleFieldSchema}).\n * @remarks\n * This class will go away once the alpha APIs are stable and implemented by {@link FieldSchema}.\n * @sealed @alpha\n */\nexport class FieldSchemaAlpha<\n\t\tKind extends FieldKind = FieldKind,\n\t\tTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes,\n\t\tTCustomMetadata = unknown,\n\t\tTProps extends FieldPropsAlpha<TCustomMetadata> | undefined =\n\t\t\t| FieldPropsAlpha<TCustomMetadata>\n\t\t\t| undefined,\n\t>\n\textends FieldSchema<Kind, Types, TCustomMetadata>\n\timplements SimpleFieldSchema<SchemaType.View>\n{\n\tprivate readonly propsAlpha: TProps;\n\n\tpublic get persistedMetadata(): JsonCompatibleReadOnlyObject | undefined {\n\t\treturn this.propsAlpha?.persistedMetadata;\n\t}\n\n\tstatic {\n\t\tcreateFieldSchemaPrivate = <\n\t\t\tKind2 extends FieldKind,\n\t\t\tTypes2 extends ImplicitAllowedTypes,\n\t\t\tTCustomMetadata2,\n\t\t>(\n\t\t\tkind: Kind2,\n\t\t\tannotatedAllowedTypes: Types2,\n\t\t\tprops?: FieldPropsAlpha<TCustomMetadata2>,\n\t\t) =>\n\t\t\t// TCustomMetadata2 requires type assertion due to limitations with dependent type parameters\n\t\t\tnew FieldSchemaAlpha(kind, annotatedAllowedTypes, props) as unknown as FieldSchemaAlpha<\n\t\t\t\tKind2,\n\t\t\t\tTypes2,\n\t\t\t\tTCustomMetadata2\n\t\t\t>;\n\t}\n\n\t/**\n\t * {@link normalizeAllowedTypes|Normalized} version of {@link FieldSchema.allowedTypes}.\n\t */\n\tpublic readonly allowedTypesFull: AllowedTypesFull;\n\n\tpublic get allowedTypesIdentifiers(): ReadonlySet<string> {\n\t\treturn this.allowedTypesFull.evaluateIdentifiers();\n\t}\n\n\tpublic get simpleAllowedTypes(): ReadonlyMap<\n\t\tstring,\n\t\tSimpleAllowedTypeAttributes<SchemaType.View>\n\t> {\n\t\treturn AnnotatedAllowedTypesInternal.evaluateSimpleAllowedTypes(this.allowedTypesFull);\n\t}\n\n\tprotected constructor(\n\t\tkind: Kind,\n\t\ttypes: Types,\n\n\t\tprops?: FieldPropsAlpha<TCustomMetadata>,\n\t) {\n\t\tsuper(kind, types, props);\n\n\t\tconst normalizedTypes = normalizeAllowedTypes(types);\n\t\tthis.allowedTypesFull = normalizedTypes;\n\t\tthis.propsAlpha = props as TProps;\n\t}\n}\n\n/**\n * Normalizes a {@link ImplicitFieldSchema} or {@link ImplicitFieldSchema} to a {@link FieldSchema}.\n * @internal\n */\nexport function normalizeFieldSchema(\n\tschema: ImplicitFieldSchema | ImplicitFieldSchema,\n): FieldSchemaAlpha {\n\treturn schema instanceof FieldSchema\n\t\t? (schema as FieldSchemaAlpha)\n\t\t: createFieldSchema(FieldKind.Required, schema);\n}\n\n/**\n * Returns true if the given {@link ImplicitFieldSchema} are equivalent, otherwise false.\n * @remarks Two ImplicitFieldSchema are considered equivalent if all of the following are true:\n * 1. They have the same {@link FieldKind | kinds}.\n * 2. They have {@link areFieldPropsEqual | equivalent FieldProps}.\n * 3. They have the same exact set of allowed types. The allowed types must be (respectively) reference equal.\n *\n * For example, comparing an ImplicitFieldSchema that is a {@link TreeNodeSchema} to an ImplicitFieldSchema that is a {@link FieldSchema}\n * will return true if they are the same kind, the FieldSchema has exactly one allowed type (the TreeNodeSchema), and they have equivalent FieldProps.\n */\nexport function areImplicitFieldSchemaEqual(\n\ta: ImplicitFieldSchema,\n\tb: ImplicitFieldSchema,\n): boolean {\n\treturn areFieldSchemaEqual(normalizeFieldSchema(a), normalizeFieldSchema(b));\n}\n\n/**\n * Returns true if the given {@link FieldSchema} are equivalent, otherwise false.\n * @remarks Two FieldSchema are considered equivalent if all of the following are true:\n * 1. They have the same {@link FieldKind | kinds}.\n * 2. They have {@link areFieldPropsEqual | equivalent FieldProps}.\n * 3. They have the same exact set of allowed types. The allowed types must be reference equal.\n */\nexport function areFieldSchemaEqual(a: FieldSchema, b: FieldSchema): boolean {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.kind !== b.kind) {\n\t\treturn false;\n\t}\n\n\tif (!areFieldPropsEqual(a.props, b.props)) {\n\t\treturn false;\n\t}\n\n\treturn compareSets({ a: a.allowedTypeSet, b: b.allowedTypeSet });\n}\n\n/**\n * Returns true if the given {@link FieldProps} are equivalent, otherwise false.\n * @remarks FieldProps are considered equivalent if their keys and default providers are reference equal, and their metadata are {@link areMetadataEqual | equivalent}.\n */\nfunction areFieldPropsEqual(a: FieldProps | undefined, b: FieldProps | undefined): boolean {\n\t// If any new fields are added to FieldProps, this check will stop compiling as a reminder that this function needs to be updated.\n\ttype _keys = requireTrue<areOnlyKeys<FieldProps, \"key\" | \"defaultProvider\" | \"metadata\">>;\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a?.key !== b?.key || a?.defaultProvider !== b?.defaultProvider) {\n\t\treturn false;\n\t}\n\n\tif (!areMetadataEqual(a?.metadata, b?.metadata)) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Returns true if the given {@link FieldSchemaMetadata} are equivalent, otherwise false.\n * @remarks FieldSchemaMetadata are considered equivalent if their custom data and descriptions are (respectively) reference equal.\n */\nfunction areMetadataEqual(\n\ta: FieldSchemaMetadataAlpha | undefined,\n\tb: FieldSchemaMetadataAlpha | undefined,\n): boolean {\n\t// If any new fields are added to FieldSchemaMetadata, this check will stop compiling as a reminder that this function needs to be updated.\n\ttype _keys = requireTrue<\n\t\tareOnlyKeys<FieldSchemaMetadataAlpha, \"custom\" | \"description\" | \"persistedMetadata\">\n\t>;\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tObject.is(a?.custom, b?.custom) &&\n\t\ta?.description === b?.description &&\n\t\tarePersistedMetadataEqual(a?.persistedMetadata, b?.persistedMetadata)\n\t);\n}\n\n/**\n * Returns true if the given persisted metadata fields are equivalent, otherwise false.\n * @remarks\n * Currently only handles shallow equality in the case where the keys are in the same order. This is acceptable for current use cases.\n */\nfunction arePersistedMetadataEqual(\n\ta: JsonCompatibleReadOnlyObject | undefined,\n\tb: JsonCompatibleReadOnlyObject | undefined,\n): boolean {\n\tif (Object.is(a, b)) {\n\t\treturn true;\n\t}\n\n\tif (a === undefined || b === undefined) {\n\t\treturn false;\n\t}\n\n\t// Note that the key order matters. If `a` and `b` have the same content but the keys are in a different order,\n\t// this method will return false.\n\tconst aStringified = JSON.stringify(a);\n\tconst bStringified = JSON.stringify(b);\n\n\treturn aStringified === bStringified;\n}\n\n/**\n * Schema for a field of a tree node.\n * @remarks\n * Implicitly treats {@link ImplicitAllowedTypes} as a Required field of that type.\n * @public\n */\nexport type ImplicitFieldSchema = FieldSchema | ImplicitAllowedTypes;\n\n/**\n * Converts an `ImplicitFieldSchema` to a property type suitable for reading a field with this that schema.\n *\n * @typeparam TSchema - When non-exact schema are provided this errors on the side of returning too general of a type (a conservative union of all possibilities).\n * This is ideal for \"output APIs\" - i.e. it converts the schema type to the runtime type that a user will _read_ from the tree.\n * Examples of such \"non-exact\" schema include `ImplicitFieldSchema`, `ImplicitAllowedTypes`, and TypeScript unions of schema types.\n * @public\n */\nexport type TreeFieldFromImplicitField<TSchema extends ImplicitFieldSchema = FieldSchema> =\n\tTSchema extends FieldSchema<infer Kind, infer Types>\n\t\t? ApplyKind<TreeNodeFromImplicitAllowedTypes<Types>, Kind>\n\t\t: TSchema extends ImplicitAllowedTypes\n\t\t\t? TreeNodeFromImplicitAllowedTypes<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined;\n\n/**\n * Type of content that can be inserted into the tree for a field of the given schema.\n *\n * @see {@link Input}\n *\n * @typeparam TSchemaInput - Schema to process.\n * @typeparam TSchema - Do not specify: default value used as implementation detail.\n * @public\n */\nexport type InsertableTreeFieldFromImplicitField<\n\tTSchemaInput extends ImplicitFieldSchema,\n\tTSchema = UnionToIntersection<TSchemaInput>,\n> = [TSchema] extends [FieldSchema<infer Kind, infer Types>]\n\t? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true>\n\t: [TSchema] extends [ImplicitAllowedTypes]\n\t\t? InsertableTreeNodeFromImplicitAllowedTypes<TSchema>\n\t\t: never;\n\n/**\n * Content which could be inserted into a field within a tree.\n *\n * @see {@link Input}\n * @remarks\n * Extended version of {@link InsertableTreeFieldFromImplicitField} that also allows {@link (UnsafeUnknownSchema:type)}.\n * @alpha\n */\nexport type InsertableField<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> = [\n\tTSchema,\n] extends [ImplicitFieldSchema]\n\t? InsertableTreeFieldFromImplicitField<TSchema>\n\t: [TSchema] extends [UnsafeUnknownSchema]\n\t\t? InsertableContent | undefined\n\t\t: never;\n\n/**\n * Content which could be read from a field within a tree.\n *\n * @remarks\n * Extended version of {@link TreeFieldFromImplicitField} that also allows {@link (UnsafeUnknownSchema:type)}.\n * Since reading from fields with non-exact schema is still safe, this is only useful (compared to {@link TreeFieldFromImplicitField}) when the schema is also used as input and thus allows {@link (UnsafeUnknownSchema:type)}\n * for use\n * @system @alpha\n */\nexport type ReadableField<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> =\n\tTreeFieldFromImplicitField<ReadSchema<TSchema>>;\n\n/**\n * Adapter to remove {@link (UnsafeUnknownSchema:type)} from a schema type so it can be used with types for generating APIs for reading data.\n *\n * @remarks\n * Since reading with non-exact schema is still safe, this is mainly useful when the schema is also used as input and thus allows {@link (UnsafeUnknownSchema:type)}.\n * @system @alpha\n */\nexport type ReadSchema<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> = [\n\tTSchema,\n] extends [ImplicitFieldSchema]\n\t? TSchema\n\t: ImplicitFieldSchema;\n\n/**\n * Suitable for output.\n * For input must error on side of excluding undefined instead.\n * @system @public\n */\nexport type ApplyKind<T, Kind extends FieldKind> = {\n\t[FieldKind.Required]: T;\n\t[FieldKind.Optional]: T | undefined;\n\t[FieldKind.Identifier]: T;\n}[Kind];\n\n/**\n * Suitable for input.\n *\n * @see {@link Input}\n * @system @public\n */\nexport type ApplyKindInput<T, Kind extends FieldKind, DefaultsAreOptional extends boolean> = [\n\tKind,\n] extends [FieldKind.Required]\n\t? T\n\t: [Kind] extends [FieldKind.Optional]\n\t\t? T | undefined\n\t\t: [Kind] extends [FieldKind.Identifier]\n\t\t\t? DefaultsAreOptional extends true\n\t\t\t\t? T | undefined\n\t\t\t\t: T\n\t\t\t: never;\n"]}
1
+ {"version":3,"file":"fieldSchema.js","sourceRoot":"","sources":["../../src/simple-tree/fieldSchema.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport type { ErasedType } from \"@fluidframework/core-interfaces\";\nimport { Lazy } from \"@fluidframework/core-utils/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\n\nimport type { FieldKey } from \"../core/index.js\";\nimport type { FlexTreeHydratedContextMinimal } from \"../feature-libraries/index.js\";\nimport {\n\ttype MakeNominal,\n\tbrand,\n\ttype UnionToIntersection,\n\tcompareSets,\n\ttype requireTrue,\n\ttype areOnlyKeys,\n\ttype JsonCompatibleReadOnlyObject,\n} from \"../util/index.js\";\n\nimport type {\n\tTreeNodeSchema,\n\tTreeNode,\n\tUnhydratedFlexTreeNode,\n\tImplicitAllowedTypes,\n\tTreeNodeFromImplicitAllowedTypes,\n\tTreeLeafValue,\n\tInsertableTreeNodeFromImplicitAllowedTypes,\n\tAllowedTypesFull,\n\tSchemaUpgrade,\n} from \"./core/index.js\";\nimport { AnnotatedAllowedTypesInternal, normalizeAllowedTypes } from \"./core/index.js\";\nimport type {\n\tSchemaType,\n\tSimpleAllowedTypeAttributes,\n\tSimpleFieldSchema,\n} from \"./simpleSchema.js\";\nimport type { InsertableContent } from \"./unhydratedFlexTreeFromInsertable.js\";\nimport type { UnsafeUnknownSchema } from \"./unsafeUnknownSchema.js\";\n\n/**\n * Kind of a field on an {@link TreeObjectNode}.\n * @remarks\n * More kinds may be added over time, so do not assume this is an exhaustive set.\n * See {@link FieldSchema} for where these are used, and {@link SchemaFactory} for how to create schema which use them.\n * @public\n */\nexport enum FieldKind {\n\t/**\n\t * A field which can be empty or filled.\n\t * @remarks\n\t * Allows 0 or one child.\n\t */\n\tOptional,\n\t/**\n\t * A field which must always be filled.\n\t * @remarks\n\t * Only allows exactly one child.\n\t */\n\tRequired,\n\t/**\n\t * A special readonly field used for node identifier strings.\n\t * @remarks\n\t * Only allows exactly one child.\n\t *\n\t * See {@link SchemaFactory.identifier} for more details.\n\t */\n\tIdentifier,\n}\n\n/**\n * Maps from a property key to its corresponding {@link FieldProps.key | stored key} for the provided\n * {@link ImplicitFieldSchema | field schema}.\n *\n * @remarks\n * If an explicit stored key was specified in the schema, it will be used.\n * Otherwise, the stored key is the same as the property key.\n */\nexport function getStoredKey(propertyKey: string, fieldSchema: ImplicitFieldSchema): FieldKey {\n\treturn brand(getExplicitStoredKey(fieldSchema) ?? propertyKey);\n}\n\n/**\n * Gets the {@link FieldProps.key | stored key} specified by the schema, if one was explicitly specified.\n * Otherwise, returns undefined.\n */\nexport function getExplicitStoredKey(fieldSchema: ImplicitFieldSchema): string | undefined {\n\treturn fieldSchema instanceof FieldSchema ? fieldSchema.props?.key : undefined;\n}\n\n/**\n * Additional information to provide to a {@link FieldSchema}.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @public\n */\nexport interface FieldProps<TCustomMetadata = unknown> {\n\t/**\n\t * The unique identifier of a field, used in the persisted form of the tree.\n\t *\n\t * @remarks\n\t * If not explicitly set via the schema, this is the same as the schema's property key.\n\t *\n\t * Specifying a stored key that differs from the property key is particularly useful in refactoring scenarios.\n\t * To update the developer-facing API, while maintaining backwards compatibility with existing SharedTree data,\n\t * you can change the property key and specify the previous property key as the stored key.\n\t *\n\t * Notes:\n\t *\n\t * - Stored keys have no impact on standard JavaScript behavior, on tree nodes. For example, `Object.keys`\n\t * will always return the property keys specified in the schema, ignoring any stored keys that differ from\n\t * the property keys.\n\t *\n\t * - When specifying stored keys in an object schema, you must ensure that the final set of stored keys\n\t * (accounting for those implicitly derived from property keys) contains no duplicates.\n\t * This is validated at runtime.\n\t *\n\t * @example Refactoring code without breaking compatibility with existing data\n\t *\n\t * Consider some existing object schema:\n\t *\n\t * ```TypeScript\n\t * class Point extends schemaFactory.object(\"Point\", {\n\t * \txPosition: schemaFactory.number,\n\t * \tyPosition: schemaFactory.number,\n\t * \tzPosition: schemaFactory.optional(schemaFactory.number),\n\t * });\n\t * ```\n\t *\n\t * Developers using nodes of this type would access the the `xPosition` property as `point.xPosition`.\n\t *\n\t * We would like to refactor the schema to omit \"Position\" from the property keys, but application data has\n\t * already been persisted using the original property keys. To maintain compatibility with existing data,\n\t * we can refactor the schema as follows:\n\t *\n\t * ```TypeScript\n\t * class Point extends schemaFactory.object(\"Point\", {\n\t * \tx: schemaFactory.required(schemaFactory.number, { key: \"xPosition\" }),\n\t * \ty: schemaFactory.required(schemaFactory.number, { key: \"yPosition\" }),\n\t * \tz: schemaFactory.optional(schemaFactory.number, { key: \"zPosition\" }),\n\t * });\n\t * ```\n\t *\n\t * Now, developers can access the `x` property as `point.x`, while existing data can still be collaborated on.\n\t *\n\t * @defaultValue If not specified, the key that is persisted is the property key that was specified in the schema.\n\t */\n\treadonly key?: string;\n\n\t/**\n\t * A default provider used for fields which were not provided any values.\n\t * @privateRemarks\n\t * We are using an erased type here, as we want to expose this API but `InsertableContent` and `NodeKeyManager` are not public.\n\t */\n\treadonly defaultProvider?: DefaultProvider;\n\n\t/**\n\t * Optional metadata to associate with the field.\n\t *\n\t * @remarks\n\t * Note: this metadata is not persisted nor made part of the collaborative state; it is strictly client-local.\n\t * Different clients in the same collaborative session may see different metadata for the same field.\n\t */\n\treadonly metadata?: FieldSchemaMetadata<TCustomMetadata>;\n}\n\n/**\n * {@link FieldProps} extended with additional `alpha` options.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @alpha @input\n */\nexport interface FieldPropsAlpha<TCustomMetadata = unknown>\n\textends FieldProps<TCustomMetadata> {\n\t/**\n\t * The persisted metadata for a field schema.\n\t * @remarks\n\t * Sets {@link SimpleFieldSchema.persistedMetadata}.\n\t */\n\treadonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;\n\n\t/**\n\t * If defined, indicates that this field is a {@link SchemaStaticsAlpha.stagedOptional | staged optional} field.\n\t */\n\treadonly stagedOptionalUpgrade?: SchemaUpgrade;\n}\n\n/**\n * A {@link FieldProvider} which requires additional context in order to produce its content\n */\nexport type ContextualFieldProvider = (\n\tcontext: FlexTreeHydratedContextMinimal | \"UseGlobalContext\",\n) => UnhydratedFlexTreeNode[];\n/**\n * A {@link FieldProvider} which can produce its content in a vacuum.\n */\nexport type ConstantFieldProvider = () => UnhydratedFlexTreeNode[];\n/**\n * A function which produces content for a field every time that it is called.\n */\nexport type FieldProvider = ContextualFieldProvider | ConstantFieldProvider;\n/**\n * Returns true if the given {@link FieldProvider} is a {@link ConstantFieldProvider}\n */\nexport function isConstant(\n\tfieldProvider: FieldProvider,\n): fieldProvider is ConstantFieldProvider {\n\treturn fieldProvider.length === 0;\n}\n\n/**\n * Provides a default value for a field.\n * @remarks\n * If present in a `FieldSchema`, when constructing new tree content that field can be omitted, and a default will be provided.\n * @system @sealed @public\n */\nexport interface DefaultProvider extends ErasedType<\"@fluidframework/tree.FieldProvider\"> {}\n\nexport function extractFieldProvider(input: DefaultProvider): FieldProvider {\n\treturn input as unknown as FieldProvider;\n}\n\nexport function getDefaultProvider(input: FieldProvider): DefaultProvider {\n\treturn input as unknown as DefaultProvider;\n}\n\n/**\n * Metadata associated with a {@link FieldSchema}.\n *\n * @remarks Specified via {@link FieldProps.metadata}.\n *\n * @sealed\n * @public\n */\nexport interface FieldSchemaMetadata<TCustomMetadata = unknown> {\n\t/**\n\t * User-defined metadata.\n\t */\n\treadonly custom?: TCustomMetadata;\n\n\t/**\n\t * The description of the field.\n\t *\n\t * @remarks\n\t *\n\t * If provided, will be used by the system in scenarios where a description of the field is useful.\n\t * E.g., when converting a field schema to {@link https://json-schema.org/ | JSON Schema}, this description will be\n\t * used as the `description` field.\n\t */\n\treadonly description?: string | undefined;\n}\n\n/**\n * Metadata associated with a {@link FieldSchema}. Includes fields used by alpha features.\n *\n * @remarks Specified via {@link FieldProps.metadata}.\n *\n * @sealed\n * @alpha\n */\nexport interface FieldSchemaMetadataAlpha<TCustomMetadata = unknown>\n\textends FieldSchemaMetadata<TCustomMetadata> {\n\t/**\n\t * The persisted metadata for this schema element.\n\t */\n\treadonly persistedMetadata?: JsonCompatibleReadOnlyObject | undefined;\n}\n\n/**\n * Package internal construction API.\n */\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n>(kind: Kind, annotatedTypes: Types): FieldSchemaAlpha<Kind, Types, TCustomMetadata>;\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n\tTProps extends FieldProps<TCustomMetadata> = FieldProps<TCustomMetadata>,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops: TProps,\n): FieldSchemaAlpha<Kind, Types, TCustomMetadata, TProps>;\nexport function createFieldSchema<\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata = unknown,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops?: FieldProps<TCustomMetadata>,\n): FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined> {\n\treturn createFieldSchemaPrivate(kind, annotatedTypes, props);\n}\n\n/**\n * Implementation for {@link createFieldSchema}\n */\nlet createFieldSchemaPrivate: <\n\tKind extends FieldKind,\n\tTypes extends ImplicitAllowedTypes,\n\tTCustomMetadata,\n>(\n\tkind: Kind,\n\tannotatedTypes: Types,\n\tprops?: FieldProps<TCustomMetadata>,\n) => FieldSchemaAlpha<Kind, Types, TCustomMetadata, FieldProps<TCustomMetadata> | undefined>;\n\n/**\n * All policy for a specific field,\n * including functionality that does not have to be kept consistent across versions or deterministic.\n *\n * This can include policy for how to use this schema for \"view\" purposes, and well as how to expose editing APIs.\n * Use {@link SchemaFactory} to create the FieldSchema instances, for example {@link SchemaStatics.optional}.\n * @privateRemarks\n * Public access to the constructor is removed to prevent creating expressible but unsupported (or not stable) configurations.\n * {@link createFieldSchema} can be used internally to create instances.\n *\n * @typeParam TCustomMetadata - Custom metadata properties to associate with the field.\n * See {@link FieldSchemaMetadata.custom}.\n *\n * @remarks\n * All implementations of this are actually {@link FieldSchemaAlpha} which exposes some additional alpha APIs.\n *\n * @sealed @public\n */\nexport class FieldSchema<\n\tout Kind extends FieldKind = FieldKind,\n\tout Types extends ImplicitAllowedTypes = ImplicitAllowedTypes,\n\tout TCustomMetadata = unknown,\n> {\n\t/**\n\t * This class is used with instanceof, and therefore should have nominal typing.\n\t * This field enforces that.\n\t */\n\tprotected _typeCheck!: MakeNominal;\n\n\tprivate readonly lazyTypes: Lazy<ReadonlySet<TreeNodeSchema>>;\n\n\t/**\n\t * What types of tree nodes are allowed in this field.\n\t * @remarks Counterpart to {@link FieldSchema.allowedTypes}, with any lazy definitions evaluated.\n\t */\n\tpublic get allowedTypeSet(): ReadonlySet<TreeNodeSchema> {\n\t\treturn this.lazyTypes.value;\n\t}\n\n\t/**\n\t * True if and only if, when constructing a node with this field, a value must be provided for it.\n\t */\n\tpublic readonly requiresValue: boolean;\n\n\t/**\n\t * {@inheritDoc FieldProps.metadata}\n\t */\n\tpublic get metadata(): FieldSchemaMetadata<TCustomMetadata> {\n\t\treturn this.props?.metadata ?? {};\n\t}\n\n\t/**\n\t * This class is `@sealed`: protected members like this constructor are for internal use only.\n\t * Use {@link SchemaFactory} to create the FieldSchema instances.\n\t */\n\tprotected constructor(\n\t\t/**\n\t\t * The {@link https://en.wikipedia.org/wiki/Kind_(type_theory) | kind } of this field.\n\t\t * Determines the multiplicity, viewing and editing APIs as well as the merge resolution policy.\n\t\t */\n\t\tpublic readonly kind: Kind,\n\t\t/**\n\t\t * What types of tree nodes are allowed in this field.\n\t\t */\n\t\tpublic readonly allowedTypes: Types,\n\t\t/**\n\t\t * Optional properties associated with the field.\n\t\t */\n\t\tpublic readonly props?: FieldProps<TCustomMetadata>,\n\t) {\n\t\tif (!(this instanceof FieldSchemaAlpha)) {\n\t\t\tthrow new UsageError(\"FieldSchema is @sealed: sub-classing is not allowed.\");\n\t\t}\n\n\t\tthis.lazyTypes = new Lazy(() => normalizeAllowedTypes(this.allowedTypes).evaluateSet());\n\t\t// TODO: optional fields should (by default) get a default provider that returns undefined, removing the need to special case them here:\n\t\tthis.requiresValue =\n\t\t\tthis.props?.defaultProvider === undefined && this.kind !== FieldKind.Optional;\n\t}\n}\n\n/**\n * {@link FieldSchema} including alpha APIs (currently {@link SimpleFieldSchema}).\n * @remarks\n * This class will go away once the alpha APIs are stable and implemented by {@link FieldSchema}.\n * @sealed @alpha\n */\nexport class FieldSchemaAlpha<\n\t\tKind extends FieldKind = FieldKind,\n\t\tTypes extends ImplicitAllowedTypes = ImplicitAllowedTypes,\n\t\tTCustomMetadata = unknown,\n\t\tTProps extends FieldPropsAlpha<TCustomMetadata> | undefined =\n\t\t\t| FieldPropsAlpha<TCustomMetadata>\n\t\t\t| undefined,\n\t>\n\textends FieldSchema<Kind, Types, TCustomMetadata>\n\timplements SimpleFieldSchema<SchemaType.View>\n{\n\tprivate readonly propsAlpha: TProps;\n\n\tpublic get persistedMetadata(): JsonCompatibleReadOnlyObject | undefined {\n\t\treturn this.propsAlpha?.persistedMetadata;\n\t}\n\n\tpublic get isStagedOptional(): false | SchemaUpgrade {\n\t\treturn this.propsAlpha?.stagedOptionalUpgrade ?? false;\n\t}\n\n\tstatic {\n\t\tcreateFieldSchemaPrivate = <\n\t\t\tKind2 extends FieldKind,\n\t\t\tTypes2 extends ImplicitAllowedTypes,\n\t\t\tTCustomMetadata2,\n\t\t>(\n\t\t\tkind: Kind2,\n\t\t\tannotatedAllowedTypes: Types2,\n\t\t\tprops?: FieldPropsAlpha<TCustomMetadata2>,\n\t\t) =>\n\t\t\t// TCustomMetadata2 requires type assertion due to limitations with dependent type parameters\n\t\t\tnew FieldSchemaAlpha(kind, annotatedAllowedTypes, props) as unknown as FieldSchemaAlpha<\n\t\t\t\tKind2,\n\t\t\t\tTypes2,\n\t\t\t\tTCustomMetadata2\n\t\t\t>;\n\t}\n\n\t/**\n\t * {@link normalizeAllowedTypes|Normalized} version of {@link FieldSchema.allowedTypes}.\n\t */\n\tpublic readonly allowedTypesFull: AllowedTypesFull;\n\n\tpublic get allowedTypesIdentifiers(): ReadonlySet<string> {\n\t\treturn this.allowedTypesFull.evaluateIdentifiers();\n\t}\n\n\tpublic get simpleAllowedTypes(): ReadonlyMap<\n\t\tstring,\n\t\tSimpleAllowedTypeAttributes<SchemaType.View>\n\t> {\n\t\treturn AnnotatedAllowedTypesInternal.evaluateSimpleAllowedTypes(this.allowedTypesFull);\n\t}\n\n\tprotected constructor(\n\t\tkind: Kind,\n\t\ttypes: Types,\n\n\t\tprops?: FieldPropsAlpha<TCustomMetadata>,\n\t) {\n\t\tsuper(kind, types, props);\n\n\t\tconst normalizedTypes = normalizeAllowedTypes(types);\n\t\tthis.allowedTypesFull = normalizedTypes;\n\t\tthis.propsAlpha = props as TProps;\n\t}\n}\n\n/**\n * Normalizes a {@link ImplicitFieldSchema} or {@link ImplicitFieldSchema} to a {@link FieldSchema}.\n * @internal\n */\nexport function normalizeFieldSchema(\n\tschema: ImplicitFieldSchema | ImplicitFieldSchema,\n): FieldSchemaAlpha {\n\treturn schema instanceof FieldSchema\n\t\t? (schema as FieldSchemaAlpha)\n\t\t: createFieldSchema(FieldKind.Required, schema);\n}\n\n/**\n * Returns true if the given {@link ImplicitFieldSchema} are equivalent, otherwise false.\n * @remarks Two ImplicitFieldSchema are considered equivalent if all of the following are true:\n * 1. They have the same {@link FieldKind | kinds}.\n * 2. They have {@link areFieldPropsEqual | equivalent FieldProps}.\n * 3. They have the same exact set of allowed types. The allowed types must be (respectively) reference equal.\n *\n * For example, comparing an ImplicitFieldSchema that is a {@link TreeNodeSchema} to an ImplicitFieldSchema that is a {@link FieldSchema}\n * will return true if they are the same kind, the FieldSchema has exactly one allowed type (the TreeNodeSchema), and they have equivalent FieldProps.\n */\nexport function areImplicitFieldSchemaEqual(\n\ta: ImplicitFieldSchema,\n\tb: ImplicitFieldSchema,\n): boolean {\n\treturn areFieldSchemaEqual(normalizeFieldSchema(a), normalizeFieldSchema(b));\n}\n\n/**\n * Returns true if the given {@link FieldSchema} are equivalent, otherwise false.\n * @remarks Two FieldSchema are considered equivalent if all of the following are true:\n * 1. They have the same {@link FieldKind | kinds}.\n * 2. They have {@link areFieldPropsEqual | equivalent FieldProps}.\n * 3. They have the same exact set of allowed types. The allowed types must be reference equal.\n */\nexport function areFieldSchemaEqual(a: FieldSchema, b: FieldSchema): boolean {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.kind !== b.kind) {\n\t\treturn false;\n\t}\n\n\tif (!areFieldPropsEqual(a.props, b.props)) {\n\t\treturn false;\n\t}\n\n\treturn compareSets({ a: a.allowedTypeSet, b: b.allowedTypeSet });\n}\n\n/**\n * Returns true if the given {@link FieldProps} are equivalent, otherwise false.\n * @remarks FieldProps are considered equivalent if their keys and default providers are reference equal, and their metadata are {@link areMetadataEqual | equivalent}.\n */\nfunction areFieldPropsEqual(a: FieldProps | undefined, b: FieldProps | undefined): boolean {\n\t// If any new fields are added to FieldProps, this check will stop compiling as a reminder that this function needs to be updated.\n\ttype _keys = requireTrue<areOnlyKeys<FieldProps, \"key\" | \"defaultProvider\" | \"metadata\">>;\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a?.key !== b?.key || a?.defaultProvider !== b?.defaultProvider) {\n\t\treturn false;\n\t}\n\n\tif (!areMetadataEqual(a?.metadata, b?.metadata)) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Returns true if the given {@link FieldSchemaMetadata} are equivalent, otherwise false.\n * @remarks FieldSchemaMetadata are considered equivalent if their custom data and descriptions are (respectively) reference equal.\n */\nfunction areMetadataEqual(\n\ta: FieldSchemaMetadataAlpha | undefined,\n\tb: FieldSchemaMetadataAlpha | undefined,\n): boolean {\n\t// If any new fields are added to FieldSchemaMetadata, this check will stop compiling as a reminder that this function needs to be updated.\n\ttype _keys = requireTrue<\n\t\tareOnlyKeys<FieldSchemaMetadataAlpha, \"custom\" | \"description\" | \"persistedMetadata\">\n\t>;\n\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\treturn (\n\t\tObject.is(a?.custom, b?.custom) &&\n\t\ta?.description === b?.description &&\n\t\tarePersistedMetadataEqual(a?.persistedMetadata, b?.persistedMetadata)\n\t);\n}\n\n/**\n * Returns true if the given persisted metadata fields are equivalent, otherwise false.\n * @remarks\n * Currently only handles shallow equality in the case where the keys are in the same order. This is acceptable for current use cases.\n */\nfunction arePersistedMetadataEqual(\n\ta: JsonCompatibleReadOnlyObject | undefined,\n\tb: JsonCompatibleReadOnlyObject | undefined,\n): boolean {\n\tif (Object.is(a, b)) {\n\t\treturn true;\n\t}\n\n\tif (a === undefined || b === undefined) {\n\t\treturn false;\n\t}\n\n\t// Note that the key order matters. If `a` and `b` have the same content but the keys are in a different order,\n\t// this method will return false.\n\tconst aStringified = JSON.stringify(a);\n\tconst bStringified = JSON.stringify(b);\n\n\treturn aStringified === bStringified;\n}\n\n/**\n * Schema for a field of a tree node.\n * @remarks\n * Implicitly treats {@link ImplicitAllowedTypes} as a Required field of that type.\n * @public\n */\nexport type ImplicitFieldSchema = FieldSchema | ImplicitAllowedTypes;\n\n/**\n * Converts an `ImplicitFieldSchema` to a property type suitable for reading a field with this that schema.\n *\n * @typeparam TSchema - When non-exact schema are provided this errors on the side of returning too general of a type (a conservative union of all possibilities).\n * This is ideal for \"output APIs\" - i.e. it converts the schema type to the runtime type that a user will _read_ from the tree.\n * Examples of such \"non-exact\" schema include `ImplicitFieldSchema`, `ImplicitAllowedTypes`, and TypeScript unions of schema types.\n * @public\n */\nexport type TreeFieldFromImplicitField<TSchema extends ImplicitFieldSchema = FieldSchema> =\n\tTSchema extends FieldSchema<infer Kind, infer Types>\n\t\t? ApplyKind<TreeNodeFromImplicitAllowedTypes<Types>, Kind>\n\t\t: TSchema extends ImplicitAllowedTypes\n\t\t\t? TreeNodeFromImplicitAllowedTypes<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined;\n\n/**\n * Type of content that can be inserted into the tree for a field of the given schema.\n *\n * @see {@link Input}\n *\n * @typeparam TSchemaInput - Schema to process.\n * @typeparam TSchema - Do not specify: default value used as implementation detail.\n * @public\n */\nexport type InsertableTreeFieldFromImplicitField<\n\tTSchemaInput extends ImplicitFieldSchema,\n\tTSchema = UnionToIntersection<TSchemaInput>,\n> = [TSchema] extends [FieldSchema<infer Kind, infer Types>]\n\t? ApplyKindInput<InsertableTreeNodeFromImplicitAllowedTypes<Types>, Kind, true>\n\t: [TSchema] extends [ImplicitAllowedTypes]\n\t\t? InsertableTreeNodeFromImplicitAllowedTypes<TSchema>\n\t\t: never;\n\n/**\n * Content which could be inserted into a field within a tree.\n *\n * @see {@link Input}\n * @remarks\n * Extended version of {@link InsertableTreeFieldFromImplicitField} that also allows {@link (UnsafeUnknownSchema:type)}.\n * @alpha\n */\nexport type InsertableField<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> = [\n\tTSchema,\n] extends [ImplicitFieldSchema]\n\t? InsertableTreeFieldFromImplicitField<TSchema>\n\t: [TSchema] extends [UnsafeUnknownSchema]\n\t\t? InsertableContent | undefined\n\t\t: never;\n\n/**\n * Content which could be read from a field within a tree.\n *\n * @remarks\n * Extended version of {@link TreeFieldFromImplicitField} that also allows {@link (UnsafeUnknownSchema:type)}.\n * Since reading from fields with non-exact schema is still safe, this is only useful (compared to {@link TreeFieldFromImplicitField}) when the schema is also used as input and thus allows {@link (UnsafeUnknownSchema:type)}\n * for use\n * @system @alpha\n */\nexport type ReadableField<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> =\n\tTreeFieldFromImplicitField<ReadSchema<TSchema>>;\n\n/**\n * Adapter to remove {@link (UnsafeUnknownSchema:type)} from a schema type so it can be used with types for generating APIs for reading data.\n *\n * @remarks\n * Since reading with non-exact schema is still safe, this is mainly useful when the schema is also used as input and thus allows {@link (UnsafeUnknownSchema:type)}.\n * @system @alpha\n */\nexport type ReadSchema<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema> = [\n\tTSchema,\n] extends [ImplicitFieldSchema]\n\t? TSchema\n\t: ImplicitFieldSchema;\n\n/**\n * Suitable for output.\n * For input must error on side of excluding undefined instead.\n * @system @public\n */\nexport type ApplyKind<T, Kind extends FieldKind> = {\n\t[FieldKind.Required]: T;\n\t[FieldKind.Optional]: T | undefined;\n\t[FieldKind.Identifier]: T;\n}[Kind];\n\n/**\n * Suitable for input.\n *\n * @see {@link Input}\n * @system @public\n */\nexport type ApplyKindInput<T, Kind extends FieldKind, DefaultsAreOptional extends boolean> = [\n\tKind,\n] extends [FieldKind.Required]\n\t? T\n\t: [Kind] extends [FieldKind.Optional]\n\t\t? T | undefined\n\t\t: [Kind] extends [FieldKind.Identifier]\n\t\t\t? DefaultsAreOptional extends true\n\t\t\t\t? T | undefined\n\t\t\t\t: T\n\t\t\t: never;\n"]}