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