@fluidframework/tree 2.113.1 → 2.115.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 (660) hide show
  1. package/CHANGELOG.md +289 -0
  2. package/api-report/tree.alpha.api.md +127 -39
  3. package/dist/core/change-family/changeFamily.d.ts +15 -4
  4. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  5. package/dist/core/change-family/changeFamily.js.map +1 -1
  6. package/dist/core/change-family/editBuilder.d.ts +2 -3
  7. package/dist/core/change-family/editBuilder.d.ts.map +1 -1
  8. package/dist/core/change-family/editBuilder.js +1 -2
  9. package/dist/core/change-family/editBuilder.js.map +1 -1
  10. package/dist/core/change-family/index.d.ts +1 -1
  11. package/dist/core/change-family/index.d.ts.map +1 -1
  12. package/dist/core/change-family/index.js.map +1 -1
  13. package/dist/core/index.d.ts +4 -3
  14. package/dist/core/index.d.ts.map +1 -1
  15. package/dist/core/index.js +3 -2
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/core/rebase/index.d.ts +1 -1
  18. package/dist/core/rebase/index.d.ts.map +1 -1
  19. package/dist/core/rebase/index.js +2 -1
  20. package/dist/core/rebase/index.js.map +1 -1
  21. package/dist/core/rebase/types.d.ts +110 -0
  22. package/dist/core/rebase/types.d.ts.map +1 -1
  23. package/dist/core/rebase/types.js +47 -1
  24. package/dist/core/rebase/types.js.map +1 -1
  25. package/dist/core/tree/delta.d.ts +62 -16
  26. package/dist/core/tree/delta.d.ts.map +1 -1
  27. package/dist/core/tree/delta.js.map +1 -1
  28. package/dist/core/tree/detachedFieldIndex.d.ts +7 -13
  29. package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
  30. package/dist/core/tree/detachedFieldIndex.js +32 -46
  31. package/dist/core/tree/detachedFieldIndex.js.map +1 -1
  32. package/dist/core/tree/index.d.ts +1 -0
  33. package/dist/core/tree/index.d.ts.map +1 -1
  34. package/dist/core/tree/index.js.map +1 -1
  35. package/dist/core/tree/visitorUtils.d.ts +2 -4
  36. package/dist/core/tree/visitorUtils.d.ts.map +1 -1
  37. package/dist/core/tree/visitorUtils.js +2 -2
  38. package/dist/core/tree/visitorUtils.js.map +1 -1
  39. package/dist/entrypoints/alpha.d.ts +1 -1
  40. package/dist/entrypoints/alpha.d.ts.map +1 -1
  41. package/dist/entrypoints/alpha.js +8 -3
  42. package/dist/entrypoints/alpha.js.map +1 -1
  43. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  44. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  45. package/dist/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  46. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  47. package/dist/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  48. package/dist/feature-libraries/chunked-forest/uniformChunk.js +10 -2
  49. package/dist/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  50. package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts +51 -0
  51. package/dist/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -0
  52. package/dist/feature-libraries/comparison-forest/comparisonForest.js +98 -0
  53. package/dist/feature-libraries/comparison-forest/comparisonForest.js.map +1 -0
  54. package/dist/feature-libraries/comparison-forest/index.d.ts +6 -0
  55. package/dist/feature-libraries/comparison-forest/index.d.ts.map +1 -0
  56. package/dist/feature-libraries/comparison-forest/index.js +10 -0
  57. package/dist/feature-libraries/comparison-forest/index.js.map +1 -0
  58. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +8 -6
  59. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  60. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +6 -3
  61. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  62. package/dist/feature-libraries/default-schema/index.d.ts +1 -1
  63. package/dist/feature-libraries/default-schema/index.d.ts.map +1 -1
  64. package/dist/feature-libraries/default-schema/index.js.map +1 -1
  65. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts +2 -2
  66. package/dist/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  67. package/dist/feature-libraries/default-schema/noChangeCodecs.js +3 -1
  68. package/dist/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  69. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts +6 -3
  70. package/dist/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  71. package/dist/feature-libraries/detachedFieldIndexSummarizer.js +18 -6
  72. package/dist/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  73. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -3
  74. package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  75. package/dist/feature-libraries/forest-summary/forestSummarizer.js +2 -3
  76. package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  77. package/dist/feature-libraries/index.d.ts +4 -3
  78. package/dist/feature-libraries/index.d.ts.map +1 -1
  79. package/dist/feature-libraries/index.js +77 -72
  80. package/dist/feature-libraries/index.js.map +1 -1
  81. package/dist/feature-libraries/mitigatedChangeFamily.d.ts +1 -1
  82. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  83. package/dist/feature-libraries/mitigatedChangeFamily.js +12 -0
  84. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  85. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -1
  86. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  87. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  88. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts +2 -2
  89. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts.map +1 -1
  90. package/dist/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  91. package/dist/feature-libraries/modular-schema/index.d.ts +1 -1
  92. package/dist/feature-libraries/modular-schema/index.d.ts.map +1 -1
  93. package/dist/feature-libraries/modular-schema/index.js.map +1 -1
  94. package/dist/feature-libraries/modular-schema/invert.d.ts +15 -0
  95. package/dist/feature-libraries/modular-schema/invert.d.ts.map +1 -0
  96. package/dist/feature-libraries/modular-schema/invert.js +159 -0
  97. package/dist/feature-libraries/modular-schema/invert.js.map +1 -0
  98. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts +3 -4
  99. package/dist/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -1
  100. package/dist/feature-libraries/modular-schema/minimizeModularChange.js +2 -2
  101. package/dist/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -1
  102. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +9 -9
  103. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  104. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js +0 -2
  105. package/dist/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  106. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +2 -2
  107. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  108. package/dist/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  109. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  110. package/dist/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  111. package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  112. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +8 -22
  113. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  114. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +53 -406
  115. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  116. package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts +61 -0
  117. package/dist/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -0
  118. package/dist/feature-libraries/modular-schema/modularChangeUtils.js +205 -0
  119. package/dist/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -0
  120. package/dist/feature-libraries/modular-schema/prune.d.ts +10 -0
  121. package/dist/feature-libraries/modular-schema/prune.d.ts.map +1 -0
  122. package/dist/feature-libraries/modular-schema/prune.js +49 -0
  123. package/dist/feature-libraries/modular-schema/prune.js.map +1 -0
  124. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +2 -2
  125. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  126. package/dist/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  127. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts +2 -2
  128. package/dist/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  129. package/dist/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  130. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +2 -2
  131. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  132. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  133. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +2 -2
  134. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  135. package/dist/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  136. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +2 -2
  137. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  138. package/dist/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  139. package/dist/feature-libraries/treeTextCursor.d.ts +15 -0
  140. package/dist/feature-libraries/treeTextCursor.d.ts.map +1 -1
  141. package/dist/feature-libraries/treeTextCursor.js +64 -1
  142. package/dist/feature-libraries/treeTextCursor.js.map +1 -1
  143. package/dist/index.d.ts +6 -4
  144. package/dist/index.d.ts.map +1 -1
  145. package/dist/index.js +10 -5
  146. package/dist/index.js.map +1 -1
  147. package/dist/packageVersion.d.ts +1 -1
  148. package/dist/packageVersion.js +1 -1
  149. package/dist/packageVersion.js.map +1 -1
  150. package/dist/shared-tree/serializedChange.d.ts +2 -2
  151. package/dist/shared-tree/serializedChange.d.ts.map +1 -1
  152. package/dist/shared-tree/serializedChange.js.map +1 -1
  153. package/dist/shared-tree/sharedTree.d.ts +11 -3
  154. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  155. package/dist/shared-tree/sharedTree.js +9 -7
  156. package/dist/shared-tree/sharedTree.js.map +1 -1
  157. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
  158. package/dist/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  159. package/dist/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  160. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +41 -4
  161. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  162. package/dist/shared-tree/sharedTreeChangeFamily.js +57 -1
  163. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  164. package/dist/shared-tree/transactionMinimize.d.ts.map +1 -1
  165. package/dist/shared-tree/transactionMinimize.js +2 -2
  166. package/dist/shared-tree/transactionMinimize.js.map +1 -1
  167. package/dist/shared-tree/transactionPostProcessor.d.ts +2 -1
  168. package/dist/shared-tree/transactionPostProcessor.d.ts.map +1 -1
  169. package/dist/shared-tree/transactionPostProcessor.js.map +1 -1
  170. package/dist/shared-tree/treeCheckout.d.ts +13 -7
  171. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  172. package/dist/shared-tree/treeCheckout.js +59 -13
  173. package/dist/shared-tree/treeCheckout.js.map +1 -1
  174. package/dist/shared-tree-core/branch.d.ts +24 -9
  175. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  176. package/dist/shared-tree-core/branch.js +7 -0
  177. package/dist/shared-tree-core/branch.js.map +1 -1
  178. package/dist/shared-tree-core/editManager.d.ts +4 -4
  179. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  180. package/dist/shared-tree-core/editManager.js +2 -0
  181. package/dist/shared-tree-core/editManager.js.map +1 -1
  182. package/dist/shared-tree-core/editManagerCodecs.d.ts +3 -14
  183. package/dist/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  184. package/dist/shared-tree-core/editManagerCodecs.js.map +1 -1
  185. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts +11 -1
  186. package/dist/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  187. package/dist/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  188. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts +4 -11
  189. package/dist/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  190. package/dist/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  191. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +4 -11
  192. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  193. package/dist/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  194. package/dist/shared-tree-core/editManagerSummarizer.d.ts +4 -4
  195. package/dist/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  196. package/dist/shared-tree-core/editManagerSummarizer.js +0 -1
  197. package/dist/shared-tree-core/editManagerSummarizer.js.map +1 -1
  198. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  199. package/dist/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  200. package/dist/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  201. package/dist/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  202. package/dist/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  203. package/dist/shared-tree-core/messageCodecs.d.ts +8 -1
  204. package/dist/shared-tree-core/messageCodecs.d.ts.map +1 -1
  205. package/dist/shared-tree-core/messageCodecs.js.map +1 -1
  206. package/dist/shared-tree-core/sharedTreeCore.d.ts +5 -5
  207. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  208. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  209. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  210. package/dist/shared-tree-core/transaction.d.ts +10 -10
  211. package/dist/shared-tree-core/transaction.d.ts.map +1 -1
  212. package/dist/shared-tree-core/transaction.js +6 -3
  213. package/dist/shared-tree-core/transaction.js.map +1 -1
  214. package/dist/simple-tree/api/eraseSchemaDetails.d.ts +15 -0
  215. package/dist/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  216. package/dist/simple-tree/api/eraseSchemaDetails.js +15 -0
  217. package/dist/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  218. package/dist/simple-tree/api/index.d.ts +1 -1
  219. package/dist/simple-tree/api/index.d.ts.map +1 -1
  220. package/dist/simple-tree/api/index.js +2 -3
  221. package/dist/simple-tree/api/index.js.map +1 -1
  222. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  223. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  224. package/dist/simple-tree/api/schemaStatics.d.ts +6 -7
  225. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  226. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  227. package/dist/simple-tree/api/treeNodeApi.d.ts +20 -24
  228. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  229. package/dist/simple-tree/api/treeNodeApi.js +48 -49
  230. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  231. package/dist/simple-tree/core/treeNode.d.ts +5 -6
  232. package/dist/simple-tree/core/treeNode.d.ts.map +1 -1
  233. package/dist/simple-tree/core/treeNode.js +2 -4
  234. package/dist/simple-tree/core/treeNode.js.map +1 -1
  235. package/dist/simple-tree/core/withType.d.ts +20 -7
  236. package/dist/simple-tree/core/withType.d.ts.map +1 -1
  237. package/dist/simple-tree/core/withType.js +4 -7
  238. package/dist/simple-tree/core/withType.js.map +1 -1
  239. package/dist/simple-tree/index.d.ts +2 -2
  240. package/dist/simple-tree/index.d.ts.map +1 -1
  241. package/dist/simple-tree/index.js +3 -4
  242. package/dist/simple-tree/index.js.map +1 -1
  243. package/dist/simple-tree/leafNodeSchema.d.ts +6 -1
  244. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  245. package/dist/simple-tree/leafNodeSchema.js +0 -1
  246. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  247. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +53 -5
  248. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  249. package/dist/simple-tree/node-kinds/array/arrayNode.js +91 -10
  250. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  251. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +90 -0
  252. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  253. package/dist/simple-tree/node-kinds/map/mapNode.js +26 -1
  254. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  255. package/dist/simple-tree/node-kinds/object/objectNode.js +2 -2
  256. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  257. package/dist/simple-tree/node-kinds/record/recordNode.js +2 -2
  258. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  259. package/dist/text/codePointUtils.d.ts +2 -2
  260. package/dist/text/codePointUtils.js +2 -2
  261. package/dist/text/codePointUtils.js.map +1 -1
  262. package/dist/text/index.d.ts +3 -3
  263. package/dist/text/index.d.ts.map +1 -1
  264. package/dist/text/index.js +4 -4
  265. package/dist/text/index.js.map +1 -1
  266. package/dist/text/textDomain.d.ts +30 -18
  267. package/dist/text/textDomain.d.ts.map +1 -1
  268. package/dist/text/textDomain.js +44 -23
  269. package/dist/text/textDomain.js.map +1 -1
  270. package/dist/text/textDomainFormatted.d.ts +180 -82
  271. package/dist/text/textDomainFormatted.d.ts.map +1 -1
  272. package/dist/text/textDomainFormatted.js +164 -84
  273. package/dist/text/textDomainFormatted.js.map +1 -1
  274. package/dist/text/textDomainFormattedDefault.d.ts +48 -25
  275. package/dist/text/textDomainFormattedDefault.d.ts.map +1 -1
  276. package/dist/text/textDomainFormattedDefault.js +24 -19
  277. package/dist/text/textDomainFormattedDefault.js.map +1 -1
  278. package/dist/treeDataStore.d.ts +49 -0
  279. package/dist/treeDataStore.d.ts.map +1 -0
  280. package/dist/treeDataStore.js +57 -0
  281. package/dist/treeDataStore.js.map +1 -0
  282. package/dist/treeFactory.d.ts +8 -3
  283. package/dist/treeFactory.d.ts.map +1 -1
  284. package/dist/treeFactory.js +6 -1
  285. package/dist/treeFactory.js.map +1 -1
  286. package/dist/util/compressedIds.d.ts +22 -2
  287. package/dist/util/compressedIds.d.ts.map +1 -1
  288. package/dist/util/compressedIds.js +22 -1
  289. package/dist/util/compressedIds.js.map +1 -1
  290. package/lib/core/change-family/changeFamily.d.ts +15 -4
  291. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  292. package/lib/core/change-family/changeFamily.js.map +1 -1
  293. package/lib/core/change-family/editBuilder.d.ts +2 -3
  294. package/lib/core/change-family/editBuilder.d.ts.map +1 -1
  295. package/lib/core/change-family/editBuilder.js +1 -2
  296. package/lib/core/change-family/editBuilder.js.map +1 -1
  297. package/lib/core/change-family/index.d.ts +1 -1
  298. package/lib/core/change-family/index.d.ts.map +1 -1
  299. package/lib/core/change-family/index.js.map +1 -1
  300. package/lib/core/index.d.ts +4 -3
  301. package/lib/core/index.d.ts.map +1 -1
  302. package/lib/core/index.js +2 -2
  303. package/lib/core/index.js.map +1 -1
  304. package/lib/core/rebase/index.d.ts +1 -1
  305. package/lib/core/rebase/index.d.ts.map +1 -1
  306. package/lib/core/rebase/index.js +1 -1
  307. package/lib/core/rebase/index.js.map +1 -1
  308. package/lib/core/rebase/types.d.ts +110 -0
  309. package/lib/core/rebase/types.d.ts.map +1 -1
  310. package/lib/core/rebase/types.js +46 -0
  311. package/lib/core/rebase/types.js.map +1 -1
  312. package/lib/core/tree/delta.d.ts +62 -16
  313. package/lib/core/tree/delta.d.ts.map +1 -1
  314. package/lib/core/tree/delta.js.map +1 -1
  315. package/lib/core/tree/detachedFieldIndex.d.ts +7 -13
  316. package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
  317. package/lib/core/tree/detachedFieldIndex.js +7 -21
  318. package/lib/core/tree/detachedFieldIndex.js.map +1 -1
  319. package/lib/core/tree/index.d.ts +1 -0
  320. package/lib/core/tree/index.d.ts.map +1 -1
  321. package/lib/core/tree/index.js.map +1 -1
  322. package/lib/core/tree/visitorUtils.d.ts +2 -4
  323. package/lib/core/tree/visitorUtils.d.ts.map +1 -1
  324. package/lib/core/tree/visitorUtils.js +2 -2
  325. package/lib/core/tree/visitorUtils.js.map +1 -1
  326. package/lib/entrypoints/alpha.d.ts +1 -1
  327. package/lib/entrypoints/alpha.d.ts.map +1 -1
  328. package/lib/entrypoints/alpha.js +1 -1
  329. package/lib/entrypoints/alpha.js.map +1 -1
  330. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  331. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  332. package/lib/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  333. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  334. package/lib/feature-libraries/chunked-forest/uniformChunk.d.ts.map +1 -1
  335. package/lib/feature-libraries/chunked-forest/uniformChunk.js +10 -2
  336. package/lib/feature-libraries/chunked-forest/uniformChunk.js.map +1 -1
  337. package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts +51 -0
  338. package/lib/feature-libraries/comparison-forest/comparisonForest.d.ts.map +1 -0
  339. package/lib/feature-libraries/comparison-forest/comparisonForest.js +94 -0
  340. package/lib/feature-libraries/comparison-forest/comparisonForest.js.map +1 -0
  341. package/lib/feature-libraries/comparison-forest/index.d.ts +6 -0
  342. package/lib/feature-libraries/comparison-forest/index.d.ts.map +1 -0
  343. package/lib/feature-libraries/comparison-forest/index.js +6 -0
  344. package/lib/feature-libraries/comparison-forest/index.js.map +1 -0
  345. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +8 -6
  346. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  347. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +6 -3
  348. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  349. package/lib/feature-libraries/default-schema/index.d.ts +1 -1
  350. package/lib/feature-libraries/default-schema/index.d.ts.map +1 -1
  351. package/lib/feature-libraries/default-schema/index.js.map +1 -1
  352. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts +2 -2
  353. package/lib/feature-libraries/default-schema/noChangeCodecs.d.ts.map +1 -1
  354. package/lib/feature-libraries/default-schema/noChangeCodecs.js +3 -1
  355. package/lib/feature-libraries/default-schema/noChangeCodecs.js.map +1 -1
  356. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts +6 -3
  357. package/lib/feature-libraries/detachedFieldIndexSummarizer.d.ts.map +1 -1
  358. package/lib/feature-libraries/detachedFieldIndexSummarizer.js +16 -4
  359. package/lib/feature-libraries/detachedFieldIndexSummarizer.js.map +1 -1
  360. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts +2 -3
  361. package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
  362. package/lib/feature-libraries/forest-summary/forestSummarizer.js +2 -3
  363. package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
  364. package/lib/feature-libraries/index.d.ts +4 -3
  365. package/lib/feature-libraries/index.d.ts.map +1 -1
  366. package/lib/feature-libraries/index.js +2 -1
  367. package/lib/feature-libraries/index.js.map +1 -1
  368. package/lib/feature-libraries/mitigatedChangeFamily.d.ts +1 -1
  369. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  370. package/lib/feature-libraries/mitigatedChangeFamily.js +12 -0
  371. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  372. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +9 -1
  373. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  374. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  375. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts +2 -2
  376. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.d.ts.map +1 -1
  377. package/lib/feature-libraries/modular-schema/genericFieldKindCodecs.js.map +1 -1
  378. package/lib/feature-libraries/modular-schema/index.d.ts +1 -1
  379. package/lib/feature-libraries/modular-schema/index.d.ts.map +1 -1
  380. package/lib/feature-libraries/modular-schema/index.js.map +1 -1
  381. package/lib/feature-libraries/modular-schema/invert.d.ts +15 -0
  382. package/lib/feature-libraries/modular-schema/invert.d.ts.map +1 -0
  383. package/lib/feature-libraries/modular-schema/invert.js +155 -0
  384. package/lib/feature-libraries/modular-schema/invert.js.map +1 -0
  385. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts +3 -4
  386. package/lib/feature-libraries/modular-schema/minimizeModularChange.d.ts.map +1 -1
  387. package/lib/feature-libraries/modular-schema/minimizeModularChange.js +2 -2
  388. package/lib/feature-libraries/modular-schema/minimizeModularChange.js.map +1 -1
  389. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts +9 -9
  390. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.d.ts.map +1 -1
  391. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js +0 -2
  392. package/lib/feature-libraries/modular-schema/modularChangeCodecV1.js.map +1 -1
  393. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts +2 -2
  394. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.d.ts.map +1 -1
  395. package/lib/feature-libraries/modular-schema/modularChangeCodecV2.js.map +1 -1
  396. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts +2 -2
  397. package/lib/feature-libraries/modular-schema/modularChangeCodecs.d.ts.map +1 -1
  398. package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
  399. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +8 -22
  400. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  401. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +16 -367
  402. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  403. package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts +61 -0
  404. package/lib/feature-libraries/modular-schema/modularChangeUtils.d.ts.map +1 -0
  405. package/lib/feature-libraries/modular-schema/modularChangeUtils.js +192 -0
  406. package/lib/feature-libraries/modular-schema/modularChangeUtils.js.map +1 -0
  407. package/lib/feature-libraries/modular-schema/prune.d.ts +10 -0
  408. package/lib/feature-libraries/modular-schema/prune.d.ts.map +1 -0
  409. package/lib/feature-libraries/modular-schema/prune.js +45 -0
  410. package/lib/feature-libraries/modular-schema/prune.js.map +1 -0
  411. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts +2 -2
  412. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.d.ts.map +1 -1
  413. package/lib/feature-libraries/optional-field/optionalFieldCodecV2.js.map +1 -1
  414. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts +2 -2
  415. package/lib/feature-libraries/optional-field/optionalFieldCodecs.d.ts.map +1 -1
  416. package/lib/feature-libraries/optional-field/optionalFieldCodecs.js.map +1 -1
  417. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts +2 -2
  418. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.d.ts.map +1 -1
  419. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV2.js.map +1 -1
  420. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts +2 -2
  421. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.d.ts.map +1 -1
  422. package/lib/feature-libraries/sequence-field/sequenceFieldCodecV3.js.map +1 -1
  423. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts +2 -2
  424. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.d.ts.map +1 -1
  425. package/lib/feature-libraries/sequence-field/sequenceFieldCodecs.js.map +1 -1
  426. package/lib/feature-libraries/treeTextCursor.d.ts +15 -0
  427. package/lib/feature-libraries/treeTextCursor.d.ts.map +1 -1
  428. package/lib/feature-libraries/treeTextCursor.js +62 -1
  429. package/lib/feature-libraries/treeTextCursor.js.map +1 -1
  430. package/lib/index.d.ts +6 -4
  431. package/lib/index.d.ts.map +1 -1
  432. package/lib/index.js +4 -3
  433. package/lib/index.js.map +1 -1
  434. package/lib/packageVersion.d.ts +1 -1
  435. package/lib/packageVersion.js +1 -1
  436. package/lib/packageVersion.js.map +1 -1
  437. package/lib/shared-tree/serializedChange.d.ts +2 -2
  438. package/lib/shared-tree/serializedChange.d.ts.map +1 -1
  439. package/lib/shared-tree/serializedChange.js.map +1 -1
  440. package/lib/shared-tree/sharedTree.d.ts +11 -3
  441. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  442. package/lib/shared-tree/sharedTree.js +10 -8
  443. package/lib/shared-tree/sharedTree.js.map +1 -1
  444. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts +2 -2
  445. package/lib/shared-tree/sharedTreeChangeCodecs.d.ts.map +1 -1
  446. package/lib/shared-tree/sharedTreeChangeCodecs.js.map +1 -1
  447. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +41 -4
  448. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  449. package/lib/shared-tree/sharedTreeChangeFamily.js +55 -0
  450. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  451. package/lib/shared-tree/transactionMinimize.d.ts.map +1 -1
  452. package/lib/shared-tree/transactionMinimize.js +3 -3
  453. package/lib/shared-tree/transactionMinimize.js.map +1 -1
  454. package/lib/shared-tree/transactionPostProcessor.d.ts +2 -1
  455. package/lib/shared-tree/transactionPostProcessor.d.ts.map +1 -1
  456. package/lib/shared-tree/transactionPostProcessor.js.map +1 -1
  457. package/lib/shared-tree/treeCheckout.d.ts +13 -7
  458. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  459. package/lib/shared-tree/treeCheckout.js +61 -15
  460. package/lib/shared-tree/treeCheckout.js.map +1 -1
  461. package/lib/shared-tree-core/branch.d.ts +24 -9
  462. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  463. package/lib/shared-tree-core/branch.js +7 -0
  464. package/lib/shared-tree-core/branch.js.map +1 -1
  465. package/lib/shared-tree-core/editManager.d.ts +4 -4
  466. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  467. package/lib/shared-tree-core/editManager.js +2 -0
  468. package/lib/shared-tree-core/editManager.js.map +1 -1
  469. package/lib/shared-tree-core/editManagerCodecs.d.ts +3 -14
  470. package/lib/shared-tree-core/editManagerCodecs.d.ts.map +1 -1
  471. package/lib/shared-tree-core/editManagerCodecs.js.map +1 -1
  472. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts +11 -1
  473. package/lib/shared-tree-core/editManagerCodecsCommons.d.ts.map +1 -1
  474. package/lib/shared-tree-core/editManagerCodecsCommons.js.map +1 -1
  475. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts +4 -11
  476. package/lib/shared-tree-core/editManagerCodecsV1toV4.d.ts.map +1 -1
  477. package/lib/shared-tree-core/editManagerCodecsV1toV4.js +1 -1
  478. package/lib/shared-tree-core/editManagerCodecsV1toV4.js.map +1 -1
  479. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts +4 -11
  480. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.d.ts.map +1 -1
  481. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js +1 -1
  482. package/lib/shared-tree-core/editManagerCodecsVSharedBranches.js.map +1 -1
  483. package/lib/shared-tree-core/editManagerSummarizer.d.ts +4 -4
  484. package/lib/shared-tree-core/editManagerSummarizer.d.ts.map +1 -1
  485. package/lib/shared-tree-core/editManagerSummarizer.js +0 -1
  486. package/lib/shared-tree-core/editManagerSummarizer.js.map +1 -1
  487. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts +2 -2
  488. package/lib/shared-tree-core/messageCodecV1ToV4.d.ts.map +1 -1
  489. package/lib/shared-tree-core/messageCodecV1ToV4.js.map +1 -1
  490. package/lib/shared-tree-core/messageCodecVSharedBranches.d.ts.map +1 -1
  491. package/lib/shared-tree-core/messageCodecVSharedBranches.js.map +1 -1
  492. package/lib/shared-tree-core/messageCodecs.d.ts +8 -1
  493. package/lib/shared-tree-core/messageCodecs.d.ts.map +1 -1
  494. package/lib/shared-tree-core/messageCodecs.js.map +1 -1
  495. package/lib/shared-tree-core/sharedTreeCore.d.ts +5 -5
  496. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  497. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  498. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  499. package/lib/shared-tree-core/transaction.d.ts +10 -10
  500. package/lib/shared-tree-core/transaction.d.ts.map +1 -1
  501. package/lib/shared-tree-core/transaction.js +6 -3
  502. package/lib/shared-tree-core/transaction.js.map +1 -1
  503. package/lib/simple-tree/api/eraseSchemaDetails.d.ts +15 -0
  504. package/lib/simple-tree/api/eraseSchemaDetails.d.ts.map +1 -1
  505. package/lib/simple-tree/api/eraseSchemaDetails.js +15 -0
  506. package/lib/simple-tree/api/eraseSchemaDetails.js.map +1 -1
  507. package/lib/simple-tree/api/index.d.ts +1 -1
  508. package/lib/simple-tree/api/index.d.ts.map +1 -1
  509. package/lib/simple-tree/api/index.js +1 -1
  510. package/lib/simple-tree/api/index.js.map +1 -1
  511. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  512. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  513. package/lib/simple-tree/api/schemaStatics.d.ts +6 -7
  514. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  515. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  516. package/lib/simple-tree/api/treeNodeApi.d.ts +20 -24
  517. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  518. package/lib/simple-tree/api/treeNodeApi.js +46 -46
  519. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  520. package/lib/simple-tree/core/treeNode.d.ts +5 -6
  521. package/lib/simple-tree/core/treeNode.d.ts.map +1 -1
  522. package/lib/simple-tree/core/treeNode.js +2 -4
  523. package/lib/simple-tree/core/treeNode.js.map +1 -1
  524. package/lib/simple-tree/core/withType.d.ts +20 -7
  525. package/lib/simple-tree/core/withType.d.ts.map +1 -1
  526. package/lib/simple-tree/core/withType.js +4 -7
  527. package/lib/simple-tree/core/withType.js.map +1 -1
  528. package/lib/simple-tree/index.d.ts +2 -2
  529. package/lib/simple-tree/index.d.ts.map +1 -1
  530. package/lib/simple-tree/index.js +1 -1
  531. package/lib/simple-tree/index.js.map +1 -1
  532. package/lib/simple-tree/leafNodeSchema.d.ts +6 -1
  533. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  534. package/lib/simple-tree/leafNodeSchema.js +0 -1
  535. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  536. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +53 -5
  537. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  538. package/lib/simple-tree/node-kinds/array/arrayNode.js +93 -12
  539. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  540. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +90 -0
  541. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  542. package/lib/simple-tree/node-kinds/map/mapNode.js +27 -2
  543. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  544. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -3
  545. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  546. package/lib/simple-tree/node-kinds/record/recordNode.js +3 -3
  547. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  548. package/lib/text/codePointUtils.d.ts +2 -2
  549. package/lib/text/codePointUtils.js +2 -2
  550. package/lib/text/codePointUtils.js.map +1 -1
  551. package/lib/text/index.d.ts +3 -3
  552. package/lib/text/index.d.ts.map +1 -1
  553. package/lib/text/index.js +3 -3
  554. package/lib/text/index.js.map +1 -1
  555. package/lib/text/textDomain.d.ts +30 -18
  556. package/lib/text/textDomain.d.ts.map +1 -1
  557. package/lib/text/textDomain.js +41 -22
  558. package/lib/text/textDomain.js.map +1 -1
  559. package/lib/text/textDomainFormatted.d.ts +180 -82
  560. package/lib/text/textDomainFormatted.d.ts.map +1 -1
  561. package/lib/text/textDomainFormatted.js +165 -86
  562. package/lib/text/textDomainFormatted.js.map +1 -1
  563. package/lib/text/textDomainFormattedDefault.d.ts +48 -25
  564. package/lib/text/textDomainFormattedDefault.d.ts.map +1 -1
  565. package/lib/text/textDomainFormattedDefault.js +25 -20
  566. package/lib/text/textDomainFormattedDefault.js.map +1 -1
  567. package/lib/treeDataStore.d.ts +49 -0
  568. package/lib/treeDataStore.d.ts.map +1 -0
  569. package/lib/treeDataStore.js +52 -0
  570. package/lib/treeDataStore.js.map +1 -0
  571. package/lib/treeFactory.d.ts +8 -3
  572. package/lib/treeFactory.d.ts.map +1 -1
  573. package/lib/treeFactory.js +5 -0
  574. package/lib/treeFactory.js.map +1 -1
  575. package/lib/util/compressedIds.d.ts +22 -2
  576. package/lib/util/compressedIds.d.ts.map +1 -1
  577. package/lib/util/compressedIds.js +22 -1
  578. package/lib/util/compressedIds.js.map +1 -1
  579. package/package.json +32 -24
  580. package/src/core/change-family/changeFamily.ts +32 -4
  581. package/src/core/change-family/editBuilder.ts +1 -2
  582. package/src/core/change-family/index.ts +2 -0
  583. package/src/core/index.ts +11 -6
  584. package/src/core/rebase/index.ts +2 -0
  585. package/src/core/rebase/types.ts +113 -0
  586. package/src/core/tree/delta.ts +62 -16
  587. package/src/core/tree/detachedFieldIndex.ts +7 -38
  588. package/src/core/tree/index.ts +2 -0
  589. package/src/core/tree/visitorUtils.ts +3 -17
  590. package/src/entrypoints/alpha.ts +9 -1
  591. package/src/feature-libraries/chunked-forest/codec/codecs.ts +17 -14
  592. package/src/feature-libraries/chunked-forest/uniformChunk.ts +11 -1
  593. package/src/feature-libraries/comparison-forest/comparisonForest.ts +140 -0
  594. package/src/feature-libraries/comparison-forest/index.ts +6 -0
  595. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +20 -6
  596. package/src/feature-libraries/default-schema/index.ts +1 -0
  597. package/src/feature-libraries/default-schema/noChangeCodecs.ts +11 -3
  598. package/src/feature-libraries/detachedFieldIndexSummarizer.ts +33 -5
  599. package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -3
  600. package/src/feature-libraries/index.ts +5 -0
  601. package/src/feature-libraries/mitigatedChangeFamily.ts +21 -3
  602. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +10 -1
  603. package/src/feature-libraries/modular-schema/genericFieldKindCodecs.ts +9 -4
  604. package/src/feature-libraries/modular-schema/index.ts +1 -0
  605. package/src/feature-libraries/modular-schema/invert.ts +338 -0
  606. package/src/feature-libraries/modular-schema/minimizeModularChange.ts +3 -5
  607. package/src/feature-libraries/modular-schema/modularChangeCodecV1.ts +16 -13
  608. package/src/feature-libraries/modular-schema/modularChangeCodecV2.ts +3 -1
  609. package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +2 -1
  610. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +45 -644
  611. package/src/feature-libraries/modular-schema/modularChangeUtils.ts +340 -0
  612. package/src/feature-libraries/modular-schema/prune.ts +69 -0
  613. package/src/feature-libraries/optional-field/optionalFieldCodecV2.ts +4 -2
  614. package/src/feature-libraries/optional-field/optionalFieldCodecs.ts +5 -2
  615. package/src/feature-libraries/sequence-field/sequenceFieldCodecV2.ts +4 -2
  616. package/src/feature-libraries/sequence-field/sequenceFieldCodecV3.ts +4 -2
  617. package/src/feature-libraries/sequence-field/sequenceFieldCodecs.ts +6 -3
  618. package/src/feature-libraries/treeTextCursor.ts +66 -1
  619. package/src/index.ts +11 -4
  620. package/src/packageVersion.ts +1 -1
  621. package/src/shared-tree/serializedChange.ts +2 -2
  622. package/src/shared-tree/sharedTree.ts +40 -15
  623. package/src/shared-tree/sharedTreeChangeCodecs.ts +11 -3
  624. package/src/shared-tree/sharedTreeChangeFamily.ts +77 -2
  625. package/src/shared-tree/transactionMinimize.ts +7 -3
  626. package/src/shared-tree/transactionPostProcessor.ts +5 -1
  627. package/src/shared-tree/treeCheckout.ts +136 -30
  628. package/src/shared-tree-core/branch.ts +41 -12
  629. package/src/shared-tree-core/editManager.ts +46 -25
  630. package/src/shared-tree-core/editManagerCodecs.ts +9 -21
  631. package/src/shared-tree-core/editManagerCodecsCommons.ts +14 -2
  632. package/src/shared-tree-core/editManagerCodecsV1toV4.ts +18 -21
  633. package/src/shared-tree-core/editManagerCodecsVSharedBranches.ts +18 -20
  634. package/src/shared-tree-core/editManagerSummarizer.ts +9 -6
  635. package/src/shared-tree-core/messageCodecV1ToV4.ts +3 -3
  636. package/src/shared-tree-core/messageCodecVSharedBranches.ts +2 -2
  637. package/src/shared-tree-core/messageCodecs.ts +12 -2
  638. package/src/shared-tree-core/sharedTreeCore.ts +16 -7
  639. package/src/shared-tree-core/transaction.ts +47 -25
  640. package/src/simple-tree/api/eraseSchemaDetails.ts +15 -0
  641. package/src/simple-tree/api/index.ts +0 -1
  642. package/src/simple-tree/api/schemaStatics.ts +2 -2
  643. package/src/simple-tree/api/treeNodeApi.ts +64 -48
  644. package/src/simple-tree/core/treeNode.ts +13 -10
  645. package/src/simple-tree/core/withType.ts +20 -7
  646. package/src/simple-tree/index.ts +1 -2
  647. package/src/simple-tree/leafNodeSchema.ts +6 -1
  648. package/src/simple-tree/node-kinds/array/arrayNode.ts +130 -16
  649. package/src/simple-tree/node-kinds/map/mapNode.ts +137 -5
  650. package/src/simple-tree/node-kinds/object/objectNode.ts +3 -3
  651. package/src/simple-tree/node-kinds/record/recordNode.ts +3 -3
  652. package/src/text/README.md +1 -1
  653. package/src/text/codePointUtils.ts +2 -2
  654. package/src/text/index.ts +3 -3
  655. package/src/text/textDomain.ts +50 -27
  656. package/src/text/textDomainFormatted.ts +384 -163
  657. package/src/text/textDomainFormattedDefault.ts +32 -32
  658. package/src/treeDataStore.ts +125 -0
  659. package/src/treeFactory.ts +11 -3
  660. package/src/util/compressedIds.ts +36 -3
@@ -22,6 +22,7 @@ import {
22
22
  TreeArrayNode,
23
23
  TreeBeta,
24
24
  createCustomizedFluidFrameworkScopedFactory,
25
+ eraseSchemaDetails,
25
26
  isObjectNodeSchema,
26
27
  eraseSchemaDetailsSubclassable,
27
28
  } from "../simple-tree/index.js";
@@ -41,12 +42,19 @@ import type {
41
42
  ErasedNode,
42
43
  SchemaFactoryBeta,
43
44
  } from "../simple-tree/index.js";
44
- import { brand, mapIterable, validateIndex, validateIndexRange } from "../util/index.js";
45
+ import {
46
+ brand,
47
+ mapIterable,
48
+ oneFromIterable,
49
+ validateIndex,
50
+ validateIndexRange,
51
+ } from "../util/index.js";
45
52
 
46
53
  import {
47
54
  charactersFromString,
55
+ expensiveInternalValidationAssert,
48
56
  processCharactersChangedDelta,
49
- type TextAsTree,
57
+ type PlainText,
50
58
  } from "./textDomain.js";
51
59
 
52
60
  /**
@@ -67,20 +75,78 @@ const sfStatic = new SchemaFactoryAlpha("com.fluidframework.text.formatted");
67
75
 
68
76
  const formatKey: FieldKey = brand("format");
69
77
 
78
+ /**
79
+ * Atom in the string containing a single character.
80
+ * @privateRemarks
81
+ * This is outside the namespace so it can be exported for testing, but not package exported.
82
+ */
83
+ export class StringTextAtomNode
84
+ extends sfStatic.object("StringTextAtom", {
85
+ /**
86
+ * The underlying text content of this atom.
87
+ * @remarks
88
+ * This is typically a single Unicode code point, and thus may contain multiple UTF-16 surrogate pair code units.
89
+ * Longer strings are still valid. For example, users might store whole grapheme clusters here, or even longer sections of text.
90
+ * Anything combined into a single atom will be treated atomically, and can not be partially selected or formatted.
91
+ * Using larger atoms and splitting them as needed is NOT a recommended approach, since this will result in poor merge behavior for concurrent edits.
92
+ * Instead, atoms should always be the smallest unit of text which will be independently selected, moved or formatted.
93
+ * @privateRemarks
94
+ * This content logically represents the whole atom's content, so using {@link EmptyKey} makes sense to help indicate that.
95
+ */
96
+ content: SchemaFactory.required([SchemaFactory.string], { key: EmptyKey }),
97
+ })
98
+ implements FormattedText.TextAtom
99
+ {
100
+ public static fromCharacter(value: string): StringTextAtomNode {
101
+ const character = oneFromIterable(charactersFromString(value));
102
+ if (character === undefined) {
103
+ throw new UsageError("value must contain exactly one Unicode character.");
104
+ }
105
+ return new StringTextAtomNode({ content: character });
106
+ }
107
+
108
+ public static fromString(value: string): StringTextAtomNode[] {
109
+ return Array.from(
110
+ charactersFromString(value),
111
+ (character) => new StringTextAtomNode({ content: character }),
112
+ );
113
+ }
114
+ }
115
+
70
116
  /**
71
117
  * A collection of text related types, schema and utilities for working with text beyond the basic {@link SchemaStatics.string}.
118
+ *
72
119
  * @remarks
73
120
  * This is generic over formatting an embedded object/atom types.
74
- * See {@link FormattedTextAsTreeDefault} for a default parameterization.
121
+ *
75
122
  * @privateRemarks
123
+ * See {@link FormattedTextDefault} for an example parameterization.
124
+ *
76
125
  * TODO:
77
126
  * - Add more comprehensive tests for generic parameterizations other than default.
78
127
  * - Sort out API around overwriting subsets of formatting information.
79
- * @internal
128
+ * @alpha
80
129
  */
81
- export namespace FormattedTextAsTree {
130
+ export namespace FormattedText {
82
131
  /**
83
- * Factory for formatted text schema as a function of the formatting and the embedded object (atom) types.
132
+ * Creates a schema for a formatted text node, parameterized by the formatting and the embedded object (atom) types.
133
+ *
134
+ * @param inputSchemaFactory - The {@link SchemaFactoryBeta} used to scope the generated schema.
135
+ * The generated types are scoped under `com.fluidframework.text.formatted<TUserScope>`, where `TUserScope` is the scope of this factory.
136
+ * This scope is used to distinguish different usages of `createSchema` from each-other, and must be kept the same between versions for nodes to remain compatible.
137
+ * It must be different to distinguish different formatted text schema within the same document.
138
+ * @param formatSchema - Schema describing the formatting associated with each atom of text.
139
+ * Use an {@link NodeKind.Object|Object node} to support {@link FormattedText.Members.formatRange}.
140
+ * @param extraAtoms - Additional atom schema to allow as text content beyond the built-in {@link FormattedText.(StringTextAtom:variable)}.
141
+ * Use this to embed richer content (for example line breaks or inline objects) alongside plain characters.
142
+ * @param defaultFormatInsertable - The formatting applied to text inserted via non-formatted APIs
143
+ * (for example {@link FormattedText.Members.insertAt} and {@link FormattedText.Statics.fromString} when no explicit format is provided).
144
+ * @returns The schema for the formatted text node, whose nodes implement {@link FormattedText.Members} and whose statics implement {@link FormattedText.Statics}.
145
+ *
146
+ * @privateRemarks
147
+ * See {@link FormattedTextDefault} for an example parameterization of this factory.
148
+ *
149
+ * TODO: The choice to always include the built-in {@link FormattedText.(StringTextAtom:variable)} is a design decision that should be re-evaluated before stabilizing.
84
150
  */
85
151
  export function createSchema<
86
152
  const TUserScope extends string,
@@ -95,21 +161,60 @@ export namespace FormattedTextAsTree {
95
161
  defaultFormatInsertable: InsertableTreeFieldFromImplicitField<FormatSchema>,
96
162
  ): FormattedTextSchema<TUserScope, FormatSchema, ExtraAtomsSchema> {
97
163
  const atoms = [StringTextAtom, ...extraAtoms] as const;
164
+ /**
165
+ * The type of a text atom node, which goes in a StringAtom.
166
+ */
167
+ type TextAtomNode = TreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>;
98
168
 
99
169
  const sf = createFormattedScopedFactory(inputSchemaFactory);
170
+
171
+ const defaultFormat: TreeFieldFromImplicitField<FormatSchema> =
172
+ TreeBeta.create<FormatSchema>(formatSchema, defaultFormatInsertable);
173
+
174
+ /**
175
+ * Gets a format node, which must be cloned before being inserted.
176
+ */
177
+ function getFormatNode(
178
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
179
+ ): TreeFieldFromImplicitField<FormatSchema> {
180
+ // Note we cannot use the `format ?? defaultFormat` syntax as format is allowed to be `null`.
181
+ return format === undefined
182
+ ? defaultFormat
183
+ : TreeBeta.create<FormatSchema>(formatSchema, format);
184
+ }
185
+
186
+ function cloneFormat(
187
+ format: TreeFieldFromImplicitField<FormatSchema>,
188
+ ): TreeFieldFromImplicitField<FormatSchema> &
189
+ TreeNodeFromImplicitAllowedTypes<FormatSchema> {
190
+ const clone: TreeFieldFromImplicitField<FormatSchema> =
191
+ TreeBeta.clone<FormatSchema>(format);
192
+ // TypeScript fails to prove that cloning a node gives a node, and not possible undefined (like cloning a empty field could).
193
+ // This cast helps users of this function get the types they need.
194
+ return clone as typeof clone & TreeNodeFromImplicitAllowedTypes<FormatSchema>;
195
+ }
196
+
100
197
  class TextNode
101
198
  extends sf.object("Text", {
102
199
  content: SchemaFactory.required([() => StringArray], { key: EmptyKey }),
103
200
  })
104
- implements FormattedTextMembers<FormatSchema, ExtraAtomsSchema>
201
+ implements Members<FormatSchema, ExtraAtomsSchema>
105
202
  {
106
- public defaultFormat: TreeFieldFromImplicitField<FormatSchema> =
107
- TreeBeta.create<FormatSchema>(formatSchema, defaultFormatInsertable);
108
-
109
- public insertAt(index: number, additionalCharacters: string): void {
203
+ public insertAt(
204
+ index: number,
205
+ additionalCharacters:
206
+ | string
207
+ | Iterable<TreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>>,
208
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
209
+ ): void {
210
+ const newAtoms: Iterable<TextAtomNode> =
211
+ typeof additionalCharacters === "string"
212
+ ? stringTextAtomsFromString(additionalCharacters)
213
+ : additionalCharacters;
214
+ const formatNode = getFormatNode(format);
110
215
  this.content.insertAt(
111
216
  index,
112
- TreeArrayNode.spread(textAtomsFromString(additionalCharacters, this.defaultFormat)),
217
+ TreeArrayNode.spread(stringAtomsFromTextAtoms(newAtoms, formatNode)),
113
218
  );
114
219
  }
115
220
 
@@ -123,9 +228,9 @@ export namespace FormattedTextAsTree {
123
228
 
124
229
  public charactersCopy(): string[] {
125
230
  const result = this.content.charactersCopy();
126
- debugAssert(
231
+ expensiveInternalValidationAssert(
127
232
  () =>
128
- compareArrays(result, this.charactersCopy_reference()) ||
233
+ compareArrays(result, this.#charactersCopy_reference()) ||
129
234
  "invalid charactersCopy optimizations",
130
235
  );
131
236
  return result;
@@ -137,8 +242,8 @@ export namespace FormattedTextAsTree {
137
242
 
138
243
  public fullString(): string {
139
244
  const result = this.content.fullString();
140
- debugAssert(
141
- () => result === this.fullString_reference() || "invalid fullString optimizations",
245
+ expensiveInternalValidationAssert(
246
+ () => result === this.#fullString_reference() || "invalid fullString optimizations",
142
247
  );
143
248
  return result;
144
249
  }
@@ -146,31 +251,29 @@ export namespace FormattedTextAsTree {
146
251
  /**
147
252
  * A non-optimized reference implementation of fullString.
148
253
  */
149
- public fullString_reference(): string {
254
+ #fullString_reference(): string {
150
255
  return [...this.characters()].join("");
151
256
  }
152
257
 
153
258
  /**
154
259
  * Unoptimized trivially correct implementation of charactersCopy.
155
260
  */
156
- public charactersCopy_reference(): string[] {
261
+ #charactersCopy_reference(): string[] {
157
262
  return [...this.characters()];
158
263
  }
159
264
 
160
265
  public static fromString(
161
266
  value: string,
162
- format?: TreeFieldFromImplicitField<FormatSchema>,
267
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
163
268
  ): TextNode {
269
+ const formatNode = getFormatNode(format);
164
270
  // Use `this` rather than `TextNode` so the more derived schema class is constructed when using this as a static on a subclass.
165
271
  return new this({
166
272
  content: [
167
273
  // Constructing an ArrayNode from an iterator is supported, so creating an array from the iterable of characters seems like it's not necessary here,
168
274
  // but to reduce the risk of incorrect data interpretation, we actually ban this in the special case where the iterable is a string directly, which is the case here.
169
275
  // Thus the array construction here is necessary to avoid a runtime error.
170
- ...textAtomsFromString(
171
- value,
172
- format ?? TreeBeta.create<FormatSchema>(formatSchema, defaultFormatInsertable),
173
- ),
276
+ ...textAtomsFromString(value, formatNode),
174
277
  ],
175
278
  });
176
279
  }
@@ -190,21 +293,77 @@ export namespace FormattedTextAsTree {
190
293
  end: number | undefined,
191
294
  format: Partial<TreeNodeFromImplicitAllowedTypes<FormatSchema>>,
192
295
  ): void {
193
- const formatStart = start ?? 0;
194
- validateIndex(formatStart, this.content, "FormattedTextAsTree.formatRange", true);
195
-
196
- const formatEnd = Math.min(this.content.length, end ?? this.content.length);
197
- validateIndexRange(
198
- formatStart,
199
- formatEnd,
200
- this.content,
201
- "FormattedTextAsTree.formatRange",
202
- );
203
-
204
- const fieldFormats = Object.entries(format) as [
296
+ const fieldFormatsRaw = Object.entries(format) as [
205
297
  keyof TreeNodeFromImplicitAllowedTypes<FormatSchema>,
206
298
  unknown,
207
299
  ][];
300
+ const fieldFormats = fieldFormatsRaw.map(([key, value]) => {
301
+ // Object.entries should only return string keyed enumerable own properties.
302
+ // The TypeScript typing does not account for this, and thus this assertion is necessary for this code to compile.
303
+ assert(
304
+ typeof key === "string",
305
+ 0xcc8 /* Object.entries returned a non-string key. */,
306
+ );
307
+ return [key, value] as const;
308
+ });
309
+ this.#editRange(start, end, "FormattedText.formatRange", (atom) => {
310
+ const formatNode: TreeNode | TreeValue = atom.format;
311
+ const atomFormatSchema = TreeStatic.schema(formatNode);
312
+ if (!isObjectNodeSchema(atomFormatSchema)) {
313
+ throw new UsageError(
314
+ "formatRange currently only supports object nodes for the format.",
315
+ );
316
+ }
317
+ for (const [key, value] of fieldFormats) {
318
+ const field = atomFormatSchema.fields.get(key);
319
+ if (field === undefined) {
320
+ throw new UsageError(`Unknown format key: ${key}`);
321
+ }
322
+
323
+ // Ensures that if the input is a node, it is cloned before being inserted into the tree.
324
+ // Note that since this uses field schema, `undefined` can pass through this if allowed by the schema.
325
+ const clonedValue = TreeBeta.clone(TreeBeta.create(field, value as never)) as
326
+ | TreeNode
327
+ | TreeValue;
328
+
329
+ (
330
+ formatNode as unknown as Record<
331
+ keyof TreeNodeFromImplicitAllowedTypes<FormatSchema>,
332
+ TreeNode | TreeValue
333
+ >
334
+ )[key] = clonedValue;
335
+ }
336
+ });
337
+ }
338
+
339
+ public reformat(
340
+ start: number | undefined,
341
+ end: number | undefined,
342
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
343
+ ): void {
344
+ const node = getFormatNode(format);
345
+ this.#editRange(start, end, "FormattedText.reformat", (atom) => {
346
+ atom.format = cloneFormat(node);
347
+ });
348
+ }
349
+
350
+ /**
351
+ * Map an edit over a range of atoms, validating the range and running the edits in a transaction.
352
+ * @remarks
353
+ * This is not exposed in the API since this approach will have to be replaced when formatting is optimized,
354
+ * so we don't want users to directly depend on this un-optimizable layer.
355
+ */
356
+ #editRange(
357
+ start: number | undefined,
358
+ end: number | undefined,
359
+ method: string,
360
+ edit: (atom: StringAtom) => void,
361
+ ): void {
362
+ const formatStart = start ?? 0;
363
+ validateIndex(formatStart, this.content, method, true);
364
+
365
+ const formatEnd = Math.min(this.content.length, end ?? this.content.length);
366
+ validateIndexRange(formatStart, formatEnd, this.content, method);
208
367
 
209
368
  TreeAlpha.context(this).runTransaction(() => {
210
369
  for (let i = formatStart; i < formatEnd; i++) {
@@ -214,45 +373,13 @@ export namespace FormattedTextAsTree {
214
373
  atom !== undefined,
215
374
  0xd08 /* Index out of bounds while formatting text range. */,
216
375
  );
217
- const formatNode: TreeNode | TreeValue = atom.format;
218
- const atomFormatSchema = TreeStatic.schema(formatNode);
219
- if (!isObjectNodeSchema(atomFormatSchema)) {
220
- // TODO: redesign this API to work with all allowed FormatSchema types.
221
- throw new UsageError(
222
- "formatRange currently only supports object nodes for the format.",
223
- );
224
- }
225
- for (const [key, value] of fieldFormats) {
226
- // Object.entries should only return string keyed enumerable own properties.
227
- // The TypeScript typing does not account for this, and thus this assertion is necessary for this code to compile.
228
- assert(
229
- typeof key === "string",
230
- 0xcc8 /* Object.entries returned a non-string key. */,
231
- );
232
-
233
- const field = atomFormatSchema.fields.get(key);
234
- if (field === undefined) {
235
- throw new UsageError(`Unknown format key: ${key}`);
236
- }
237
-
238
- // Ensures that if the input is a node, it is cloned before being inserted into the tree.
239
- const clonedValue = TreeBeta.clone(TreeBeta.create(field, value as never)) as
240
- | TreeNode
241
- | TreeValue;
242
-
243
- (
244
- formatNode as unknown as Record<
245
- keyof TreeNodeFromImplicitAllowedTypes<FormatSchema>,
246
- TreeNode | TreeValue
247
- >
248
- )[key] = clonedValue;
249
- }
376
+ edit(atom);
250
377
  }
251
378
  });
252
379
  }
253
380
 
254
381
  /**
255
- * Returns the {@link FormattedTextAsTree.TextAtom.content} at the given atom index, or `undefined` if out of bounds.
382
+ * Returns the {@link FormattedText.TextAtom.content} at the given atom index, or `undefined` if out of bounds.
256
383
  */
257
384
  private getAtomCharacterAt(index: number): string | undefined {
258
385
  const atom = this.content[index];
@@ -261,7 +388,7 @@ export namespace FormattedTextAsTree {
261
388
  }
262
389
 
263
390
  public onCharactersChanged(
264
- callback: (ops: readonly TextAsTree.TextOp[] | undefined) => void,
391
+ callback: (ops: readonly PlainText.TextOp[] | undefined) => void,
265
392
  ): () => void {
266
393
  return TreeAlpha.on(this.content, "nodeChanged", ({ delta }) =>
267
394
  processCharactersChangedDelta(
@@ -273,7 +400,7 @@ export namespace FormattedTextAsTree {
273
400
  }
274
401
 
275
402
  public onContentChanged(
276
- callback: (ops: readonly TextAsTree.TextOp[] | undefined) => void,
403
+ callback: (ops: readonly PlainText.TextOp[] | undefined) => void,
277
404
  ): () => void {
278
405
  return TreeAlpha.on(this.content, "treeChanged", ({ delta }) =>
279
406
  processCharactersChangedDelta(
@@ -293,21 +420,36 @@ export namespace FormattedTextAsTree {
293
420
  }
294
421
  }
295
422
 
296
- function textAtomsFromString(
423
+ function stringTextAtomsFromString(
297
424
  value: string,
425
+ ): Iterable<StringTextAtom & TextAtomNode> {
426
+ // TypeScript can't prove in this Generic context that StringTextAtom is assignable to TextAtomNode, so we have to cast.
427
+ // Since TextAtomSchemas unconditionally includes StringTextAtom, this cast is safe.
428
+ return StringTextAtom.fromString(value) as (StringTextAtom & TextAtomNode)[];
429
+ }
430
+
431
+ function stringAtomsFromTextAtoms(
432
+ value: Iterable<TreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>>,
298
433
  format: TreeFieldFromImplicitField<FormatSchema>,
299
434
  ): Iterable<StringAtom> {
300
- const result = mapIterable(charactersFromString(value), (char) => {
301
- const textAtom = new StringTextAtom({ content: char });
435
+ const result = mapIterable(value, (content) => {
302
436
  const data = {
303
- content: textAtom,
304
- format: TreeBeta.clone<FormatSchema>(format),
437
+ content,
438
+ format: cloneFormat(format),
305
439
  };
306
440
  return new StringAtom(data as never); // Generic break type safety here. TODO: try and make safer.
307
441
  });
308
442
  return result;
309
443
  }
310
444
 
445
+ function textAtomsFromString(
446
+ value: string,
447
+ format: TreeFieldFromImplicitField<FormatSchema>,
448
+ ): Iterable<StringAtom> {
449
+ const textAtoms = stringTextAtomsFromString(value);
450
+ return stringAtomsFromTextAtoms(textAtoms, format);
451
+ }
452
+
311
453
  class StringArray extends sf.array("StringArray", [() => StringAtom]) {
312
454
  public withBorrowedSequenceCursor<T>(f: (cursor: ITreeCursorSynchronous) => T): T {
313
455
  const innerNode = getInnerNode(this);
@@ -349,7 +491,7 @@ export namespace FormattedTextAsTree {
349
491
  // TODO: we could optimize this for constant cases via an optional symbol on the atom schema holding the constant.
350
492
  // A less general optimization could just include cases for build in types with constant values
351
493
  // (like below commented code: currently this would cause a cyclical dependency but could be refactored).
352
- // case FormattedTextAsTree.StringLineAtom.identifier: {
494
+ // case FormattedText.StringLineAtom.identifier: {
353
495
  // content = "\n";
354
496
  // break;
355
497
  // }
@@ -386,12 +528,12 @@ export namespace FormattedTextAsTree {
386
528
  }
387
529
 
388
530
  public getString(startIndex: number, endIndex: number = this.length): string {
389
- validateIndexRange(startIndex, endIndex, this, "FormattedTextAsTree.getString");
531
+ validateIndexRange(startIndex, endIndex, this, "FormattedText.getString");
390
532
  return this.getCharactersSubarray(startIndex, endIndex).join("");
391
533
  }
392
534
 
393
535
  public getUniformRun(startIndex: number, endIndex: number = this.length): number {
394
- validateIndexRange(startIndex, endIndex, this, "FormattedTextAsTree.getUniformRun");
536
+ validateIndexRange(startIndex, endIndex, this, "FormattedText.getUniformRun");
395
537
  if (endIndex === startIndex) {
396
538
  throw new UsageError("endIndex must be greater than startIndex for getUniformRun.");
397
539
  }
@@ -464,15 +606,21 @@ export namespace FormattedTextAsTree {
464
606
  /**
465
607
  * Schema for a text node.
466
608
  * @remarks
467
- * See {@link FormattedTextAsTree.Members} for the API.
468
- * See {@link FormattedTextAsTree.Statics} for static APIs on this Schema, including construction.
609
+ * See {@link FormattedText.Members} for the API.
610
+ * See {@link FormattedText.Statics} for static APIs on this Schema, including construction.
611
+ * @privateRemarks
612
+ * eraseSchemaDetailsSubclassable risks user's defining subclass members which collide with internals.
613
+ * Ideally we would generate private members for non-public properties, but TypeScript does not support this.
614
+ * It is up to the user of eraseSchemaDetailsSubclassable to manage this risk.
615
+ *
616
+ * TODO: there is at least one collision prone member to worry about here: `content`.
469
617
  */
470
618
  const Tree = eraseSchemaDetailsSubclassable<
471
- FormattedTextMembers<FormatSchema, ExtraAtomsSchema>,
472
- Statics<Tree>
619
+ Members<FormatSchema, ExtraAtomsSchema>,
620
+ Statics<Tree, FormatSchema>
473
621
  >()(TextNode);
474
622
  type Tree = ErasedNode<
475
- FormattedTextMembers<FormatSchema, ExtraAtomsSchema>,
623
+ Members<FormatSchema, ExtraAtomsSchema>,
476
624
  FormattedTextSchemaIdentifier<TUserScope>
477
625
  >;
478
626
 
@@ -481,17 +629,31 @@ export namespace FormattedTextAsTree {
481
629
 
482
630
  /**
483
631
  * Portion of a string with formatting.
632
+ * @privateRemarks
633
+ * This is implemented {@link StringAtom}, but we avoid leaking the fact this is a TreeNode in the API surface to
634
+ * preserve more future flexibility.
484
635
  * @sealed
485
- * @internal
636
+ * @alpha
486
637
  */
487
638
  export interface FormattedAtom<TFormat, TText> {
639
+ /**
640
+ * Content which is formatted.
641
+ */
488
642
  readonly content: TText;
643
+ /**
644
+ * Formatting which is applied to the content.
645
+ * @remarks
646
+ * Can be reassigned or deeply mutated to edit the formatting of the content.
647
+ */
489
648
  format: TFormat;
490
649
  }
491
650
 
492
651
  /**
493
652
  * Portion of a string.
494
- * @internal
653
+ * @remarks
654
+ * Additional kinds of text atoms (also known as embedded objects) which can occur inside a string can implement this.
655
+ * The schema for them can then be provided to {@link FormattedText.createSchema}.
656
+ * @alpha
495
657
  */
496
658
  export interface TextAtom {
497
659
  /**
@@ -501,36 +663,61 @@ export namespace FormattedTextAsTree {
501
663
  }
502
664
 
503
665
  /**
504
- * Unit in the string representing a single character.
505
- * @internal
666
+ * Static factory functions for {@link FormattedText.(StringTextAtom:variable)}.
667
+ * @privateRemarks
668
+ * We type-erase `StringTextAtom` and only provide these static factories for construction
669
+ * to reduce the chance of someone accidentally creating a text atom for a string other than a single unicode code point.
670
+ * Other strings should work, but our intention is to provide no type-safe API which can produce them, so an application can take their lack of existence as an invariant if they want.
671
+ * It is still however possible to produce them, like export/import round trips with editing in the middle of the process, or collaboration with an equivalent schema which doesn't enforce this invariant.
672
+ * @sealed
673
+ * @alpha
506
674
  */
507
- export class StringTextAtom
508
- extends sfStatic.object("StringTextAtom", {
509
- /**
510
- * The underlying text content of this atom.
511
- * @remarks
512
- * This is typically a single Unicode code point, and thus may contain multiple UTF-16 surrogate pair code units.
513
- * Using longer strings is still valid. For example, so users might store whole grapheme clusters here, or even longer sections of text.
514
- * Anything combined into a single atom will be treated atomically, and can not be partially selected or formatted.
515
- * Using larger atoms and splitting them as needed is NOT a recommended approach, since this will result in poor merge behavior for concurrent edits.
516
- * Instead atoms should always be the smallest unit of text which will be independently selected, moved or formatted.
517
- * @privateRemarks
518
- * This content logically represents the whole atom's content, so using {@link EmptyKey} makes sense to help indicate that.
519
- */
520
- content: SchemaFactory.required([SchemaFactory.string], { key: EmptyKey }),
521
- })
522
- implements TextAtom {}
675
+ export interface StringTextAtomStatics {
676
+ /**
677
+ * Creates an atom from exactly one Unicode code point.
678
+ * @throws A {@link @fluidframework/telemetry-utils#UsageError} if `value` does not contain exactly one Unicode code character.
679
+ */
680
+ fromCharacter(value: string): StringTextAtom;
681
+
682
+ /**
683
+ * Creates one atom for each Unicode code point in `value`.
684
+ */
685
+ fromString(value: string): StringTextAtom[];
686
+ }
687
+
688
+ /**
689
+ * Schema for a {@link FormattedText.(StringTextAtom:variable)} node.
690
+ * @sealed
691
+ * @alpha
692
+ */
693
+ export const StringTextAtom = eraseSchemaDetails<TextAtom, StringTextAtomStatics>()(
694
+ StringTextAtomNode,
695
+ );
696
+
697
+ /**
698
+ * Node for the {@link FormattedText.(StringTextAtom:variable)} schema.
699
+ * @sealed
700
+ * @alpha
701
+ */
702
+ export type StringTextAtom = ErasedNode<
703
+ TextAtom,
704
+ "com.fluidframework.text.formatted.StringTextAtom"
705
+ >;
523
706
 
524
707
  /**
525
- * Statics for text nodes.
526
- * @internal
708
+ * Statics for formatted text nodes.
709
+ * @sealed
710
+ * @alpha
527
711
  */
528
- export interface Statics<TTree> {
712
+ export interface Statics<TTree, FormatSchema extends ImplicitAllowedTypes> {
529
713
  /**
530
714
  * Construct a node of `this` schema from a string, where each character (as defined by iterating over the string) becomes a single character in the text node.
531
715
  * @remarks This combines pairs of utf-16 surrogate code units into single characters as appropriate.
532
716
  */
533
- fromString(value: string): TTree;
717
+ fromString(
718
+ value: string,
719
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
720
+ ): TTree;
534
721
  }
535
722
 
536
723
  /**
@@ -546,37 +733,55 @@ export namespace FormattedTextAsTree {
546
733
  * (which often operates on something in between unicode code points and grapheme clusters)
547
734
  * and navigation/selection (which typically uses grapheme clusters).
548
735
  *
549
- * @see {@link FormattedTextAsTree.Statics.fromString} for construction.
550
- * @see {@link FormattedTextAsTree.createSchema} for creating schemas whose nodes implement this.
551
- * @internal
736
+ * @see {@link FormattedText.Statics.fromString} for construction.
737
+ * @see {@link FormattedText.createSchema} for creating schemas whose nodes implement this.
738
+ * @sealed
739
+ * @alpha
552
740
  */
553
- export interface Members<TFormatTree, TPartialFormat, TFormattedAtom, TFormattedInsert>
554
- extends TextAsTree.Members {
741
+ export interface Members<
742
+ FormatSchema extends ImplicitAllowedTypes,
743
+ ExtraAtomsSchema extends readonly LazyItem<
744
+ TreeNodeSchema<string, NodeKind, TextAtom & TreeNode>
745
+ >[],
746
+ > extends PlainText.Members {
555
747
  /**
556
- * Format to use by default for text inserted with non-formatted APIs.
748
+ * {@link PlainText.Members.insertAt} with optional formatting to apply to all additional characters,
749
+ * and allowing an array of atoms instead of a string.
750
+ * @param format - Optional formatting to apply to all additional characters. If not specified, the default formatting (from {@link FormattedText.createSchema}) will be used.
557
751
  * @remarks
558
- * This is not persisted in the tree, and observation of it is not tracked by the tree observation tracking.
559
- * @privateRemarks
560
- * Opt this into observation tracking.
752
+ * Use {@link FormattedText.Members.insertWithFormattingAt} if you need to specify formatting for atom independently.
753
+ * @override
561
754
  */
562
- defaultFormat: TFormatTree;
755
+ insertAt(
756
+ index: number,
757
+ additionalCharacters:
758
+ | string
759
+ | Iterable<TreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>>,
760
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
761
+ ): void;
563
762
 
564
763
  /**
565
764
  * Gets an array type view of the characters currently in the text.
566
765
  * @remarks
567
766
  * This iterator matches the behavior of {@link (TreeArrayNode:interface)} with respect to edits during iteration.
767
+ *
768
+ * For more efficient access, use {@link FormattedText.Members.getUniformRun} and {@link FormattedText.Members.getString} to access ranges of characters
769
+ * to avoid having to inspect the formatting on every atom.
568
770
  * @privateRemarks
569
771
  * Currently this is implemented by a node and changes with the text over time.
570
772
  * We might not want to leak a node like this in the API.
571
773
  * Providing a way to index and iterate separately might be better.
572
774
  */
573
- charactersWithFormatting(): readonly TFormattedAtom[];
775
+ charactersWithFormatting(): readonly FormattedAtom<
776
+ TreeNodeFromImplicitAllowedTypes<FormatSchema>,
777
+ TreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>
778
+ >[];
574
779
 
575
780
  /**
576
781
  * Insert a range of characters into the string based on character index.
577
782
  * @remarks
578
783
  * See {@link (TreeArrayNode:interface).insertAt} for more details on the behavior.
579
- * See {@link FormattedTextAsTree.Statics.fromString} for how the `additionalCharacters` string is broken into characters.
784
+ * See {@link FormattedText.Statics.fromString} for how the `additionalCharacters` string is broken into characters.
580
785
  * @privateRemarks
581
786
  * If we provide ways to customize character boundaries, that could be handled here by taking in an Iterable<string> instead of a string.
582
787
  * Doing this currently would enable insertion of text with different character boundaries than the existing text,
@@ -587,7 +792,12 @@ export namespace FormattedTextAsTree {
587
792
  */
588
793
  insertWithFormattingAt(
589
794
  index: number,
590
- additionalCharacters: Iterable<TFormattedInsert>,
795
+ additionalCharacters: Iterable<
796
+ FormattedAtomInsertable<
797
+ InsertableTreeNodeFromImplicitAllowedTypes<FormatSchema>,
798
+ InsertableTreeNodeFromImplicitAllowedTypes<TextAtomSchemas<ExtraAtomsSchema>>
799
+ >
800
+ >,
591
801
  ): void;
592
802
 
593
803
  /**
@@ -595,13 +805,44 @@ export namespace FormattedTextAsTree {
595
805
  * @param startIndex - The starting index (inclusive) of the range to format.
596
806
  * @param endIndex - The ending index (exclusive) of the range to format.
597
807
  * @param format - The formatting to apply to the specified range.
808
+ * For each atom, every property of `format` will be cloned and assigned to the atom's format's corresponding subtree, overwriting any existing values for those properties.
809
+ * All enumerable own properties of `format` will be applied, including those with `undefined` values.
598
810
  * @remarks
599
811
  * The start and end behave the same as in {@link (TreeArrayNode:interface).removeRange}.
812
+ * This edits existing formatting subtrees on each atom, and only works when those atoms are object nodes.
813
+ *
814
+ * This is typically used to set some formatting property, like `bold` on a range of text without impacting other formatting properties.
815
+ * @privateRemarks
816
+ * This API is designed such that it can be optimized and improved in the future in a few different ways:
817
+ * 1. TODO: It can be optimized to use lower level APIs directly, bypassing the overhead of the public API surface.
818
+ * 2. TODO: A lower level editing API could be introduced and used to more efficiently express the edit (for example a bulk edit based on path, or a way to reuse the inserted content in multiple places instead of having to clone it before making the edit).
819
+ * 3. TODO: Optimize the encoding of such edits, either with a dedicated format for range edits like this and/or encoding optimizations that can compress such edits over ranges to O(1) space.
820
+ * 4. TODO: Preserve the range editing semantics through the whole stack to allow for better merge behavior, and make optimizations easier.
600
821
  */
601
822
  formatRange(
602
823
  startIndex: number | undefined,
603
824
  endIndex: number | undefined,
604
- format: TPartialFormat,
825
+ format: Partial<TreeNodeFromImplicitAllowedTypes<FormatSchema>>,
826
+ ): void;
827
+
828
+ /**
829
+ * Replace formatting of a range of characters based on character index.
830
+ * @param startIndex - The starting index (inclusive) of the range to format.
831
+ * @param endIndex - The ending index (exclusive) of the range to format.
832
+ * @param format - The formatting to replace the formatting of the indicated range with.
833
+ * For each atom, `format` will be cloned and assigned to the atom's format, overwriting any existing formatting.
834
+ * If not specified the `defaultFormat` from {@link FormattedText.createSchema} will be used.
835
+ * @remarks
836
+ * The start and end behave the same as in {@link (TreeArrayNode:interface).removeRange}.
837
+ *
838
+ * This is typically used to normalize formatting, like resetting the formatting of a range to default settings.
839
+ * @privateRemarks
840
+ * See notes on {@link FormattedText.Members.formatRange} for future optimization opportunities.
841
+ */
842
+ reformat(
843
+ startIndex?: number | undefined,
844
+ endIndex?: number | undefined,
845
+ format?: InsertableTreeFieldFromImplicitField<FormatSchema>,
605
846
  ): void;
606
847
 
607
848
  /**
@@ -620,14 +861,14 @@ export namespace FormattedTextAsTree {
620
861
  /**
621
862
  * Subscribe to all content changes on this text node, including both shallow
622
863
  * changes (inserts/removes) and deep changes (formatting updates on existing characters).
623
- * @param callback - Called after each change with a sequence of {@link TextAsTree.TextOp}s describing what changed,
864
+ * @param callback - Called after each change with a sequence of {@link PlainText.TextOp}s describing what changed,
624
865
  * or `undefined` when a delta could not be computed (e.g. during a schema upgrade).
625
866
  * @returns A cleanup function that unsubscribes the callback when called.
626
867
  * @remarks
627
- * Unlike {@link TextAsTree.Members.onCharactersChanged} which only fires on
868
+ * Unlike {@link PlainText.Members.onCharactersChanged} which only fires on
628
869
  * shallow changes (inserts and removes), this method also fires on deep changes —
629
870
  * formatting property updates on existing characters.
630
- * The {@link TextAsTree.TextRetainOp.formattingChanged} flag on retain ops
871
+ * The {@link PlainText.TextRetainOp.formattingChanged} flag on retain ops
631
872
  * indicates which character ranges had formatting updates.
632
873
  *
633
874
  * All counts in the delivered ops are in Unicode code points, not UTF-16 code units.
@@ -635,13 +876,14 @@ export namespace FormattedTextAsTree {
635
876
  * corresponds to two UTF-16 code units — convert before using the counts as string indices.
636
877
  */
637
878
  onContentChanged(
638
- callback: (ops: readonly TextAsTree.TextOp[] | undefined) => void,
879
+ callback: (ops: readonly PlainText.TextOp[] | undefined) => void,
639
880
  ): () => void;
640
881
  }
641
882
 
642
883
  /**
643
- * Insertable shape for a formatted text atom used by {@link FormattedTextAsTree.Members.insertWithFormattingAt}.
644
- * @internal
884
+ * Insertable shape for a formatted text atom used by {@link FormattedText.Members.insertWithFormattingAt}.
885
+ * @input
886
+ * @alpha
645
887
  */
646
888
  export interface FormattedAtomInsertable<TFormat, TContent> {
647
889
  readonly content: TContent;
@@ -652,7 +894,7 @@ export namespace FormattedTextAsTree {
652
894
  * Schema identifier for the a generic formatted text schema.
653
895
  * @privateRemarks
654
896
  * Eventually this should probably be given a better name and/or made a system type in a system namespace.
655
- * @internal
897
+ * @alpha
656
898
  */
657
899
  export type FormattedTextSchemaIdentifier<TUserScope extends string> = ScopedSchemaName<
658
900
  `com.fluidframework.text.formatted<${TUserScope}>`,
@@ -660,45 +902,23 @@ export namespace FormattedTextAsTree {
660
902
  >;
661
903
 
662
904
  /**
663
- * Helper for expressing the full set of formatted text atoms for a given schema.
664
- * @privateRemarks
665
- * Eventually this should probably be given a better name and/or made a system type in a system namespace.
666
- * @internal
905
+ * Helper for expressing the full set of text atoms for a given schema.
906
+ * @remarks
907
+ * This is just schema for the text atom {@link AllowedTypes},
908
+ * and does not include the actual formatting (which is higher up in the tree).
909
+ * @sealed
910
+ * @alpha
667
911
  */
668
- export type FormattedTextAtoms<
912
+ export type TextAtomSchemas<
669
913
  ExtraAtomsSchema extends readonly LazyItem<
670
914
  TreeNodeSchema<string, NodeKind, TextAtom & TreeNode>
671
915
  >[],
672
916
  > = readonly [typeof StringTextAtom, ...ExtraAtomsSchema];
673
917
 
674
- /**
675
- * Helper for configuring {@link FormattedTextAsTree.Members}.
676
- * @privateRemarks
677
- * Eventually this should probably be inlined into `FormattedTextAsTree.Members` or made a system type in a system namespace.
678
- * The approach should be evaluated after settling on a redesign of the `formatRange` API as that will impact what the type parameters are.
679
- * @internal
680
- */
681
- export type FormattedTextMembers<
682
- FormatSchema extends ImplicitAllowedTypes,
683
- ExtraAtomsSchema extends readonly LazyItem<
684
- TreeNodeSchema<string, NodeKind, TextAtom & TreeNode>
685
- >[],
686
- > = Members<
687
- TreeFieldFromImplicitField<FormatSchema>,
688
- Partial<TreeNodeFromImplicitAllowedTypes<FormatSchema>>,
689
- FormattedAtom<
690
- TreeNodeFromImplicitAllowedTypes<FormatSchema>,
691
- TreeNodeFromImplicitAllowedTypes<FormattedTextAtoms<ExtraAtomsSchema>>
692
- >,
693
- FormattedAtomInsertable<
694
- InsertableTreeNodeFromImplicitAllowedTypes<FormatSchema>,
695
- InsertableTreeNodeFromImplicitAllowedTypes<FormattedTextAtoms<ExtraAtomsSchema>>
696
- >
697
- >;
698
-
699
918
  /**
700
919
  * A generic type for a formatted text schema.
701
- * @internal
920
+ * @sealed
921
+ * @alpha
702
922
  */
703
923
  export type FormattedTextSchema<
704
924
  TUserScope extends string,
@@ -708,12 +928,13 @@ export namespace FormattedTextAsTree {
708
928
  >[],
709
929
  > = Statics<
710
930
  ErasedNode<
711
- FormattedTextMembers<FormatSchema, ExtraAtomsSchema>,
931
+ Members<FormatSchema, ExtraAtomsSchema>,
712
932
  FormattedTextSchemaIdentifier<TUserScope>
713
- >
933
+ >,
934
+ FormatSchema
714
935
  > &
715
936
  ErasedSchemaSubclassable<
716
- FormattedTextMembers<FormatSchema, ExtraAtomsSchema>,
937
+ Members<FormatSchema, ExtraAtomsSchema>,
717
938
  FormattedTextSchemaIdentifier<TUserScope>
718
939
  >;
719
940
  }