@fluidframework/tree 2.114.0 → 2.116.0-416006

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 (242) hide show
  1. package/CHANGELOG.md +191 -0
  2. package/api-report/tree.alpha.api.md +108 -39
  3. package/dist/core/index.d.ts +1 -1
  4. package/dist/core/index.d.ts.map +1 -1
  5. package/dist/core/index.js +3 -2
  6. package/dist/core/index.js.map +1 -1
  7. package/dist/core/rebase/index.d.ts +1 -1
  8. package/dist/core/rebase/index.d.ts.map +1 -1
  9. package/dist/core/rebase/index.js +2 -1
  10. package/dist/core/rebase/index.js.map +1 -1
  11. package/dist/core/rebase/types.d.ts +110 -0
  12. package/dist/core/rebase/types.d.ts.map +1 -1
  13. package/dist/core/rebase/types.js +47 -1
  14. package/dist/core/rebase/types.js.map +1 -1
  15. package/dist/entrypoints/alpha.d.ts +1 -1
  16. package/dist/entrypoints/alpha.d.ts.map +1 -1
  17. package/dist/entrypoints/alpha.js +6 -4
  18. package/dist/entrypoints/alpha.js.map +1 -1
  19. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  20. package/dist/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  21. package/dist/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  22. package/dist/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  23. package/dist/index.d.ts +3 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -5
  26. package/dist/index.js.map +1 -1
  27. package/dist/packageVersion.d.ts +1 -1
  28. package/dist/packageVersion.d.ts.map +1 -1
  29. package/dist/packageVersion.js +1 -1
  30. package/dist/packageVersion.js.map +1 -1
  31. package/dist/shared-tree/sharedTree.d.ts +5 -0
  32. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  33. package/dist/shared-tree/sharedTree.js +1 -1
  34. package/dist/shared-tree/sharedTree.js.map +1 -1
  35. package/dist/shared-tree/treeCheckout.d.ts +5 -0
  36. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  37. package/dist/shared-tree/treeCheckout.js +58 -12
  38. package/dist/shared-tree/treeCheckout.js.map +1 -1
  39. package/dist/shared-tree-core/branch.d.ts +1 -0
  40. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  41. package/dist/shared-tree-core/branch.js.map +1 -1
  42. package/dist/shared-tree-core/sharedTreeCore.js +1 -1
  43. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  44. package/dist/simple-tree/api/index.d.ts +1 -1
  45. package/dist/simple-tree/api/index.d.ts.map +1 -1
  46. package/dist/simple-tree/api/index.js +2 -3
  47. package/dist/simple-tree/api/index.js.map +1 -1
  48. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  49. package/dist/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  50. package/dist/simple-tree/api/schemaStatics.d.ts +6 -7
  51. package/dist/simple-tree/api/schemaStatics.d.ts.map +1 -1
  52. package/dist/simple-tree/api/schemaStatics.js.map +1 -1
  53. package/dist/simple-tree/api/treeNodeApi.d.ts +20 -24
  54. package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  55. package/dist/simple-tree/api/treeNodeApi.js +48 -49
  56. package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
  57. package/dist/simple-tree/core/treeNode.d.ts +5 -6
  58. package/dist/simple-tree/core/treeNode.d.ts.map +1 -1
  59. package/dist/simple-tree/core/treeNode.js +2 -4
  60. package/dist/simple-tree/core/treeNode.js.map +1 -1
  61. package/dist/simple-tree/core/withType.d.ts +20 -7
  62. package/dist/simple-tree/core/withType.d.ts.map +1 -1
  63. package/dist/simple-tree/core/withType.js +4 -7
  64. package/dist/simple-tree/core/withType.js.map +1 -1
  65. package/dist/simple-tree/index.d.ts +2 -2
  66. package/dist/simple-tree/index.d.ts.map +1 -1
  67. package/dist/simple-tree/index.js +3 -4
  68. package/dist/simple-tree/index.js.map +1 -1
  69. package/dist/simple-tree/leafNodeSchema.d.ts +6 -1
  70. package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
  71. package/dist/simple-tree/leafNodeSchema.js +0 -1
  72. package/dist/simple-tree/leafNodeSchema.js.map +1 -1
  73. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts +32 -3
  74. package/dist/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  75. package/dist/simple-tree/node-kinds/array/arrayNode.js +91 -10
  76. package/dist/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  77. package/dist/simple-tree/node-kinds/map/mapNode.d.ts +77 -0
  78. package/dist/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  79. package/dist/simple-tree/node-kinds/map/mapNode.js +17 -1
  80. package/dist/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  81. package/dist/simple-tree/node-kinds/object/objectNode.js +2 -2
  82. package/dist/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  83. package/dist/simple-tree/node-kinds/record/recordNode.js +2 -2
  84. package/dist/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  85. package/dist/text/codePointUtils.d.ts +2 -2
  86. package/dist/text/codePointUtils.js +2 -2
  87. package/dist/text/codePointUtils.js.map +1 -1
  88. package/dist/text/index.d.ts +3 -3
  89. package/dist/text/index.d.ts.map +1 -1
  90. package/dist/text/index.js +4 -4
  91. package/dist/text/index.js.map +1 -1
  92. package/dist/text/textDomain.d.ts +18 -18
  93. package/dist/text/textDomain.d.ts.map +1 -1
  94. package/dist/text/textDomain.js +8 -8
  95. package/dist/text/textDomain.js.map +1 -1
  96. package/dist/text/textDomainFormatted.d.ts +46 -42
  97. package/dist/text/textDomainFormatted.d.ts.map +1 -1
  98. package/dist/text/textDomainFormatted.js +32 -28
  99. package/dist/text/textDomainFormatted.js.map +1 -1
  100. package/dist/text/textDomainFormattedDefault.d.ts +18 -18
  101. package/dist/text/textDomainFormattedDefault.d.ts.map +1 -1
  102. package/dist/text/textDomainFormattedDefault.js +14 -17
  103. package/dist/text/textDomainFormattedDefault.js.map +1 -1
  104. package/dist/util/compressedIds.d.ts +22 -2
  105. package/dist/util/compressedIds.d.ts.map +1 -1
  106. package/dist/util/compressedIds.js +22 -1
  107. package/dist/util/compressedIds.js.map +1 -1
  108. package/lib/core/index.d.ts +1 -1
  109. package/lib/core/index.d.ts.map +1 -1
  110. package/lib/core/index.js +1 -1
  111. package/lib/core/index.js.map +1 -1
  112. package/lib/core/rebase/index.d.ts +1 -1
  113. package/lib/core/rebase/index.d.ts.map +1 -1
  114. package/lib/core/rebase/index.js +1 -1
  115. package/lib/core/rebase/index.js.map +1 -1
  116. package/lib/core/rebase/types.d.ts +110 -0
  117. package/lib/core/rebase/types.d.ts.map +1 -1
  118. package/lib/core/rebase/types.js +46 -0
  119. package/lib/core/rebase/types.js.map +1 -1
  120. package/lib/entrypoints/alpha.d.ts +1 -1
  121. package/lib/entrypoints/alpha.d.ts.map +1 -1
  122. package/lib/entrypoints/alpha.js +1 -1
  123. package/lib/entrypoints/alpha.js.map +1 -1
  124. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts +9 -6
  125. package/lib/feature-libraries/chunked-forest/codec/codecs.d.ts.map +1 -1
  126. package/lib/feature-libraries/chunked-forest/codec/codecs.js +16 -13
  127. package/lib/feature-libraries/chunked-forest/codec/codecs.js.map +1 -1
  128. package/lib/index.d.ts +3 -3
  129. package/lib/index.d.ts.map +1 -1
  130. package/lib/index.js +2 -2
  131. package/lib/index.js.map +1 -1
  132. package/lib/packageVersion.d.ts +1 -1
  133. package/lib/packageVersion.d.ts.map +1 -1
  134. package/lib/packageVersion.js +1 -1
  135. package/lib/packageVersion.js.map +1 -1
  136. package/lib/shared-tree/sharedTree.d.ts +5 -0
  137. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  138. package/lib/shared-tree/sharedTree.js +1 -1
  139. package/lib/shared-tree/sharedTree.js.map +1 -1
  140. package/lib/shared-tree/treeCheckout.d.ts +5 -0
  141. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  142. package/lib/shared-tree/treeCheckout.js +60 -14
  143. package/lib/shared-tree/treeCheckout.js.map +1 -1
  144. package/lib/shared-tree-core/branch.d.ts +1 -0
  145. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  146. package/lib/shared-tree-core/branch.js.map +1 -1
  147. package/lib/shared-tree-core/sharedTreeCore.js +1 -1
  148. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  149. package/lib/simple-tree/api/index.d.ts +1 -1
  150. package/lib/simple-tree/api/index.d.ts.map +1 -1
  151. package/lib/simple-tree/api/index.js +1 -1
  152. package/lib/simple-tree/api/index.js.map +1 -1
  153. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts +3 -3
  154. package/lib/simple-tree/api/schemaFactoryAlpha.d.ts.map +1 -1
  155. package/lib/simple-tree/api/schemaStatics.d.ts +6 -7
  156. package/lib/simple-tree/api/schemaStatics.d.ts.map +1 -1
  157. package/lib/simple-tree/api/schemaStatics.js.map +1 -1
  158. package/lib/simple-tree/api/treeNodeApi.d.ts +20 -24
  159. package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
  160. package/lib/simple-tree/api/treeNodeApi.js +46 -46
  161. package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
  162. package/lib/simple-tree/core/treeNode.d.ts +5 -6
  163. package/lib/simple-tree/core/treeNode.d.ts.map +1 -1
  164. package/lib/simple-tree/core/treeNode.js +2 -4
  165. package/lib/simple-tree/core/treeNode.js.map +1 -1
  166. package/lib/simple-tree/core/withType.d.ts +20 -7
  167. package/lib/simple-tree/core/withType.d.ts.map +1 -1
  168. package/lib/simple-tree/core/withType.js +4 -7
  169. package/lib/simple-tree/core/withType.js.map +1 -1
  170. package/lib/simple-tree/index.d.ts +2 -2
  171. package/lib/simple-tree/index.d.ts.map +1 -1
  172. package/lib/simple-tree/index.js +1 -1
  173. package/lib/simple-tree/index.js.map +1 -1
  174. package/lib/simple-tree/leafNodeSchema.d.ts +6 -1
  175. package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
  176. package/lib/simple-tree/leafNodeSchema.js +0 -1
  177. package/lib/simple-tree/leafNodeSchema.js.map +1 -1
  178. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts +32 -3
  179. package/lib/simple-tree/node-kinds/array/arrayNode.d.ts.map +1 -1
  180. package/lib/simple-tree/node-kinds/array/arrayNode.js +93 -12
  181. package/lib/simple-tree/node-kinds/array/arrayNode.js.map +1 -1
  182. package/lib/simple-tree/node-kinds/map/mapNode.d.ts +77 -0
  183. package/lib/simple-tree/node-kinds/map/mapNode.d.ts.map +1 -1
  184. package/lib/simple-tree/node-kinds/map/mapNode.js +18 -2
  185. package/lib/simple-tree/node-kinds/map/mapNode.js.map +1 -1
  186. package/lib/simple-tree/node-kinds/object/objectNode.js +3 -3
  187. package/lib/simple-tree/node-kinds/object/objectNode.js.map +1 -1
  188. package/lib/simple-tree/node-kinds/record/recordNode.js +3 -3
  189. package/lib/simple-tree/node-kinds/record/recordNode.js.map +1 -1
  190. package/lib/text/codePointUtils.d.ts +2 -2
  191. package/lib/text/codePointUtils.js +2 -2
  192. package/lib/text/codePointUtils.js.map +1 -1
  193. package/lib/text/index.d.ts +3 -3
  194. package/lib/text/index.d.ts.map +1 -1
  195. package/lib/text/index.js +3 -3
  196. package/lib/text/index.js.map +1 -1
  197. package/lib/text/textDomain.d.ts +18 -18
  198. package/lib/text/textDomain.d.ts.map +1 -1
  199. package/lib/text/textDomain.js +7 -7
  200. package/lib/text/textDomain.js.map +1 -1
  201. package/lib/text/textDomainFormatted.d.ts +46 -42
  202. package/lib/text/textDomainFormatted.d.ts.map +1 -1
  203. package/lib/text/textDomainFormatted.js +31 -27
  204. package/lib/text/textDomainFormatted.js.map +1 -1
  205. package/lib/text/textDomainFormattedDefault.d.ts +18 -18
  206. package/lib/text/textDomainFormattedDefault.d.ts.map +1 -1
  207. package/lib/text/textDomainFormattedDefault.js +14 -17
  208. package/lib/text/textDomainFormattedDefault.js.map +1 -1
  209. package/lib/util/compressedIds.d.ts +22 -2
  210. package/lib/util/compressedIds.d.ts.map +1 -1
  211. package/lib/util/compressedIds.js +22 -1
  212. package/lib/util/compressedIds.js.map +1 -1
  213. package/package.json +29 -22
  214. package/src/core/index.ts +2 -0
  215. package/src/core/rebase/index.ts +2 -0
  216. package/src/core/rebase/types.ts +113 -0
  217. package/src/entrypoints/alpha.ts +10 -6
  218. package/src/feature-libraries/chunked-forest/codec/codecs.ts +17 -14
  219. package/src/index.ts +7 -4
  220. package/src/packageVersion.ts +1 -1
  221. package/src/shared-tree/sharedTree.ts +6 -1
  222. package/src/shared-tree/treeCheckout.ts +81 -14
  223. package/src/shared-tree-core/branch.ts +1 -0
  224. package/src/shared-tree-core/sharedTreeCore.ts +1 -1
  225. package/src/simple-tree/api/index.ts +0 -1
  226. package/src/simple-tree/api/schemaStatics.ts +2 -2
  227. package/src/simple-tree/api/treeNodeApi.ts +64 -48
  228. package/src/simple-tree/core/treeNode.ts +13 -10
  229. package/src/simple-tree/core/withType.ts +20 -7
  230. package/src/simple-tree/index.ts +1 -2
  231. package/src/simple-tree/leafNodeSchema.ts +6 -1
  232. package/src/simple-tree/node-kinds/array/arrayNode.ts +109 -14
  233. package/src/simple-tree/node-kinds/map/mapNode.ts +113 -3
  234. package/src/simple-tree/node-kinds/object/objectNode.ts +3 -3
  235. package/src/simple-tree/node-kinds/record/recordNode.ts +3 -3
  236. package/src/text/README.md +1 -1
  237. package/src/text/codePointUtils.ts +2 -2
  238. package/src/text/index.ts +3 -3
  239. package/src/text/textDomain.ts +21 -21
  240. package/src/text/textDomainFormatted.ts +56 -52
  241. package/src/text/textDomainFormattedDefault.ts +14 -23
  242. package/src/util/compressedIds.ts +36 -3
@@ -7,14 +7,14 @@ import { createEmitter } from "@fluid-internal/client-utils";
7
7
  import { assert, unreachableCase, fail } from "@fluidframework/core-utils/internal";
8
8
  import { UsageError } from "@fluidframework/telemetry-utils/internal";
9
9
  import { FluidClientVersion, FormatValidatorNoOp, } from "../codec/index.js";
10
- import { CommitKind, RevertibleStatus, TreeStoredSchemaRepository, combineVisitors, makeDetachedFieldIndex, rebaseChange, rootFieldKey, tagChange, visitDelta, isAncestor, moveToDetachedField, LeafNodeStoredSchema, diffHistories, makeAnonChange, deltaFieldMapHasVisibleChanges, findCommonAncestor, rebaseBranch, } from "../core/index.js";
10
+ import { CommitKind, CommitOutcome, RevertibleStatus, TreeStoredSchemaRepository, combineVisitors, makeDetachedFieldIndex, rebaseChange, rootFieldKey, tagChange, visitDelta, isAncestor, moveToDetachedField, LeafNodeStoredSchema, diffHistories, makeAnonChange, deltaFieldMapHasVisibleChanges, findCommonAncestor, rebaseBranch, } from "../core/index.js";
11
11
  import { allowsRepoSuperset, buildForest, createNodeIdentifierManager, defaultSchemaPolicy, fieldBatchCodecBuilder, TreeStatus, intoDelta, jsonableTreeFromCursor, } from "../feature-libraries/index.js";
12
12
  import { SquashingTransactionStack, SharedTreeBranch, TransactionResult as InternalTransactionResult, } from "../shared-tree-core/index.js";
13
13
  import { getInnerNode, getKernel, customFromCursorStored, } from "../simple-tree/index.js";
14
14
  import { Breakable, breakingMethod, disposeSymbol, getOrCreate, hasSome, throwIfBroken, } from "../util/index.js";
15
15
  import { SchematizingSimpleTreeView } from "./schematizingTreeView.js";
16
16
  import { SharedTreeChangeEnricher } from "./sharedTreeChangeEnricher.js";
17
- import { SharedTreeChangeFamily, hasSchemaChange } from "./sharedTreeChangeFamily.js";
17
+ import { ConstraintStatus, SharedTreeChangeFamily, getConstraintStatus, hasSchemaChange, } from "./sharedTreeChangeFamily.js";
18
18
  import { extractTransactionChangeProcessor } from "./transactionPostProcessor.js";
19
19
  import { SerializedChange } from "./serializedChange.js";
20
20
  /**
@@ -191,6 +191,10 @@ let TreeCheckout = (() => {
191
191
  this.disposeForksAfterTransaction = disposeForksAfterTransaction;
192
192
  this.disposed = false;
193
193
  this.views = new Set();
194
+ /**
195
+ * Event emitters for local commits.
196
+ */
197
+ this.localCommitEventEmitters = new Map();
194
198
  /**
195
199
  * Revertibles maintained for automatic disposal
196
200
  */
@@ -203,6 +207,38 @@ let TreeCheckout = (() => {
203
207
  this.revertibleCommitBranches = new Map();
204
208
  _TreeCheckout_events.set(this, createEmitter());
205
209
  this.events = __classPrivateFieldGet(this, _TreeCheckout_events, "f");
210
+ this.onCommitSequenced = (commit) => {
211
+ const emitter = this.localCommitEventEmitters.get(commit.revision);
212
+ if (emitter === undefined) {
213
+ // If the commit predates the creation of this checkout, there will be no emitter associated with the commit.
214
+ // In that case, we don't need to emit any events.
215
+ return;
216
+ }
217
+ const constraintStatus = getConstraintStatus(commit.change);
218
+ let outcome;
219
+ switch (constraintStatus) {
220
+ case ConstraintStatus.Satisfied: {
221
+ outcome = CommitOutcome.FullyApplied;
222
+ break;
223
+ }
224
+ case ConstraintStatus.ImplicitViolation: {
225
+ outcome = CommitOutcome.FullyDropped;
226
+ break;
227
+ }
228
+ case ConstraintStatus.ExplicitViolation: {
229
+ outcome = CommitOutcome.NewContentOnly;
230
+ break;
231
+ }
232
+ default: {
233
+ unreachableCase(constraintStatus);
234
+ }
235
+ }
236
+ this.emitChangedLocked(() => {
237
+ emitter.emit("settled", outcome);
238
+ }, "a commit settled event callback");
239
+ // No more events will be emitted for this commit, so we can remove the emitter from the map.
240
+ this.localCommitEventEmitters.delete(commit.revision);
241
+ };
206
242
  this.onAfterBranchChange = (event) => {
207
243
  // The following logic allows revertibles to be generated for the change.
208
244
  // Currently only appends (including merges and transaction commits) are supported.
@@ -231,6 +267,8 @@ let TreeCheckout = (() => {
231
267
  return revertible;
232
268
  };
233
269
  let withinEventContext = true;
270
+ const events = createEmitter();
271
+ this.localCommitEventEmitters.set(commit.revision, events);
234
272
  const metadata = {
235
273
  kind,
236
274
  isLocal: true,
@@ -241,6 +279,7 @@ let TreeCheckout = (() => {
241
279
  getRevertible: (onDisposed) => getRevertible?.(onDisposed),
242
280
  label: this.labelTreeNode?.label,
243
281
  labels: buildLabelsSet(this.labelTreeNode),
282
+ events,
244
283
  };
245
284
  this.emitChangedLocked(() => {
246
285
  __classPrivateFieldGet(this, _TreeCheckout_events, "f").emit("changed", metadata, getRevertible);
@@ -266,7 +305,7 @@ let TreeCheckout = (() => {
266
305
  }
267
306
  };
268
307
  this.onAfterChange = (event) => {
269
- this.editLock.lock();
308
+ this.editLock.lock("a change event callback");
270
309
  __classPrivateFieldGet(this, _TreeCheckout_events, "f").emit("beforeBatch", event);
271
310
  if (event.change !== undefined) {
272
311
  const revision = event.type === "rebase"
@@ -429,11 +468,13 @@ let TreeCheckout = (() => {
429
468
  }
430
469
  registerForBranchEvents() {
431
470
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.events.on("afterChange", this.onAfterBranchChange);
471
+ __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.events.on("commitSequenced", this.onCommitSequenced);
432
472
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEvents.on("afterChange", this.onAfterChange);
433
473
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEvents.on("ancestryTrimmed", this.onAncestryTrimmed);
434
474
  }
435
475
  unregisterFromBranchEvents() {
436
476
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.events.off("afterChange", this.onAfterBranchChange);
477
+ __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").branch.events.off("commitSequenced", this.onCommitSequenced);
437
478
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEvents.off("afterChange", this.onAfterChange);
438
479
  __classPrivateFieldGet(this, _TreeCheckout_transaction, "f").activeBranchEvents.off("ancestryTrimmed", this.onAncestryTrimmed);
439
480
  }
@@ -497,8 +538,8 @@ let TreeCheckout = (() => {
497
538
  * Shared by both the local and remote `changed` emission paths in {@link TreeCheckout.onAfterBranchChange}.
498
539
  * The `try`/`finally` ensures the lock is released even if a listener throws.
499
540
  */
500
- emitChangedLocked(emit) {
501
- this.editLock.lock();
541
+ emitChangedLocked(emit, reason = "a change event callback") {
542
+ this.editLock.lock(reason);
502
543
  try {
503
544
  emit();
504
545
  }
@@ -1016,7 +1057,11 @@ class EditLock {
1016
1057
  * Use {@link EditLock.editor} in place of the original editor to ensure that changes are monitored.
1017
1058
  */
1018
1059
  constructor(editor) {
1019
- this.locked = false;
1060
+ /**
1061
+ * The current status of the lock.
1062
+ * The `reason` string will be included in the error message if an attempt is made to edit the tree while the lock is held.
1063
+ */
1064
+ this.status = { isLocked: false };
1020
1065
  const checkLock = () => this.checkUnlocked("Editing the tree");
1021
1066
  this.editor = {
1022
1067
  get schema() {
@@ -1073,14 +1118,15 @@ class EditLock {
1073
1118
  }
1074
1119
  /**
1075
1120
  * Prevent further changes from being made to {@link EditLock.editor} until {@link EditLock.unlock} is called.
1121
+ * @param reason - A string describing why the lock is being acquired. This will be included in the error message if an attempt is made to edit while the lock is held.
1076
1122
  * @remarks May only be called when the lock is not already locked.
1077
1123
  */
1078
- lock() {
1079
- if (this.locked) {
1124
+ lock(reason) {
1125
+ if (this.status.isLocked) {
1080
1126
  debugger;
1081
1127
  }
1082
- assert(!this.locked, 0xaa7 /* Checkout has already been locked */);
1083
- this.locked = true;
1128
+ assert(!this.status.isLocked, 0xaa7 /* Checkout has already been locked */);
1129
+ this.status = { isLocked: true, reason };
1084
1130
  }
1085
1131
  /**
1086
1132
  * Throws an error if the lock is currently locked.
@@ -1088,8 +1134,8 @@ class EditLock {
1088
1134
  * This must start with a capital letter, as it shows up as the first part of the error message and we want it to look nice.
1089
1135
  */
1090
1136
  checkUnlocked(action) {
1091
- if (this.locked) {
1092
- throw new UsageError(`${action} is forbidden during a change event callback`);
1137
+ if (this.status.isLocked) {
1138
+ throw new UsageError(`${action} is forbidden during ${this.status.reason}`);
1093
1139
  }
1094
1140
  }
1095
1141
  /**
@@ -1097,8 +1143,8 @@ class EditLock {
1097
1143
  * @remarks May only be called when the lock is currently locked.
1098
1144
  */
1099
1145
  unlock() {
1100
- assert(this.locked, 0xaa8 /* Checkout has not been locked */);
1101
- this.locked = false;
1146
+ assert(this.status.isLocked, 0xaa8 /* Checkout has not been locked */);
1147
+ this.status = { isLocked: false };
1102
1148
  }
1103
1149
  }
1104
1150
  function verboseFromCursor(reader, schema) {