@fluidframework/tree 2.10.0 → 2.11.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 (465) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/api-report/tree.alpha.api.md +47 -16
  3. package/api-report/tree.beta.api.md +5 -14
  4. package/api-report/tree.legacy.alpha.api.md +5 -14
  5. package/api-report/tree.legacy.public.api.md +5 -14
  6. package/api-report/tree.public.api.md +5 -14
  7. package/dist/alpha.d.ts +9 -0
  8. package/dist/core/forest/forest.d.ts +10 -2
  9. package/dist/core/forest/forest.d.ts.map +1 -1
  10. package/dist/core/forest/forest.js.map +1 -1
  11. package/dist/core/index.d.ts +2 -2
  12. package/dist/core/index.d.ts.map +1 -1
  13. package/dist/core/index.js +3 -2
  14. package/dist/core/index.js.map +1 -1
  15. package/dist/core/rebase/utils.d.ts +1 -1
  16. package/dist/core/rebase/utils.d.ts.map +1 -1
  17. package/dist/core/rebase/utils.js +11 -8
  18. package/dist/core/rebase/utils.js.map +1 -1
  19. package/dist/core/revertible.d.ts +30 -1
  20. package/dist/core/revertible.d.ts.map +1 -1
  21. package/dist/core/revertible.js.map +1 -1
  22. package/dist/core/schema-stored/storedSchemaRepository.d.ts +2 -2
  23. package/dist/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
  24. package/dist/core/schema-stored/storedSchemaRepository.js +5 -5
  25. package/dist/core/schema-stored/storedSchemaRepository.js.map +1 -1
  26. package/dist/core/tree/anchorSet.d.ts +2 -2
  27. package/dist/core/tree/anchorSet.d.ts.map +1 -1
  28. package/dist/core/tree/anchorSet.js +21 -21
  29. package/dist/core/tree/anchorSet.js.map +1 -1
  30. package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  31. package/dist/core/tree/detachedFieldIndexCodec.js +3 -2
  32. package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
  33. package/dist/core/tree/index.d.ts +1 -1
  34. package/dist/core/tree/index.d.ts.map +1 -1
  35. package/dist/core/tree/index.js +2 -1
  36. package/dist/core/tree/index.js.map +1 -1
  37. package/dist/core/tree/visitorUtils.d.ts +25 -1
  38. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  39. package/dist/core/tree/visitorUtils.js +29 -1
  40. package/dist/core/tree/visitorUtils.js.map +1 -1
  41. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts +5 -2
  42. package/dist/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  43. package/dist/feature-libraries/chunked-forest/chunkedForest.js +24 -14
  44. package/dist/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  46. package/dist/feature-libraries/chunked-forest/uniformChunk.js +2 -2
  47. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  48. package/dist/feature-libraries/flex-tree/context.d.ts +1 -1
  49. package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
  50. package/dist/feature-libraries/flex-tree/context.js.map +1 -1
  51. package/dist/feature-libraries/index.d.ts +1 -0
  52. package/dist/feature-libraries/index.d.ts.map +1 -1
  53. package/dist/feature-libraries/index.js +4 -1
  54. package/dist/feature-libraries/index.js.map +1 -1
  55. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts +132 -0
  56. package/dist/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -0
  57. package/dist/feature-libraries/indexing/anchorTreeIndex.js +361 -0
  58. package/dist/feature-libraries/indexing/anchorTreeIndex.js.map +1 -0
  59. package/dist/feature-libraries/indexing/index.d.ts +7 -0
  60. package/dist/feature-libraries/indexing/index.d.ts.map +1 -0
  61. package/dist/feature-libraries/indexing/index.js +11 -0
  62. package/dist/feature-libraries/indexing/index.js.map +1 -0
  63. package/dist/feature-libraries/indexing/types.d.ts +32 -0
  64. package/dist/feature-libraries/indexing/types.d.ts.map +1 -0
  65. package/dist/{events/interop.js → feature-libraries/indexing/types.js} +1 -1
  66. package/dist/feature-libraries/indexing/types.js.map +1 -0
  67. package/dist/feature-libraries/object-forest/objectForest.d.ts +5 -2
  68. package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  69. package/dist/feature-libraries/object-forest/objectForest.js +21 -11
  70. package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
  71. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  72. package/dist/feature-libraries/sequence-field/invert.js +2 -2
  73. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  74. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js +3 -2
  75. package/dist/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  76. package/dist/index.d.ts +4 -4
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +4 -1
  79. package/dist/index.js.map +1 -1
  80. package/dist/packageVersion.d.ts +1 -1
  81. package/dist/packageVersion.js +1 -1
  82. package/dist/packageVersion.js.map +1 -1
  83. package/dist/shared-tree/index.d.ts +1 -1
  84. package/dist/shared-tree/index.d.ts.map +1 -1
  85. package/dist/shared-tree/index.js +1 -2
  86. package/dist/shared-tree/index.js.map +1 -1
  87. package/dist/shared-tree/schematizingTreeView.d.ts +7 -1
  88. package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
  89. package/dist/shared-tree/schematizingTreeView.js +31 -30
  90. package/dist/shared-tree/schematizingTreeView.js.map +1 -1
  91. package/dist/shared-tree/sharedTree.d.ts +3 -0
  92. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  93. package/dist/shared-tree/sharedTree.js +56 -20
  94. package/dist/shared-tree/sharedTree.js.map +1 -1
  95. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  96. package/dist/shared-tree/sharedTreeChangeFamily.js +3 -3
  97. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  98. package/dist/shared-tree/treeCheckout.d.ts +28 -64
  99. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  100. package/dist/shared-tree/treeCheckout.js +152 -129
  101. package/dist/shared-tree/treeCheckout.js.map +1 -1
  102. package/dist/shared-tree-core/branch.d.ts +25 -81
  103. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  104. package/dist/shared-tree-core/branch.js +72 -151
  105. package/dist/shared-tree-core/branch.js.map +1 -1
  106. package/dist/shared-tree-core/branchCommitEnricher.d.ts +19 -33
  107. package/dist/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  108. package/dist/shared-tree-core/branchCommitEnricher.js +73 -54
  109. package/dist/shared-tree-core/branchCommitEnricher.js.map +1 -1
  110. package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  111. package/dist/shared-tree-core/defaultResubmitMachine.js +2 -1
  112. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  113. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  114. package/dist/shared-tree-core/editManager.js +2 -2
  115. package/dist/shared-tree-core/editManager.js.map +1 -1
  116. package/dist/shared-tree-core/index.d.ts +1 -1
  117. package/dist/shared-tree-core/index.d.ts.map +1 -1
  118. package/dist/shared-tree-core/index.js +4 -3
  119. package/dist/shared-tree-core/index.js.map +1 -1
  120. package/dist/shared-tree-core/sharedTreeCore.d.ts +2 -2
  121. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  122. package/dist/shared-tree-core/sharedTreeCore.js +11 -52
  123. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  124. package/dist/shared-tree-core/transaction.d.ts +108 -0
  125. package/dist/shared-tree-core/transaction.d.ts.map +1 -0
  126. package/dist/shared-tree-core/transaction.js +99 -0
  127. package/dist/shared-tree-core/transaction.js.map +1 -0
  128. package/dist/shared-tree-core/transactionEnricher.d.ts +8 -13
  129. package/dist/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  130. package/dist/shared-tree-core/transactionEnricher.js +41 -21
  131. package/dist/shared-tree-core/transactionEnricher.js.map +1 -1
  132. package/dist/simple-tree/api/identifierIndex.d.ts +21 -0
  133. package/dist/simple-tree/api/identifierIndex.d.ts.map +1 -0
  134. package/dist/simple-tree/api/identifierIndex.js +45 -0
  135. package/dist/simple-tree/api/identifierIndex.js.map +1 -0
  136. package/dist/simple-tree/api/index.d.ts +2 -0
  137. package/dist/simple-tree/api/index.d.ts.map +1 -1
  138. package/dist/simple-tree/api/index.js +5 -1
  139. package/dist/simple-tree/api/index.js.map +1 -1
  140. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +9 -7
  141. package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  142. package/dist/simple-tree/api/simpleTreeIndex.d.ts +65 -0
  143. package/dist/simple-tree/api/simpleTreeIndex.d.ts.map +1 -0
  144. package/dist/simple-tree/api/simpleTreeIndex.js +91 -0
  145. package/dist/simple-tree/api/simpleTreeIndex.js.map +1 -0
  146. package/dist/simple-tree/api/tree.d.ts +4 -5
  147. package/dist/simple-tree/api/tree.d.ts.map +1 -1
  148. package/dist/simple-tree/api/tree.js.map +1 -1
  149. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  150. package/dist/simple-tree/core/index.d.ts +1 -1
  151. package/dist/simple-tree/core/index.d.ts.map +1 -1
  152. package/dist/simple-tree/core/index.js +2 -1
  153. package/dist/simple-tree/core/index.js.map +1 -1
  154. package/dist/simple-tree/core/treeNodeKernel.d.ts +6 -2
  155. package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  156. package/dist/simple-tree/core/treeNodeKernel.js +53 -22
  157. package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
  158. package/dist/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
  159. package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  160. package/dist/simple-tree/core/unhydratedFlexTree.js +2 -2
  161. package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  162. package/dist/simple-tree/index.d.ts +1 -1
  163. package/dist/simple-tree/index.d.ts.map +1 -1
  164. package/dist/simple-tree/index.js +4 -2
  165. package/dist/simple-tree/index.js.map +1 -1
  166. package/dist/simple-tree/objectNode.d.ts +7 -2
  167. package/dist/simple-tree/objectNode.d.ts.map +1 -1
  168. package/dist/simple-tree/objectNode.js.map +1 -1
  169. package/dist/simple-tree/toMapTree.js +3 -3
  170. package/dist/simple-tree/toMapTree.js.map +1 -1
  171. package/dist/util/index.d.ts +1 -2
  172. package/dist/util/index.d.ts.map +1 -1
  173. package/dist/util/index.js +5 -4
  174. package/dist/util/index.js.map +1 -1
  175. package/dist/util/typeCheck.d.ts +6 -1
  176. package/dist/util/typeCheck.d.ts.map +1 -1
  177. package/dist/util/typeCheck.js.map +1 -1
  178. package/dist/util/typeCheckTests.d.ts +14 -2
  179. package/dist/util/typeCheckTests.d.ts.map +1 -1
  180. package/dist/util/typeCheckTests.js.map +1 -1
  181. package/dist/util/utils.d.ts +29 -0
  182. package/dist/util/utils.d.ts.map +1 -1
  183. package/dist/util/utils.js +13 -1
  184. package/dist/util/utils.js.map +1 -1
  185. package/lib/alpha.d.ts +9 -0
  186. package/lib/core/forest/forest.d.ts +10 -2
  187. package/lib/core/forest/forest.d.ts.map +1 -1
  188. package/lib/core/forest/forest.js.map +1 -1
  189. package/lib/core/index.d.ts +2 -2
  190. package/lib/core/index.d.ts.map +1 -1
  191. package/lib/core/index.js +2 -2
  192. package/lib/core/index.js.map +1 -1
  193. package/lib/core/rebase/utils.d.ts +1 -1
  194. package/lib/core/rebase/utils.d.ts.map +1 -1
  195. package/lib/core/rebase/utils.js +11 -8
  196. package/lib/core/rebase/utils.js.map +1 -1
  197. package/lib/core/revertible.d.ts +30 -1
  198. package/lib/core/revertible.d.ts.map +1 -1
  199. package/lib/core/revertible.js.map +1 -1
  200. package/lib/core/schema-stored/storedSchemaRepository.d.ts +2 -2
  201. package/lib/core/schema-stored/storedSchemaRepository.d.ts.map +1 -1
  202. package/lib/core/schema-stored/storedSchemaRepository.js +1 -1
  203. package/lib/core/schema-stored/storedSchemaRepository.js.map +1 -1
  204. package/lib/core/tree/anchorSet.d.ts +2 -2
  205. package/lib/core/tree/anchorSet.d.ts.map +1 -1
  206. package/lib/core/tree/anchorSet.js +1 -1
  207. package/lib/core/tree/anchorSet.js.map +1 -1
  208. package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
  209. package/lib/core/tree/detachedFieldIndexCodec.js +4 -3
  210. package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
  211. package/lib/core/tree/index.d.ts +1 -1
  212. package/lib/core/tree/index.d.ts.map +1 -1
  213. package/lib/core/tree/index.js +1 -1
  214. package/lib/core/tree/index.js.map +1 -1
  215. package/lib/core/tree/visitorUtils.d.ts +25 -1
  216. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  217. package/lib/core/tree/visitorUtils.js +27 -0
  218. package/lib/core/tree/visitorUtils.js.map +1 -1
  219. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts +5 -2
  220. package/lib/feature-libraries/chunked-forest/chunkedForest.d.ts.map +1 -1
  221. package/lib/feature-libraries/chunked-forest/chunkedForest.js +18 -8
  222. package/lib/feature-libraries/chunked-forest/chunkedForest.js.map +1 -1
  223. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  224. package/lib/feature-libraries/chunked-forest/uniformChunk.js +3 -3
  225. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  226. package/lib/feature-libraries/flex-tree/context.d.ts +1 -1
  227. package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
  228. package/lib/feature-libraries/flex-tree/context.js.map +1 -1
  229. package/lib/feature-libraries/index.d.ts +1 -0
  230. package/lib/feature-libraries/index.d.ts.map +1 -1
  231. package/lib/feature-libraries/index.js +1 -0
  232. package/lib/feature-libraries/index.js.map +1 -1
  233. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts +132 -0
  234. package/lib/feature-libraries/indexing/anchorTreeIndex.d.ts.map +1 -0
  235. package/lib/feature-libraries/indexing/anchorTreeIndex.js +356 -0
  236. package/lib/feature-libraries/indexing/anchorTreeIndex.js.map +1 -0
  237. package/lib/feature-libraries/indexing/index.d.ts +7 -0
  238. package/lib/feature-libraries/indexing/index.d.ts.map +1 -0
  239. package/lib/{events → feature-libraries/indexing}/index.js +1 -1
  240. package/lib/feature-libraries/indexing/index.js.map +1 -0
  241. package/lib/feature-libraries/indexing/types.d.ts +32 -0
  242. package/lib/feature-libraries/indexing/types.d.ts.map +1 -0
  243. package/lib/{events/interop.js → feature-libraries/indexing/types.js} +1 -1
  244. package/lib/feature-libraries/indexing/types.js.map +1 -0
  245. package/lib/feature-libraries/object-forest/objectForest.d.ts +5 -2
  246. package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
  247. package/lib/feature-libraries/object-forest/objectForest.js +15 -5
  248. package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
  249. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  250. package/lib/feature-libraries/sequence-field/invert.js +4 -4
  251. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  252. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js +4 -3
  253. package/lib/feature-libraries/sequence-field/sequenceFieldToDelta.js.map +1 -1
  254. package/lib/index.d.ts +4 -4
  255. package/lib/index.d.ts.map +1 -1
  256. package/lib/index.js +1 -1
  257. package/lib/index.js.map +1 -1
  258. package/lib/packageVersion.d.ts +1 -1
  259. package/lib/packageVersion.js +1 -1
  260. package/lib/packageVersion.js.map +1 -1
  261. package/lib/shared-tree/index.d.ts +1 -1
  262. package/lib/shared-tree/index.d.ts.map +1 -1
  263. package/lib/shared-tree/index.js +1 -1
  264. package/lib/shared-tree/index.js.map +1 -1
  265. package/lib/shared-tree/schematizingTreeView.d.ts +7 -1
  266. package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
  267. package/lib/shared-tree/schematizingTreeView.js +2 -2
  268. package/lib/shared-tree/schematizingTreeView.js.map +1 -1
  269. package/lib/shared-tree/sharedTree.d.ts +3 -0
  270. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  271. package/lib/shared-tree/sharedTree.js +37 -1
  272. package/lib/shared-tree/sharedTree.js.map +1 -1
  273. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  274. package/lib/shared-tree/sharedTreeChangeFamily.js +5 -5
  275. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  276. package/lib/shared-tree/treeCheckout.d.ts +28 -64
  277. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  278. package/lib/shared-tree/treeCheckout.js +140 -116
  279. package/lib/shared-tree/treeCheckout.js.map +1 -1
  280. package/lib/shared-tree-core/branch.d.ts +25 -81
  281. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  282. package/lib/shared-tree-core/branch.js +72 -151
  283. package/lib/shared-tree-core/branch.js.map +1 -1
  284. package/lib/shared-tree-core/branchCommitEnricher.d.ts +19 -33
  285. package/lib/shared-tree-core/branchCommitEnricher.d.ts.map +1 -1
  286. package/lib/shared-tree-core/branchCommitEnricher.js +74 -55
  287. package/lib/shared-tree-core/branchCommitEnricher.js.map +1 -1
  288. package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  289. package/lib/shared-tree-core/defaultResubmitMachine.js +3 -2
  290. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  291. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  292. package/lib/shared-tree-core/editManager.js +1 -1
  293. package/lib/shared-tree-core/editManager.js.map +1 -1
  294. package/lib/shared-tree-core/index.d.ts +1 -1
  295. package/lib/shared-tree-core/index.d.ts.map +1 -1
  296. package/lib/shared-tree-core/index.js +1 -1
  297. package/lib/shared-tree-core/index.js.map +1 -1
  298. package/lib/shared-tree-core/sharedTreeCore.d.ts +2 -2
  299. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  300. package/lib/shared-tree-core/sharedTreeCore.js +12 -53
  301. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  302. package/lib/shared-tree-core/transaction.d.ts +108 -0
  303. package/lib/shared-tree-core/transaction.d.ts.map +1 -0
  304. package/lib/shared-tree-core/transaction.js +95 -0
  305. package/lib/shared-tree-core/transaction.js.map +1 -0
  306. package/lib/shared-tree-core/transactionEnricher.d.ts +8 -13
  307. package/lib/shared-tree-core/transactionEnricher.d.ts.map +1 -1
  308. package/lib/shared-tree-core/transactionEnricher.js +41 -21
  309. package/lib/shared-tree-core/transactionEnricher.js.map +1 -1
  310. package/lib/simple-tree/api/identifierIndex.d.ts +21 -0
  311. package/lib/simple-tree/api/identifierIndex.d.ts.map +1 -0
  312. package/lib/simple-tree/api/identifierIndex.js +41 -0
  313. package/lib/simple-tree/api/identifierIndex.js.map +1 -0
  314. package/lib/simple-tree/api/index.d.ts +2 -0
  315. package/lib/simple-tree/api/index.d.ts.map +1 -1
  316. package/lib/simple-tree/api/index.js +2 -0
  317. package/lib/simple-tree/api/index.js.map +1 -1
  318. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +11 -9
  319. package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
  320. package/lib/simple-tree/api/simpleTreeIndex.d.ts +65 -0
  321. package/lib/simple-tree/api/simpleTreeIndex.d.ts.map +1 -0
  322. package/lib/simple-tree/api/simpleTreeIndex.js +87 -0
  323. package/lib/simple-tree/api/simpleTreeIndex.js.map +1 -0
  324. package/lib/simple-tree/api/tree.d.ts +4 -5
  325. package/lib/simple-tree/api/tree.d.ts.map +1 -1
  326. package/lib/simple-tree/api/tree.js.map +1 -1
  327. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  328. package/lib/simple-tree/core/index.d.ts +1 -1
  329. package/lib/simple-tree/core/index.d.ts.map +1 -1
  330. package/lib/simple-tree/core/index.js +1 -1
  331. package/lib/simple-tree/core/index.js.map +1 -1
  332. package/lib/simple-tree/core/treeNodeKernel.d.ts +6 -2
  333. package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
  334. package/lib/simple-tree/core/treeNodeKernel.js +31 -1
  335. package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
  336. package/lib/simple-tree/core/unhydratedFlexTree.d.ts +1 -1
  337. package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -1
  338. package/lib/simple-tree/core/unhydratedFlexTree.js +1 -1
  339. package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -1
  340. package/lib/simple-tree/index.d.ts +1 -1
  341. package/lib/simple-tree/index.d.ts.map +1 -1
  342. package/lib/simple-tree/index.js +1 -1
  343. package/lib/simple-tree/index.js.map +1 -1
  344. package/lib/simple-tree/objectNode.d.ts +7 -2
  345. package/lib/simple-tree/objectNode.d.ts.map +1 -1
  346. package/lib/simple-tree/objectNode.js.map +1 -1
  347. package/lib/simple-tree/toMapTree.js +5 -5
  348. package/lib/simple-tree/toMapTree.js.map +1 -1
  349. package/lib/util/index.d.ts +1 -2
  350. package/lib/util/index.d.ts.map +1 -1
  351. package/lib/util/index.js +1 -2
  352. package/lib/util/index.js.map +1 -1
  353. package/lib/util/typeCheck.d.ts +6 -1
  354. package/lib/util/typeCheck.d.ts.map +1 -1
  355. package/lib/util/typeCheck.js.map +1 -1
  356. package/lib/util/typeCheckTests.d.ts +14 -2
  357. package/lib/util/typeCheckTests.d.ts.map +1 -1
  358. package/lib/util/typeCheckTests.js.map +1 -1
  359. package/lib/util/utils.d.ts +29 -0
  360. package/lib/util/utils.d.ts.map +1 -1
  361. package/lib/util/utils.js +9 -0
  362. package/lib/util/utils.js.map +1 -1
  363. package/package.json +22 -22
  364. package/src/core/forest/forest.ts +12 -1
  365. package/src/core/index.ts +8 -1
  366. package/src/core/rebase/utils.ts +12 -10
  367. package/src/core/revertible.ts +35 -1
  368. package/src/core/schema-stored/storedSchemaRepository.ts +2 -1
  369. package/src/core/tree/anchorSet.ts +2 -1
  370. package/src/core/tree/detachedFieldIndexCodec.ts +4 -3
  371. package/src/core/tree/index.ts +1 -0
  372. package/src/core/tree/visitorUtils.ts +56 -1
  373. package/src/feature-libraries/chunked-forest/chunkedForest.ts +33 -7
  374. package/src/feature-libraries/chunked-forest/uniformChunk.ts +3 -3
  375. package/src/feature-libraries/flex-tree/context.ts +1 -1
  376. package/src/feature-libraries/index.ts +9 -0
  377. package/src/feature-libraries/indexing/anchorTreeIndex.ts +453 -0
  378. package/src/feature-libraries/indexing/index.ts +11 -0
  379. package/src/feature-libraries/indexing/types.ts +37 -0
  380. package/src/feature-libraries/object-forest/objectForest.ts +22 -4
  381. package/src/feature-libraries/sequence-field/invert.ts +4 -4
  382. package/src/feature-libraries/sequence-field/sequenceFieldToDelta.ts +4 -4
  383. package/src/index.ts +16 -6
  384. package/src/packageVersion.ts +1 -1
  385. package/src/shared-tree/index.ts +0 -2
  386. package/src/shared-tree/schematizingTreeView.ts +7 -7
  387. package/src/shared-tree/sharedTree.ts +60 -6
  388. package/src/shared-tree/sharedTreeChangeFamily.ts +5 -4
  389. package/src/shared-tree/treeCheckout.ts +186 -193
  390. package/src/shared-tree-core/branch.ts +93 -220
  391. package/src/shared-tree-core/branchCommitEnricher.ts +69 -64
  392. package/src/shared-tree-core/defaultResubmitMachine.ts +3 -2
  393. package/src/shared-tree-core/editManager.ts +1 -1
  394. package/src/shared-tree-core/index.ts +9 -2
  395. package/src/shared-tree-core/sharedTreeCore.ts +17 -62
  396. package/src/shared-tree-core/transaction.ts +165 -0
  397. package/src/shared-tree-core/transactionEnricher.ts +30 -24
  398. package/src/simple-tree/api/identifierIndex.ts +64 -0
  399. package/src/simple-tree/api/index.ts +5 -0
  400. package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +17 -18
  401. package/src/simple-tree/api/simpleTreeIndex.ts +231 -0
  402. package/src/simple-tree/api/tree.ts +8 -5
  403. package/src/simple-tree/api/treeNodeApi.ts +1 -1
  404. package/src/simple-tree/core/index.ts +1 -0
  405. package/src/simple-tree/core/treeNodeKernel.ts +37 -2
  406. package/src/simple-tree/core/unhydratedFlexTree.ts +2 -1
  407. package/src/simple-tree/index.ts +4 -0
  408. package/src/simple-tree/objectNode.ts +19 -12
  409. package/src/simple-tree/toMapTree.ts +5 -5
  410. package/src/util/index.ts +3 -1
  411. package/src/util/typeCheck.ts +6 -1
  412. package/src/util/typeCheckTests.ts +11 -1
  413. package/src/util/utils.ts +38 -0
  414. package/dist/events/emitter.d.ts +0 -139
  415. package/dist/events/emitter.d.ts.map +0 -1
  416. package/dist/events/emitter.js +0 -165
  417. package/dist/events/emitter.js.map +0 -1
  418. package/dist/events/index.d.ts +0 -7
  419. package/dist/events/index.d.ts.map +0 -1
  420. package/dist/events/index.js +0 -11
  421. package/dist/events/index.js.map +0 -1
  422. package/dist/events/interop.d.ts +0 -30
  423. package/dist/events/interop.d.ts.map +0 -1
  424. package/dist/events/interop.js.map +0 -1
  425. package/dist/events/listeners.d.ts +0 -76
  426. package/dist/events/listeners.d.ts.map +0 -1
  427. package/dist/events/listeners.js +0 -7
  428. package/dist/events/listeners.js.map +0 -1
  429. package/dist/shared-tree-core/transactionStack.d.ts +0 -29
  430. package/dist/shared-tree-core/transactionStack.d.ts.map +0 -1
  431. package/dist/shared-tree-core/transactionStack.js +0 -41
  432. package/dist/shared-tree-core/transactionStack.js.map +0 -1
  433. package/dist/util/transactionResult.d.ts +0 -19
  434. package/dist/util/transactionResult.d.ts.map +0 -1
  435. package/dist/util/transactionResult.js +0 -23
  436. package/dist/util/transactionResult.js.map +0 -1
  437. package/lib/events/emitter.d.ts +0 -139
  438. package/lib/events/emitter.d.ts.map +0 -1
  439. package/lib/events/emitter.js +0 -160
  440. package/lib/events/emitter.js.map +0 -1
  441. package/lib/events/index.d.ts +0 -7
  442. package/lib/events/index.d.ts.map +0 -1
  443. package/lib/events/index.js.map +0 -1
  444. package/lib/events/interop.d.ts +0 -30
  445. package/lib/events/interop.d.ts.map +0 -1
  446. package/lib/events/interop.js.map +0 -1
  447. package/lib/events/listeners.d.ts +0 -76
  448. package/lib/events/listeners.d.ts.map +0 -1
  449. package/lib/events/listeners.js +0 -6
  450. package/lib/events/listeners.js.map +0 -1
  451. package/lib/shared-tree-core/transactionStack.d.ts +0 -29
  452. package/lib/shared-tree-core/transactionStack.d.ts.map +0 -1
  453. package/lib/shared-tree-core/transactionStack.js +0 -37
  454. package/lib/shared-tree-core/transactionStack.js.map +0 -1
  455. package/lib/util/transactionResult.d.ts +0 -19
  456. package/lib/util/transactionResult.d.ts.map +0 -1
  457. package/lib/util/transactionResult.js +0 -20
  458. package/lib/util/transactionResult.js.map +0 -1
  459. package/src/events/README.md +0 -3
  460. package/src/events/emitter.ts +0 -256
  461. package/src/events/index.ts +0 -19
  462. package/src/events/interop.ts +0 -38
  463. package/src/events/listeners.ts +0 -80
  464. package/src/shared-tree-core/transactionStack.ts +0 -45
  465. package/src/util/transactionResult.ts +0 -19
@@ -0,0 +1,231 @@
1
+ /*!
2
+ * Copyright (c) Microsoft Corporation and contributors. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+
6
+ import type {
7
+ AnchorNode,
8
+ FieldKey,
9
+ ITreeSubscriptionCursor,
10
+ TreeNodeSchemaIdentifier,
11
+ } from "../../core/index.js";
12
+ import {
13
+ AnchorTreeIndex,
14
+ isTreeValue,
15
+ type TreeIndexNodes,
16
+ hasElement,
17
+ type TreeIndex,
18
+ type TreeIndexKey,
19
+ type KeyFinder,
20
+ } from "../../feature-libraries/index.js";
21
+ import { brand, fail } from "../../util/index.js";
22
+ import type { ImplicitFieldSchema, NodeFromSchema } from "../schemaTypes.js";
23
+ import { treeNodeFromAnchor, type TreeNode, type TreeNodeSchema } from "../core/index.js";
24
+ import { treeNodeApi } from "./treeNodeApi.js";
25
+ import type { TreeView } from "./tree.js";
26
+ import { walkFieldSchema } from "../walkFieldSchema.js";
27
+ import type { SchematizingSimpleTreeView } from "../../shared-tree/index.js";
28
+
29
+ /**
30
+ * A {@link TreeIndex} that returns tree nodes given their associated keys.
31
+ *
32
+ * @alpha
33
+ */
34
+ export type SimpleTreeIndex<TKey extends TreeIndexKey, TValue> = TreeIndex<TKey, TValue>;
35
+
36
+ /**
37
+ * Creates a {@link SimpleTreeIndex} with a specified indexer.
38
+ *
39
+ * @param view - the view for the tree being indexed
40
+ * @param indexer - a function that takes in a {@link TreeNodeSchema} and returns the field name that all nodes of the given schema
41
+ * should be keyed on, must be pure and functional
42
+ * @param getValue - given at least one {@link TreeNode}, returns an associated value
43
+ * @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
44
+ *
45
+ * @alpha
46
+ */
47
+ export function createSimpleTreeIndex<
48
+ TFieldSchema extends ImplicitFieldSchema,
49
+ TKey extends TreeIndexKey,
50
+ TValue,
51
+ >(
52
+ view: TreeView<TFieldSchema>,
53
+ indexer: (schema: TreeNodeSchema) => string | undefined,
54
+ getValue: (nodes: TreeIndexNodes<TreeNode>) => TValue,
55
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
56
+ ): SimpleTreeIndex<TKey, TValue>;
57
+ /**
58
+ * Creates a {@link SimpleTreeIndex} with a specified indexer.
59
+ *
60
+ * @param view - the view for the tree being indexed
61
+ * @param indexer - a function that takes in a {@link TreeNodeSchema} and returns the field name that all nodes of the given schema
62
+ * should be keyed on, must be pure and functional
63
+ * @param getValue - given at least one {@link TreeNode}, returns an associated value
64
+ * @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
65
+ * @param indexableSchema - a list of all the schema types that can be indexed
66
+ *
67
+ * @alpha
68
+ */
69
+ export function createSimpleTreeIndex<
70
+ TFieldSchema extends ImplicitFieldSchema,
71
+ TKey extends TreeIndexKey,
72
+ TValue,
73
+ TSchema extends TreeNodeSchema,
74
+ >(
75
+ view: TreeView<TFieldSchema>,
76
+ indexer: (schema: TSchema) => string | undefined,
77
+ getValue: (nodes: TreeIndexNodes<NodeFromSchema<TSchema>>) => TValue,
78
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
79
+ indexableSchema: readonly TSchema[],
80
+ ): SimpleTreeIndex<TKey, TValue>;
81
+ /**
82
+ * Creates a {@link SimpleTreeIndex} with a specified indexer.
83
+ *
84
+ * @param view - the view for the tree being indexed
85
+ * @param indexer - a map from {@link TreeNodeSchema} to the field name that all nodes of the given schema
86
+ * should be keyed on
87
+ * @param getValue - given at least one {@link TreeNode}, returns an associated value
88
+ * @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
89
+ *
90
+ * @alpha
91
+ */
92
+ export function createSimpleTreeIndex<
93
+ TFieldSchema extends ImplicitFieldSchema,
94
+ TKey extends TreeIndexKey,
95
+ TValue,
96
+ >(
97
+ view: TreeView<TFieldSchema>,
98
+ indexer: Map<TreeNodeSchema, string>,
99
+ getValue: (nodes: TreeIndexNodes<TreeNode>) => TValue,
100
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
101
+ ): SimpleTreeIndex<TKey, TValue>;
102
+ /**
103
+ * Creates a {@link SimpleTreeIndex} with a specified indexer.
104
+ *
105
+ * @param view - the view for the tree being indexed
106
+ * @param indexer - a map from {@link TreeNodeSchema} to the field name that all nodes of the given schema
107
+ * should be keyed on
108
+ * @param getValue - given at least one {@link TreeNode}, returns an associated value
109
+ * @param isKeyValid - function for verifying the validity of the key retrieved based on the information given by the indexer
110
+ * @param indexableSchema - a list of all the schema types that can be indexed
111
+ *
112
+ * @alpha
113
+ */
114
+ export function createSimpleTreeIndex<
115
+ TFieldSchema extends ImplicitFieldSchema,
116
+ TKey extends TreeIndexKey,
117
+ TValue,
118
+ TSchema extends TreeNodeSchema,
119
+ >(
120
+ view: TreeView<TFieldSchema>,
121
+ indexer: Map<TreeNodeSchema, string>,
122
+ getValue: (nodes: TreeIndexNodes<NodeFromSchema<TSchema>>) => TValue,
123
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
124
+ indexableSchema: readonly TSchema[],
125
+ ): SimpleTreeIndex<TKey, TValue>;
126
+ /**
127
+ * Creates a {@link SimpleTreeIndex} with a specified indexer.
128
+ *
129
+ * @alpha
130
+ */
131
+ export function createSimpleTreeIndex<
132
+ TFieldSchema extends ImplicitFieldSchema,
133
+ TKey extends TreeIndexKey,
134
+ TValue,
135
+ >(
136
+ view: TreeView<TFieldSchema>,
137
+ indexer: ((schema: TreeNodeSchema) => string | undefined) | Map<TreeNodeSchema, string>,
138
+ getValue:
139
+ | ((nodes: TreeIndexNodes<TreeNode>) => TValue)
140
+ | ((nodes: TreeIndexNodes<NodeFromSchema<TreeNodeSchema>>) => TValue),
141
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
142
+ indexableSchema?: readonly TreeNodeSchema[],
143
+ ): SimpleTreeIndex<TKey, TValue> {
144
+ const indexableSchemaMap = new Map();
145
+ if (indexableSchema !== undefined) {
146
+ for (const schemus of indexableSchema) {
147
+ indexableSchemaMap.set(schemus.identifier, schemus);
148
+ }
149
+ } else {
150
+ walkFieldSchema(view.schema, {
151
+ node: (schemus) => indexableSchemaMap.set(schemus.identifier, schemus),
152
+ });
153
+ }
154
+
155
+ const schemaIndexer =
156
+ indexableSchema === undefined
157
+ ? (schemaIdentifier: TreeNodeSchemaIdentifier) => {
158
+ // if indexable schema isn't provided, we check if the node is in schema
159
+ const schemus = indexableSchemaMap.get(schemaIdentifier);
160
+ if (schemus !== undefined) {
161
+ const keyLocation =
162
+ typeof indexer === "function" ? indexer(schemus) : indexer.get(schemus);
163
+ if (keyLocation !== undefined) {
164
+ return makeGenericKeyFinder<TKey>(brand(keyLocation), isKeyValid);
165
+ }
166
+ } else {
167
+ fail("node is out of schema");
168
+ }
169
+ }
170
+ : (schemaIdentifier: TreeNodeSchemaIdentifier) => {
171
+ const schemus = indexableSchemaMap.get(schemaIdentifier);
172
+ if (schemus !== undefined) {
173
+ const keyLocation =
174
+ typeof indexer === "function" ? indexer(schemus) : indexer.get(schemus);
175
+ if (keyLocation !== undefined) {
176
+ return makeGenericKeyFinder<TKey>(brand(keyLocation), isKeyValid);
177
+ }
178
+ }
179
+ };
180
+
181
+ const index = new AnchorTreeIndex<TKey, TValue>(
182
+ (view as SchematizingSimpleTreeView<TFieldSchema>).getView().checkout.forest,
183
+ schemaIndexer,
184
+ (anchorNodes) => {
185
+ const simpleTreeNodes: TreeNode[] = [];
186
+ for (const anchorNode of anchorNodes) {
187
+ const simpleTree = treeNodeFromAnchor(anchorNode);
188
+ if (!isTreeValue(simpleTree)) {
189
+ simpleTreeNodes.push(simpleTree);
190
+ }
191
+ }
192
+
193
+ if (hasElement(simpleTreeNodes)) {
194
+ return getValue(simpleTreeNodes);
195
+ }
196
+ },
197
+ (anchorNode: AnchorNode) => {
198
+ const simpleTree = treeNodeFromAnchor(anchorNode);
199
+ if (!isTreeValue(simpleTree)) {
200
+ return treeNodeApi.status(simpleTree);
201
+ }
202
+ },
203
+ );
204
+
205
+ // all the type checking guarantees that we put nodes of the correct type in the index
206
+ // but it's not captured in the type system
207
+ return index as SimpleTreeIndex<TKey, TValue>;
208
+ }
209
+
210
+ function makeGenericKeyFinder<TKey extends TreeIndexKey>(
211
+ keyField: FieldKey,
212
+ isKeyValid: (key: TreeIndexKey) => key is TKey,
213
+ ): KeyFinder<TKey> {
214
+ return (cursor: ITreeSubscriptionCursor) => {
215
+ cursor.enterField(keyField);
216
+ cursor.firstNode();
217
+ const value = cursor.value;
218
+ cursor.exitNode();
219
+ cursor.exitField();
220
+
221
+ if (value === undefined) {
222
+ fail("a value for the key does not exist");
223
+ }
224
+
225
+ if (!isKeyValid(value)) {
226
+ fail("the key is an unexpected type");
227
+ }
228
+
229
+ return value;
230
+ };
231
+ }
@@ -3,11 +3,14 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import type { IFluidLoadable, IDisposable } from "@fluidframework/core-interfaces";
6
+ import type { IFluidLoadable, IDisposable, Listenable } from "@fluidframework/core-interfaces";
7
7
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
 
9
- import type { CommitMetadata, RevertibleFactory } from "../../core/index.js";
10
- import type { Listenable } from "../../events/index.js";
9
+ import type {
10
+ CommitMetadata,
11
+ RevertibleAlphaFactory,
12
+ RevertibleFactory,
13
+ } from "../../core/index.js";
11
14
 
12
15
  import {
13
16
  type ImplicitFieldSchema,
@@ -629,7 +632,7 @@ export interface TreeBranchEvents {
629
632
  * @param getRevertible - a function that allows users to get a revertible for the change. If not provided,
630
633
  * this change is not revertible.
631
634
  */
632
- changed(data: CommitMetadata, getRevertible?: RevertibleFactory): void;
635
+ changed(data: CommitMetadata, getRevertible?: RevertibleAlphaFactory): void;
633
636
 
634
637
  /**
635
638
  * Fired when:
@@ -644,7 +647,7 @@ export interface TreeBranchEvents {
644
647
  * @param getRevertible - a function provided that allows users to get a revertible for the commit that was applied. If not provided,
645
648
  * this commit is not revertible.
646
649
  */
647
- commitApplied(data: CommitMetadata, getRevertible?: RevertibleFactory): void;
650
+ commitApplied(data: CommitMetadata, getRevertible?: RevertibleAlphaFactory): void;
648
651
  }
649
652
 
650
653
  /**
@@ -24,7 +24,7 @@ import {
24
24
  } from "../leafNodeSchema.js";
25
25
  import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
26
26
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
27
- import type { Off } from "../../events/index.js";
27
+ import type { Off } from "@fluidframework/core-interfaces";
28
28
  import {
29
29
  getKernel,
30
30
  isTreeNode,
@@ -12,6 +12,7 @@ export {
12
12
  tryDisposeTreeNode,
13
13
  tryGetTreeNodeFromMapNode,
14
14
  getOrCreateInnerNode,
15
+ treeNodeFromAnchor,
15
16
  } from "./treeNodeKernel.js";
16
17
  export { type WithType, typeNameSymbol, typeSchemaSymbol } from "./withType.js";
17
18
  export {
@@ -4,13 +4,15 @@
4
4
  */
5
5
 
6
6
  import { assert, Lazy } from "@fluidframework/core-utils/internal";
7
- import { createEmitter, type Listenable, type Off } from "../../events/index.js";
8
- import type { TreeNode, Unhydrated } from "./types.js";
7
+ import { createEmitter } from "@fluid-internal/client-utils";
8
+ import type { Listenable, Off } from "@fluidframework/core-interfaces";
9
+ import type { InternalTreeNode, TreeNode, Unhydrated } from "./types.js";
9
10
  import {
10
11
  anchorSlot,
11
12
  type AnchorEvents,
12
13
  type AnchorNode,
13
14
  type AnchorSet,
15
+ type TreeValue,
14
16
  type UpPath,
15
17
  } from "../../core/index.js";
16
18
  import {
@@ -447,3 +449,36 @@ export function getOrCreateInnerNode(treeNode: TreeNode, allowFreed = false): In
447
449
  const kernel = getKernel(treeNode);
448
450
  return kernel.getOrCreateInnerNode(allowFreed);
449
451
  }
452
+
453
+ /**
454
+ * Gets a flex node from an anchor node
455
+ */
456
+ function flexNodeFromAnchor(anchorNode: AnchorNode): FlexTreeNode {
457
+ // the proxy is bound to an anchor node, but it may or may not have an actual flex node yet
458
+ const flexNode = anchorNode.slots.get(flexTreeSlot);
459
+ if (flexNode !== undefined) {
460
+ return flexNode; // If it does have a flex node, return it...
461
+ } // ...otherwise, the flex node must be created
462
+ const context = anchorNode.anchorSet.slots.get(ContextSlot) ?? fail("missing context");
463
+ const cursor = context.checkout.forest.allocateCursor("getFlexNode");
464
+ context.checkout.forest.moveCursorToPath(anchorNode, cursor);
465
+ const newFlexNode = makeTree(context, cursor);
466
+ cursor.free();
467
+ return newFlexNode;
468
+ }
469
+
470
+ /**
471
+ * Gets a tree node from an anchor node
472
+ */
473
+ export function treeNodeFromAnchor(anchorNode: AnchorNode): TreeNode | TreeValue {
474
+ const cached = anchorNode.slots.get(proxySlot);
475
+ if (cached !== undefined) {
476
+ return cached;
477
+ }
478
+
479
+ const flexNode = flexNodeFromAnchor(anchorNode);
480
+ const classSchema = getTreeNodeSchemaFromHydratedFlexNode(flexNode);
481
+ return typeof classSchema === "function"
482
+ ? new classSchema(flexNode as unknown as InternalTreeNode)
483
+ : (classSchema as { create(data: FlexTreeNode): TreeValue }).create(flexNode);
484
+ }
@@ -4,6 +4,8 @@
4
4
  */
5
5
 
6
6
  import { assert, oob } from "@fluidframework/core-utils/internal";
7
+ import { createEmitter } from "@fluid-internal/client-utils";
8
+ import type { Listenable } from "@fluidframework/core-interfaces";
7
9
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
10
 
9
11
  import {
@@ -43,7 +45,6 @@ import {
43
45
  cursorForMapTreeNode,
44
46
  } from "../../feature-libraries/index.js";
45
47
  import type { Context } from "./context.js";
46
- import { createEmitter, type Listenable } from "../../events/index.js";
47
48
 
48
49
  interface UnhydratedTreeSequenceFieldEditBuilder
49
50
  extends SequenceFieldEditBuilder<ExclusiveMapTree[]> {
@@ -51,6 +51,10 @@ export {
51
51
  type NodeChangedData,
52
52
  TreeBeta,
53
53
  type TreeChangeEventsBeta,
54
+ type SimpleTreeIndex,
55
+ type IdentifierIndex,
56
+ createSimpleTreeIndex,
57
+ createIdentifierIndex,
54
58
  type SimpleNodeSchemaBase,
55
59
  type SimpleTreeSchema,
56
60
  type SimpleNodeSchema,
@@ -100,24 +100,31 @@ export type FieldHasDefault<T extends ImplicitFieldSchema> = T extends FieldSche
100
100
  *
101
101
  * @see {@link Input}
102
102
  *
103
- * @privateRemarks TODO: consider separating these cases into different types.
103
+ * @privateRemarks
104
+ * TODO: consider separating these cases into different types.
105
+ *
106
+ * Empty objects don't get "no excess property" checks in literals.
107
+ * To prevent extraneous properties in literals for the fields of an empty object from compiling, the empty case is special cased to produce `Record<string, never>`.
108
+ * More details at {@link https://mercury.com/blog/creating-an-emptyobject-type-in-typescript}.
104
109
  *
105
110
  * @system @public
106
111
  */
107
112
  export type InsertableObjectFromSchemaRecord<
108
113
  T extends RestrictiveStringRecord<ImplicitFieldSchema>,
109
- > = FlattenKeys<
110
- {
111
- readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<
112
- T[Property & string]
114
+ > = Record<string, never> extends T
115
+ ? Record<string, never>
116
+ : FlattenKeys<
117
+ {
118
+ readonly [Property in keyof T]?: InsertableTreeFieldFromImplicitField<
119
+ T[Property & string]
120
+ >;
121
+ } & {
122
+ // Field does not have a known default, make it required:
123
+ readonly [Property in keyof T as FieldHasDefault<T[Property & string]> extends false
124
+ ? Property
125
+ : never]: InsertableTreeFieldFromImplicitField<T[Property & string]>;
126
+ }
113
127
  >;
114
- } & {
115
- // Field does not have a known default, make it required:
116
- readonly [Property in keyof T as FieldHasDefault<T[Property & string]> extends false
117
- ? Property
118
- : never]: InsertableTreeFieldFromImplicitField<T[Property & string]>;
119
- }
120
- >;
121
128
 
122
129
  /**
123
130
  * Maps from simple field keys ("property" keys) to information about the field.
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
 
6
- import { assert, oob } from "@fluidframework/core-utils/internal";
6
+ import { assert } from "@fluidframework/core-utils/internal";
7
7
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
8
8
  import { isFluidHandle } from "@fluidframework/runtime-utils/internal";
9
9
 
@@ -21,7 +21,7 @@ import {
21
21
  valueSchemaAllows,
22
22
  type NodeKeyManager,
23
23
  } from "../feature-libraries/index.js";
24
- import { brand, fail, isReadonlyArray, find } from "../util/index.js";
24
+ import { brand, fail, isReadonlyArray, find, hasSome, hasSingle } from "../util/index.js";
25
25
 
26
26
  import { nullSchema } from "./leafNodeSchema.js";
27
27
  import {
@@ -465,10 +465,10 @@ function getType(
465
465
  );
466
466
  }
467
467
  assert(
468
- possibleTypes.length !== 0,
468
+ hasSome(possibleTypes),
469
469
  0x84e /* data is incompatible with all types allowed by the schema */,
470
470
  );
471
- if (possibleTypes.length !== 1) {
471
+ if (!hasSingle(possibleTypes)) {
472
472
  throw new UsageError(
473
473
  `The provided data is compatible with more than one type allowed by the schema.
474
474
  The set of possible types is ${JSON.stringify([
@@ -478,7 +478,7 @@ Explicitly construct an unhydrated node of the desired type to disambiguate.
478
478
  For class-based schema, this can be done by replacing an expression like "{foo: 1}" with "new MySchema({foo: 1})".`,
479
479
  );
480
480
  }
481
- return possibleTypes[0] ?? oob();
481
+ return possibleTypes[0];
482
482
  }
483
483
 
484
484
  /**
package/src/util/index.ts CHANGED
@@ -37,7 +37,6 @@ export {
37
37
  } from "./nestedMap.js";
38
38
  export { addToNestedSet, type NestedSet, nestedSetContains } from "./nestedSet.js";
39
39
  export { type OffsetList, OffsetListFactory } from "./offsetList.js";
40
- export { TransactionResult } from "./transactionResult.js";
41
40
  export type {
42
41
  areSafelyAssignable,
43
42
  Contravariant,
@@ -91,6 +90,9 @@ export {
91
90
  compareStrings,
92
91
  find,
93
92
  count,
93
+ getLast,
94
+ hasSome,
95
+ hasSingle,
94
96
  } from "./utils.js";
95
97
  export { ReferenceCountedBase, type ReferenceCounted } from "./referenceCounting.js";
96
98
 
@@ -193,6 +193,11 @@ export type requireAssignableTo<_A extends B, B> = true;
193
193
 
194
194
  /**
195
195
  * Returns a type parameter that is true iff the `Keys` union includes all the keys of `T`.
196
+ *
197
+ * @remarks
198
+ * This does not handle when the T has an index signature permitting keys like `string` which
199
+ * TypeScript cannot omit members from.
200
+ *
196
201
  * @example
197
202
  * ```ts
198
203
  * type _check = requireTrue<areOnlyKeys<{a: number, b: number}, 'a' | 'b'>> // true`
@@ -201,5 +206,5 @@ export type requireAssignableTo<_A extends B, B> = true;
201
206
  */
202
207
  export type areOnlyKeys<T, Keys extends keyof T> = isAssignableTo<
203
208
  Record<string, never>,
204
- Omit<T, Keys>
209
+ Omit<Required<T>, Keys>
205
210
  >;
@@ -15,6 +15,7 @@ import type {
15
15
  Covariant,
16
16
  Invariant,
17
17
  MakeNominal,
18
+ areOnlyKeys,
18
19
  areSafelyAssignable,
19
20
  eitherIsAny,
20
21
  isAny,
@@ -221,10 +222,19 @@ export type EnforceTypeCheckTests =
221
222
  | requireTrue<isStrictSubset<[1, true], [1 | 2, true | false]>>
222
223
  | requireTrue<isStrictSubset<[1, true], [1, true | false]>>
223
224
  | requireTrue<isStrictSubset<[1, true], [1, true] | [1 | false]>>
225
+ | requireTrue<isStrictSubset<1, number>>
224
226
  | requireFalse<isStrictSubset<1, 1>>
225
227
  | requireFalse<isStrictSubset<1, 2>>
226
228
  | requireFalse<isStrictSubset<[1, true], [1, true]>>
227
- | requireFalse<isStrictSubset<1 | 2, 1>>;
229
+ | requireFalse<isStrictSubset<1 | 2, 1>>
230
+
231
+ // areOnlyKeys
232
+ | requireTrue<areOnlyKeys<{ a: number; b: number }, "a" | "b">>
233
+ | requireTrue<areOnlyKeys<{ a?: number; b: number }, "a" | "b">>
234
+ | requireFalse<areOnlyKeys<{ a?: number; b: number }, "b">>
235
+ | requireFalse<areOnlyKeys<{ a: number; b: number }, "a">>;
236
+ // This case is explicitly documented as unsupported.
237
+ // | requireFalse<areOnlyKeys<Record<string, unknown>, "a">>;
228
238
 
229
239
  // negative tests (should not build)
230
240
  // @ts-expect-error negative test
package/src/util/utils.ts CHANGED
@@ -79,6 +79,44 @@ export function makeArray<T>(size: number, filler: (index: number) => T): T[] {
79
79
  return array;
80
80
  }
81
81
 
82
+ /**
83
+ * Returns the last element of an array, or `undefined` if the array has no elements.
84
+ * @param array - The array to get the last element from.
85
+ * @remarks
86
+ * If the type of the array has been narrowed by e.g. {@link hasSome | hasSome(array)} or {@link hasSingle | hasOne(array)} then the return type will be `T` rather than `T | undefined`.
87
+ */
88
+ export function getLast<T>(array: readonly [T, ...T[]]): T;
89
+ export function getLast<T>(array: { [index: number]: T; length: number }): T | undefined;
90
+ export function getLast<T>(array: { [index: number]: T; length: number }): T | undefined {
91
+ return array[array.length - 1];
92
+ }
93
+
94
+ /**
95
+ * Returns true if and only if the given array has at least one element.
96
+ * @param array - The array to check.
97
+ * @remarks
98
+ * If `array` contains at least one element, its type will be narrowed and can benefit from improved typing from e.g. `array[0]` and {@link getLast | getLast(array)}.
99
+ * This is especially useful when "noUncheckedIndexedAccess" is enabled in the TypeScript compiler options, since the return type of `array[0]` will be `T` rather than `T | undefined`.
100
+ */
101
+ export function hasSome<T>(array: T[]): array is [T, ...T[]];
102
+ export function hasSome<T>(array: readonly T[]): array is readonly [T, ...T[]];
103
+ export function hasSome<T>(array: readonly T[]): array is [T, ...T[]] {
104
+ return array.length > 0;
105
+ }
106
+
107
+ /**
108
+ * Returns true if and only if the given array has exactly one element.
109
+ * @param array - The array to check.
110
+ * @remarks
111
+ * If `array` contains exactly one element, its type will be narrowed and can benefit from improved typing from e.g. `array[0]` and {@link getLast | getLast(array)}.
112
+ * This is especially useful when "noUncheckedIndexedAccess" is enabled in the TypeScript compiler options, since the return type of `array[0]` will be `T` rather than `T | undefined`.
113
+ */
114
+ export function hasSingle<T>(array: T[]): array is [T];
115
+ export function hasSingle<T>(array: readonly T[]): array is readonly [T];
116
+ export function hasSingle<T>(array: readonly T[]): array is [T] {
117
+ return array.length === 1;
118
+ }
119
+
82
120
  /**
83
121
  * Compares two sets using callbacks.
84
122
  * Early returns on first false comparison.