@fluidframework/tree 2.4.0-297027 → 2.4.0-297385

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 (180) hide show
  1. package/dist/core/change-family/changeFamily.d.ts +2 -2
  2. package/dist/core/change-family/changeFamily.d.ts.map +1 -1
  3. package/dist/core/change-family/changeFamily.js.map +1 -1
  4. package/dist/core/change-family/editBuilder.d.ts +3 -2
  5. package/dist/core/change-family/editBuilder.d.ts.map +1 -1
  6. package/dist/core/change-family/editBuilder.js.map +1 -1
  7. package/dist/core/rebase/changeRebaser.d.ts +2 -1
  8. package/dist/core/rebase/changeRebaser.d.ts.map +1 -1
  9. package/dist/core/rebase/changeRebaser.js.map +1 -1
  10. package/dist/core/rebase/utils.js +1 -1
  11. package/dist/core/rebase/utils.js.map +1 -1
  12. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts +4 -3
  13. package/dist/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  14. package/dist/feature-libraries/default-schema/defaultEditBuilder.js +41 -30
  15. package/dist/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  16. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -6
  17. package/dist/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  18. package/dist/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  19. package/dist/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  20. package/dist/feature-libraries/mitigatedChangeFamily.js +4 -4
  21. package/dist/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  22. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts +1 -1
  23. package/dist/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  24. package/dist/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  25. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +12 -8
  26. package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  27. package/dist/feature-libraries/modular-schema/modularChangeFamily.js +179 -60
  28. package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  29. package/dist/feature-libraries/optional-field/optionalField.d.ts +10 -9
  30. package/dist/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  31. package/dist/feature-libraries/optional-field/optionalField.js +9 -7
  32. package/dist/feature-libraries/optional-field/optionalField.js.map +1 -1
  33. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts +3 -10
  34. package/dist/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  35. package/dist/feature-libraries/schema-index/schemaSummarizer.js +1 -8
  36. package/dist/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  37. package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  38. package/dist/feature-libraries/sequence-field/compose.js +32 -20
  39. package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
  40. package/dist/feature-libraries/sequence-field/invert.d.ts +6 -1
  41. package/dist/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  42. package/dist/feature-libraries/sequence-field/invert.js +25 -9
  43. package/dist/feature-libraries/sequence-field/invert.js.map +1 -1
  44. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +17 -16
  45. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  46. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js +19 -11
  47. package/dist/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  48. package/dist/packageVersion.d.ts +1 -1
  49. package/dist/packageVersion.js +1 -1
  50. package/dist/packageVersion.js.map +1 -1
  51. package/dist/shared-tree/sharedTree.d.ts.map +1 -1
  52. package/dist/shared-tree/sharedTree.js +1 -1
  53. package/dist/shared-tree/sharedTree.js.map +1 -1
  54. package/dist/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  55. package/dist/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  56. package/dist/shared-tree/sharedTreeChangeFamily.js +4 -4
  57. package/dist/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  58. package/dist/shared-tree/sharedTreeEditBuilder.d.ts +2 -2
  59. package/dist/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  60. package/dist/shared-tree/sharedTreeEditBuilder.js +15 -11
  61. package/dist/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  62. package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
  63. package/dist/shared-tree/treeCheckout.js +4 -3
  64. package/dist/shared-tree/treeCheckout.js.map +1 -1
  65. package/dist/shared-tree-core/branch.d.ts +2 -3
  66. package/dist/shared-tree-core/branch.d.ts.map +1 -1
  67. package/dist/shared-tree-core/branch.js +10 -11
  68. package/dist/shared-tree-core/branch.js.map +1 -1
  69. package/dist/shared-tree-core/defaultResubmitMachine.d.ts +5 -5
  70. package/dist/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  71. package/dist/shared-tree-core/defaultResubmitMachine.js +4 -4
  72. package/dist/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  73. package/dist/shared-tree-core/editManager.d.ts.map +1 -1
  74. package/dist/shared-tree-core/editManager.js +1 -1
  75. package/dist/shared-tree-core/editManager.js.map +1 -1
  76. package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  77. package/dist/shared-tree-core/sharedTreeCore.js +2 -2
  78. package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
  79. package/lib/core/change-family/changeFamily.d.ts +2 -2
  80. package/lib/core/change-family/changeFamily.d.ts.map +1 -1
  81. package/lib/core/change-family/changeFamily.js.map +1 -1
  82. package/lib/core/change-family/editBuilder.d.ts +3 -2
  83. package/lib/core/change-family/editBuilder.d.ts.map +1 -1
  84. package/lib/core/change-family/editBuilder.js.map +1 -1
  85. package/lib/core/rebase/changeRebaser.d.ts +2 -1
  86. package/lib/core/rebase/changeRebaser.d.ts.map +1 -1
  87. package/lib/core/rebase/changeRebaser.js.map +1 -1
  88. package/lib/core/rebase/utils.js +1 -1
  89. package/lib/core/rebase/utils.js.map +1 -1
  90. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts +4 -3
  91. package/lib/feature-libraries/default-schema/defaultEditBuilder.d.ts.map +1 -1
  92. package/lib/feature-libraries/default-schema/defaultEditBuilder.js +41 -30
  93. package/lib/feature-libraries/default-schema/defaultEditBuilder.js.map +1 -1
  94. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts +4 -6
  95. package/lib/feature-libraries/default-schema/defaultFieldKinds.d.ts.map +1 -1
  96. package/lib/feature-libraries/default-schema/defaultFieldKinds.js.map +1 -1
  97. package/lib/feature-libraries/mitigatedChangeFamily.d.ts.map +1 -1
  98. package/lib/feature-libraries/mitigatedChangeFamily.js +4 -4
  99. package/lib/feature-libraries/mitigatedChangeFamily.js.map +1 -1
  100. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts +1 -1
  101. package/lib/feature-libraries/modular-schema/fieldChangeHandler.d.ts.map +1 -1
  102. package/lib/feature-libraries/modular-schema/fieldChangeHandler.js.map +1 -1
  103. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +12 -8
  104. package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
  105. package/lib/feature-libraries/modular-schema/modularChangeFamily.js +180 -61
  106. package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
  107. package/lib/feature-libraries/optional-field/optionalField.d.ts +10 -9
  108. package/lib/feature-libraries/optional-field/optionalField.d.ts.map +1 -1
  109. package/lib/feature-libraries/optional-field/optionalField.js +9 -7
  110. package/lib/feature-libraries/optional-field/optionalField.js.map +1 -1
  111. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts +3 -10
  112. package/lib/feature-libraries/schema-index/schemaSummarizer.d.ts.map +1 -1
  113. package/lib/feature-libraries/schema-index/schemaSummarizer.js +1 -8
  114. package/lib/feature-libraries/schema-index/schemaSummarizer.js.map +1 -1
  115. package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
  116. package/lib/feature-libraries/sequence-field/compose.js +32 -20
  117. package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
  118. package/lib/feature-libraries/sequence-field/invert.d.ts +6 -1
  119. package/lib/feature-libraries/sequence-field/invert.d.ts.map +1 -1
  120. package/lib/feature-libraries/sequence-field/invert.js +25 -9
  121. package/lib/feature-libraries/sequence-field/invert.js.map +1 -1
  122. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts +17 -16
  123. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.d.ts.map +1 -1
  124. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js +19 -11
  125. package/lib/feature-libraries/sequence-field/sequenceFieldEditor.js.map +1 -1
  126. package/lib/packageVersion.d.ts +1 -1
  127. package/lib/packageVersion.js +1 -1
  128. package/lib/packageVersion.js.map +1 -1
  129. package/lib/shared-tree/sharedTree.d.ts.map +1 -1
  130. package/lib/shared-tree/sharedTree.js +1 -1
  131. package/lib/shared-tree/sharedTree.js.map +1 -1
  132. package/lib/shared-tree/sharedTreeChangeFamily.d.ts +2 -2
  133. package/lib/shared-tree/sharedTreeChangeFamily.d.ts.map +1 -1
  134. package/lib/shared-tree/sharedTreeChangeFamily.js +4 -4
  135. package/lib/shared-tree/sharedTreeChangeFamily.js.map +1 -1
  136. package/lib/shared-tree/sharedTreeEditBuilder.d.ts +2 -2
  137. package/lib/shared-tree/sharedTreeEditBuilder.d.ts.map +1 -1
  138. package/lib/shared-tree/sharedTreeEditBuilder.js +15 -11
  139. package/lib/shared-tree/sharedTreeEditBuilder.js.map +1 -1
  140. package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
  141. package/lib/shared-tree/treeCheckout.js +5 -4
  142. package/lib/shared-tree/treeCheckout.js.map +1 -1
  143. package/lib/shared-tree-core/branch.d.ts +2 -3
  144. package/lib/shared-tree-core/branch.d.ts.map +1 -1
  145. package/lib/shared-tree-core/branch.js +11 -12
  146. package/lib/shared-tree-core/branch.js.map +1 -1
  147. package/lib/shared-tree-core/defaultResubmitMachine.d.ts +5 -5
  148. package/lib/shared-tree-core/defaultResubmitMachine.d.ts.map +1 -1
  149. package/lib/shared-tree-core/defaultResubmitMachine.js +4 -4
  150. package/lib/shared-tree-core/defaultResubmitMachine.js.map +1 -1
  151. package/lib/shared-tree-core/editManager.d.ts.map +1 -1
  152. package/lib/shared-tree-core/editManager.js +2 -2
  153. package/lib/shared-tree-core/editManager.js.map +1 -1
  154. package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
  155. package/lib/shared-tree-core/sharedTreeCore.js +2 -2
  156. package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
  157. package/package.json +23 -23
  158. package/src/core/change-family/changeFamily.ts +5 -2
  159. package/src/core/change-family/editBuilder.ts +3 -2
  160. package/src/core/rebase/changeRebaser.ts +6 -1
  161. package/src/core/rebase/utils.ts +1 -1
  162. package/src/feature-libraries/default-schema/defaultEditBuilder.ts +92 -47
  163. package/src/feature-libraries/default-schema/defaultFieldKinds.ts +7 -7
  164. package/src/feature-libraries/mitigatedChangeFamily.ts +11 -4
  165. package/src/feature-libraries/modular-schema/fieldChangeHandler.ts +1 -0
  166. package/src/feature-libraries/modular-schema/modularChangeFamily.ts +218 -175
  167. package/src/feature-libraries/optional-field/optionalField.ts +21 -17
  168. package/src/feature-libraries/schema-index/schemaSummarizer.ts +2 -10
  169. package/src/feature-libraries/sequence-field/compose.ts +67 -58
  170. package/src/feature-libraries/sequence-field/invert.ts +30 -6
  171. package/src/feature-libraries/sequence-field/sequenceFieldEditor.ts +65 -19
  172. package/src/packageVersion.ts +1 -1
  173. package/src/shared-tree/sharedTree.ts +3 -1
  174. package/src/shared-tree/sharedTreeChangeFamily.ts +5 -1
  175. package/src/shared-tree/sharedTreeEditBuilder.ts +23 -12
  176. package/src/shared-tree/treeCheckout.ts +7 -6
  177. package/src/shared-tree-core/branch.ts +11 -14
  178. package/src/shared-tree-core/defaultResubmitMachine.ts +4 -4
  179. package/src/shared-tree-core/editManager.ts +2 -1
  180. package/src/shared-tree-core/sharedTreeCore.ts +4 -2
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { assert } from "@fluidframework/core-utils/internal";
6
6
  import { BTree } from "@tylerbu/sorted-btree-es6";
7
- import { EditBuilder, isEmptyFieldChanges, makeAnonChange, makeDetachedNodeId, mapCursorField, replaceAtomRevisions, revisionMetadataSourceFromInfo, areEqualChangeAtomIds, areEqualChangeAtomIdOpts, } from "../../core/index.js";
7
+ import { EditBuilder, isEmptyFieldChanges, makeDetachedNodeId, mapCursorField, replaceAtomRevisions, revisionMetadataSourceFromInfo, areEqualChangeAtomIds, areEqualChangeAtomIdOpts, tagChange, makeAnonChange, } from "../../core/index.js";
8
8
  import { brand, fail, idAllocatorFromMaxId, idAllocatorFromState, getOrAddInMapLazy, } from "../../util/index.js";
9
9
  import { chunkFieldSingle, chunkTree, defaultChunkPolicy, } from "../chunked-forest/index.js";
10
10
  import { cursorForMapTreeNode, mapTreeFromCursor } from "../mapTreeCursor.js";
@@ -82,7 +82,18 @@ export class ModularChangeFamily {
82
82
  composePair(change1, change2, revInfos, idState) {
83
83
  const { fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys } = this.composeAllFields(change1, change2, revInfos, idState);
84
84
  const { allBuilds, allDestroys, allRefreshers } = composeBuildsDestroysAndRefreshers(change1, change2);
85
- return makeModularChangeset(fieldChanges, nodeChanges, nodeToParent, nodeAliases, crossFieldKeys, idState.maxId, revInfos, undefined, allBuilds, allDestroys, allRefreshers);
85
+ return makeModularChangeset({
86
+ fieldChanges,
87
+ nodeChanges,
88
+ nodeToParent,
89
+ nodeAliases,
90
+ crossFieldKeys,
91
+ maxId: idState.maxId,
92
+ revisions: revInfos,
93
+ builds: allBuilds,
94
+ destroys: allDestroys,
95
+ refreshers: allRefreshers,
96
+ });
86
97
  }
87
98
  composeAllFields(change1, change2, revInfos, idState) {
88
99
  if (hasConflicts(change1) && hasConflicts(change2)) {
@@ -303,15 +314,23 @@ export class ModularChangeFamily {
303
314
  /**
304
315
  * @param change - The change to invert.
305
316
  * @param isRollback - Whether the inverted change is meant to rollback a change on a branch as is the case when
317
+ * @param revisionForInvert - The revision for the invert changeset.
306
318
  * performing a sandwich rebase.
307
319
  */
308
- invert(change, isRollback) {
320
+ invert(change, isRollback, revisionForInvert) {
309
321
  // Rollback changesets destroy the nodes created by the change being rolled back.
310
322
  const destroys = isRollback ? invertBuilds(change.change.builds) : undefined;
311
323
  // Destroys only occur in rollback changesets, which are never inverted.
312
324
  assert(change.change.destroys === undefined, 0x89a /* Unexpected destroys in change to invert */);
325
+ const revInfos = isRollback
326
+ ? [{ revision: revisionForInvert, rollbackOf: change.revision }]
327
+ : [{ revision: revisionForInvert }];
313
328
  if (hasConflicts(change.change)) {
314
- return makeModularChangeset(undefined, undefined, undefined, undefined, undefined, change.change.maxId, [], undefined, undefined, destroys);
329
+ return makeModularChangeset({
330
+ maxId: change.change.maxId,
331
+ revisions: revInfos,
332
+ destroys,
333
+ });
315
334
  }
316
335
  const genId = idAllocatorFromMaxId(change.change.maxId ?? -1);
317
336
  const crossFieldTable = {
@@ -319,12 +338,12 @@ export class ModularChangeFamily {
319
338
  originalFieldToContext: new Map(),
320
339
  invertedNodeToParent: brand(change.change.nodeToParent.clone()),
321
340
  };
322
- const { revInfos } = getRevInfoFromTaggedChanges([change]);
323
- const revisionMetadata = revisionMetadataSourceFromInfo(revInfos);
324
- const invertedFields = this.invertFieldMap(change.change.fieldChanges, undefined, isRollback, genId, crossFieldTable, revisionMetadata);
341
+ const { revInfos: oldRevInfos } = getRevInfoFromTaggedChanges([change]);
342
+ const revisionMetadata = revisionMetadataSourceFromInfo(oldRevInfos);
343
+ const invertedFields = this.invertFieldMap(change.change.fieldChanges, undefined, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert);
325
344
  const invertedNodes = newTupleBTree();
326
345
  change.change.nodeChanges.forEachPair(([revision, localId], nodeChangeset) => {
327
- invertedNodes.set([revision, localId], this.invertNodeChange(nodeChangeset, { revision, localId }, isRollback, genId, crossFieldTable, revisionMetadata));
346
+ invertedNodes.set([revision, localId], this.invertNodeChange(nodeChangeset, { revision, localId }, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert));
328
347
  });
329
348
  if (crossFieldTable.invalidatedFields.size > 0) {
330
349
  const fieldsToUpdate = crossFieldTable.invalidatedFields;
@@ -334,19 +353,29 @@ export class ModularChangeFamily {
334
353
  const context = crossFieldTable.originalFieldToContext.get(fieldChange);
335
354
  assert(context !== undefined, 0x851 /* Should have context for every invalidated field */);
336
355
  const { invertedField, fieldId } = context;
337
- const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, new InvertManager(crossFieldTable, fieldChange, fieldId), revisionMetadata);
356
+ const amendedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(originalFieldChange, isRollback, genId, revisionForInvert, new InvertManager(crossFieldTable, fieldChange, fieldId), revisionMetadata);
338
357
  invertedField.change = brand(amendedChange);
339
358
  }
340
359
  }
341
360
  const crossFieldKeys = this.makeCrossFieldKeyTable(invertedFields, invertedNodes);
342
- return makeModularChangeset(invertedFields, invertedNodes, crossFieldTable.invertedNodeToParent, change.change.nodeAliases, crossFieldKeys, genId.getMaxId(), [], change.change.constraintViolationCount, undefined, destroys);
361
+ return makeModularChangeset({
362
+ fieldChanges: invertedFields,
363
+ nodeChanges: invertedNodes,
364
+ nodeToParent: crossFieldTable.invertedNodeToParent,
365
+ nodeAliases: change.change.nodeAliases,
366
+ crossFieldKeys,
367
+ maxId: genId.getMaxId(),
368
+ revisions: revInfos,
369
+ constraintViolationCount: change.change.constraintViolationCount,
370
+ destroys,
371
+ });
343
372
  }
344
- invertFieldMap(changes, parentId, isRollback, genId, crossFieldTable, revisionMetadata) {
373
+ invertFieldMap(changes, parentId, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert) {
345
374
  const invertedFields = new Map();
346
375
  for (const [field, fieldChange] of changes) {
347
376
  const fieldId = { nodeId: parentId, field };
348
377
  const manager = new InvertManager(crossFieldTable, fieldChange, fieldId);
349
- const invertedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(fieldChange.change, isRollback, genId, manager, revisionMetadata);
378
+ const invertedChange = getChangeHandler(this.fieldKinds, fieldChange.fieldKind).rebaser.invert(fieldChange.change, isRollback, genId, revisionForInvert, manager, revisionMetadata);
350
379
  const invertedFieldChange = {
351
380
  ...fieldChange,
352
381
  change: brand(invertedChange),
@@ -359,10 +388,10 @@ export class ModularChangeFamily {
359
388
  }
360
389
  return invertedFields;
361
390
  }
362
- invertNodeChange(change, id, isRollback, genId, crossFieldTable, revisionMetadata) {
391
+ invertNodeChange(change, id, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert) {
363
392
  const inverse = {};
364
393
  if (change.fieldChanges !== undefined) {
365
- inverse.fieldChanges = this.invertFieldMap(change.fieldChanges, id, isRollback, genId, crossFieldTable, revisionMetadata);
394
+ inverse.fieldChanges = this.invertFieldMap(change.fieldChanges, id, isRollback, genId, crossFieldTable, revisionMetadata, revisionForInvert);
366
395
  }
367
396
  return inverse;
368
397
  }
@@ -398,7 +427,19 @@ export class ModularChangeFamily {
398
427
  const rebasedFields = this.rebaseIntersectingFields(crossFieldTable, rebasedNodes, genId, constraintState, rebaseMetadata);
399
428
  this.rebaseInvalidatedElements(rebasedFields, rebasedNodes, crossFieldTable, rebaseMetadata, genId);
400
429
  this.updateConstraintsForFields(rebasedFields, NodeAttachState.Attached, constraintState, rebasedNodes);
401
- const rebased = makeModularChangeset(this.pruneFieldMap(rebasedFields, rebasedNodes), rebasedNodes, crossFieldTable.rebasedNodeToParent, change.nodeAliases, crossFieldTable.rebasedCrossFieldKeys, idState.maxId, change.revisions, constraintState.violationCount, change.builds, change.destroys, change.refreshers);
430
+ const rebased = makeModularChangeset({
431
+ fieldChanges: this.pruneFieldMap(rebasedFields, rebasedNodes),
432
+ nodeChanges: rebasedNodes,
433
+ nodeToParent: crossFieldTable.rebasedNodeToParent,
434
+ nodeAliases: change.nodeAliases,
435
+ crossFieldKeys: crossFieldTable.rebasedCrossFieldKeys,
436
+ maxId: idState.maxId,
437
+ revisions: change.revisions,
438
+ constraintViolationCount: constraintState.violationCount,
439
+ builds: change.builds,
440
+ destroys: change.destroys,
441
+ refreshers: change.refreshers,
442
+ });
402
443
  return rebased;
403
444
  }
404
445
  // This performs a first pass on all fields which have both new and base changes.
@@ -663,7 +704,7 @@ export class ModularChangeFamily {
663
704
  }
664
705
  }
665
706
  changeRevision(change, newRevision, rollbackOf) {
666
- const oldRevisions = new Set(change.revisions === undefined
707
+ const oldRevisions = new Set(change.revisions === undefined || change.revisions.length === 0
667
708
  ? [undefined]
668
709
  : change.revisions.map((revInfo) => revInfo.revision));
669
710
  const updatedFields = this.replaceFieldMapRevisions(change.fieldChanges, oldRevisions, newRevision);
@@ -933,7 +974,19 @@ export function updateRefreshers(change, getDetachedNode, removedRoots, requireR
933
974
  }
934
975
  }
935
976
  const { fieldChanges, nodeChanges, maxId, revisions, constraintViolationCount, builds, destroys, } = change;
936
- return makeModularChangeset(fieldChanges, nodeChanges, change.nodeToParent, change.nodeAliases, change.crossFieldKeys, maxId, revisions, constraintViolationCount, builds, destroys, refreshers);
977
+ return makeModularChangeset({
978
+ fieldChanges,
979
+ nodeChanges,
980
+ nodeToParent: change.nodeToParent,
981
+ nodeAliases: change.nodeAliases,
982
+ crossFieldKeys: change.crossFieldKeys,
983
+ maxId: maxId,
984
+ revisions,
985
+ constraintViolationCount,
986
+ builds,
987
+ destroys,
988
+ refreshers,
989
+ });
937
990
  }
938
991
  /**
939
992
  * @param change - The change to convert into a delta.
@@ -1212,31 +1265,33 @@ class ComposeManager extends CrossFieldManagerI {
1212
1265
  return this.crossFieldTable;
1213
1266
  }
1214
1267
  }
1215
- function makeModularChangeset(fieldChanges = undefined, nodeChanges = undefined, nodeToParent = undefined, nodeAliases = undefined, crossFieldKeys = undefined, maxId = -1, revisions = undefined, constraintViolationCount = undefined, builds, destroys, refreshers) {
1268
+ function makeModularChangeset(props = {
1269
+ maxId: -1,
1270
+ }) {
1216
1271
  const changeset = {
1217
- fieldChanges: fieldChanges ?? new Map(),
1218
- nodeChanges: nodeChanges ?? newTupleBTree(),
1219
- nodeToParent: nodeToParent ?? newTupleBTree(),
1220
- nodeAliases: nodeAliases ?? newTupleBTree(),
1221
- crossFieldKeys: crossFieldKeys ?? newCrossFieldKeyTable(),
1272
+ fieldChanges: props.fieldChanges ?? new Map(),
1273
+ nodeChanges: props.nodeChanges ?? newTupleBTree(),
1274
+ nodeToParent: props.nodeToParent ?? newTupleBTree(),
1275
+ nodeAliases: props.nodeAliases ?? newTupleBTree(),
1276
+ crossFieldKeys: props.crossFieldKeys ?? newCrossFieldKeyTable(),
1222
1277
  };
1223
- if (revisions !== undefined && revisions.length > 0) {
1224
- changeset.revisions = revisions;
1278
+ if (props.revisions !== undefined && props.revisions.length > 0) {
1279
+ changeset.revisions = props.revisions;
1225
1280
  }
1226
- if (maxId >= 0) {
1227
- changeset.maxId = brand(maxId);
1281
+ if (props.maxId >= 0) {
1282
+ changeset.maxId = brand(props.maxId);
1228
1283
  }
1229
- if (constraintViolationCount !== undefined && constraintViolationCount > 0) {
1230
- changeset.constraintViolationCount = constraintViolationCount;
1284
+ if (props.constraintViolationCount !== undefined && props.constraintViolationCount > 0) {
1285
+ changeset.constraintViolationCount = props.constraintViolationCount;
1231
1286
  }
1232
- if (builds !== undefined && builds.size > 0) {
1233
- changeset.builds = builds;
1287
+ if (props.builds !== undefined && props.builds.size > 0) {
1288
+ changeset.builds = props.builds;
1234
1289
  }
1235
- if (destroys !== undefined && destroys.size > 0) {
1236
- changeset.destroys = destroys;
1290
+ if (props.destroys !== undefined && props.destroys.size > 0) {
1291
+ changeset.destroys = props.destroys;
1237
1292
  }
1238
- if (refreshers !== undefined && refreshers.size > 0) {
1239
- changeset.refreshers = refreshers;
1293
+ if (props.refreshers !== undefined && props.refreshers.size > 0) {
1294
+ changeset.refreshers = props.refreshers;
1240
1295
  }
1241
1296
  return changeset;
1242
1297
  }
@@ -1263,11 +1318,12 @@ export class ModularEditBuilder extends EditBuilder {
1263
1318
  /**
1264
1319
  * @param firstId - The ID to associate with the first node
1265
1320
  * @param content - The node(s) to build. Can be in either Field or Node mode.
1321
+ * @param revision - The revision to use for the build.
1266
1322
  * @returns A description of the edit that can be passed to `submitChanges`.
1267
1323
  */
1268
- buildTrees(firstId, content, idCompressor) {
1324
+ buildTrees(firstId, content, revision, idCompressor) {
1269
1325
  if (content.mode === 1 /* CursorLocationType.Fields */ && content.getFieldLength() === 0) {
1270
- return { type: "global" };
1326
+ return { type: "global", revision };
1271
1327
  }
1272
1328
  const builds = newTupleBTree();
1273
1329
  const chunkCompressor = {
@@ -1277,10 +1333,11 @@ export class ModularEditBuilder extends EditBuilder {
1277
1333
  const chunk = content.mode === 1 /* CursorLocationType.Fields */
1278
1334
  ? chunkFieldSingle(content, chunkCompressor)
1279
1335
  : chunkTree(content, chunkCompressor);
1280
- builds.set([undefined, firstId], chunk);
1336
+ builds.set([revision, firstId], chunk);
1281
1337
  return {
1282
1338
  type: "global",
1283
1339
  builds,
1340
+ revision,
1284
1341
  };
1285
1342
  }
1286
1343
  /**
@@ -1288,25 +1345,55 @@ export class ModularEditBuilder extends EditBuilder {
1288
1345
  * @param field - the field which is being edited
1289
1346
  * @param fieldKind - the kind of the field
1290
1347
  * @param change - the change to the field
1291
- * @param maxId - the highest `ChangesetLocalId` used in this change
1348
+ * @param revision - the revision of the change
1292
1349
  */
1293
- submitChange(field, fieldKind, change) {
1294
- const crossFieldKeys = getChangeHandler(this.fieldKinds, fieldKind).getCrossFieldKeys(change);
1295
- const modularChange = buildModularChangesetFromField(field, { fieldKind, change }, newTupleBTree(), newTupleBTree(), newCrossFieldKeyTable(), this.idAllocator, crossFieldKeys);
1296
- this.applyChange(modularChange);
1350
+ submitChange(field, fieldKind, change, revision) {
1351
+ const localCrossFieldKeys = getChangeHandler(this.fieldKinds, fieldKind).getCrossFieldKeys(change);
1352
+ const modularChange = buildModularChangesetFromField({
1353
+ path: field,
1354
+ fieldChange: { fieldKind, change },
1355
+ nodeChanges: newTupleBTree(),
1356
+ nodeToParent: newTupleBTree(),
1357
+ crossFieldKeys: newCrossFieldKeyTable(),
1358
+ idAllocator: this.idAllocator,
1359
+ localCrossFieldKeys,
1360
+ revision,
1361
+ });
1362
+ this.applyChange(tagChange(modularChange, revision));
1297
1363
  }
1298
- submitChanges(changes) {
1364
+ submitChanges(changes, revision) {
1299
1365
  const modularChange = this.buildChanges(changes);
1300
- this.applyChange(modularChange);
1366
+ this.applyChange(tagChange(modularChange, revision));
1301
1367
  }
1302
1368
  buildChanges(changes) {
1303
- const changeMaps = changes.map((change) => makeAnonChange(change.type === "global"
1304
- ? makeModularChangeset(undefined, undefined, undefined, undefined, undefined, this.idAllocator.getMaxId(), undefined, undefined, change.builds)
1305
- : buildModularChangesetFromField(change.field, {
1306
- fieldKind: change.fieldKind,
1307
- change: change.change,
1308
- }, newTupleBTree(), newTupleBTree(), newCrossFieldKeyTable(), this.idAllocator, getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change))));
1309
- const composedChange = this.changeFamily.rebaser.compose(changeMaps);
1369
+ const revisions = new Set();
1370
+ const changeMaps = changes.map((change) => {
1371
+ revisions.add(change.revision);
1372
+ return makeAnonChange(change.type === "global"
1373
+ ? makeModularChangeset({
1374
+ maxId: this.idAllocator.getMaxId(),
1375
+ builds: change.builds,
1376
+ revisions: [{ revision: change.revision }],
1377
+ })
1378
+ : buildModularChangesetFromField({
1379
+ path: change.field,
1380
+ fieldChange: {
1381
+ fieldKind: change.fieldKind,
1382
+ change: change.change,
1383
+ },
1384
+ nodeChanges: newTupleBTree(),
1385
+ nodeToParent: newTupleBTree(),
1386
+ crossFieldKeys: newCrossFieldKeyTable(),
1387
+ idAllocator: this.idAllocator,
1388
+ localCrossFieldKeys: getChangeHandler(this.fieldKinds, change.fieldKind).getCrossFieldKeys(change.change),
1389
+ revision: change.revision,
1390
+ }));
1391
+ });
1392
+ const revInfo = Array.from(revisions).map((revision) => ({ revision }));
1393
+ const composedChange = {
1394
+ ...this.changeFamily.rebaser.compose(changeMaps),
1395
+ revisions: revInfo,
1396
+ };
1310
1397
  const maxId = brand(this.idAllocator.getMaxId());
1311
1398
  if (maxId >= 0) {
1312
1399
  composedChange.maxId = maxId;
@@ -1316,14 +1403,23 @@ export class ModularEditBuilder extends EditBuilder {
1316
1403
  generateId(count) {
1317
1404
  return brand(this.idAllocator.allocate(count));
1318
1405
  }
1319
- addNodeExistsConstraint(path) {
1406
+ addNodeExistsConstraint(path, revision) {
1320
1407
  const nodeChange = {
1321
1408
  nodeExistsConstraint: { violated: false },
1322
1409
  };
1323
- this.applyChange(buildModularChangesetFromNode(path, nodeChange, newTupleBTree(), newTupleBTree(), newCrossFieldKeyTable(), this.idAllocator));
1410
+ this.applyChange(tagChange(buildModularChangesetFromNode({
1411
+ path,
1412
+ nodeChange,
1413
+ nodeChanges: newTupleBTree(),
1414
+ nodeToParent: newTupleBTree(),
1415
+ crossFieldKeys: newCrossFieldKeyTable(),
1416
+ idAllocator: this.idAllocator,
1417
+ revision,
1418
+ }), revision));
1324
1419
  }
1325
1420
  }
1326
- function buildModularChangesetFromField(path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = idAllocatorFromMaxId(), localCrossFieldKeys = [], childId = undefined) {
1421
+ function buildModularChangesetFromField(props) {
1422
+ const { path, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator = idAllocatorFromMaxId(), localCrossFieldKeys = [], childId, revision, } = props;
1327
1423
  const fieldChanges = new Map([[path.field, fieldChange]]);
1328
1424
  if (path.parent === undefined) {
1329
1425
  for (const key of localCrossFieldKeys) {
@@ -1335,12 +1431,19 @@ function buildModularChangesetFromField(path, fieldChange, nodeChanges, nodeToPa
1335
1431
  field: path.field,
1336
1432
  });
1337
1433
  }
1338
- return makeModularChangeset(fieldChanges, nodeChanges, nodeToParent, undefined, crossFieldKeys, idAllocator.getMaxId());
1434
+ return makeModularChangeset({
1435
+ fieldChanges,
1436
+ nodeChanges,
1437
+ nodeToParent,
1438
+ crossFieldKeys,
1439
+ maxId: idAllocator.getMaxId(),
1440
+ revisions: [{ revision }],
1441
+ });
1339
1442
  }
1340
1443
  const nodeChangeset = {
1341
1444
  fieldChanges,
1342
1445
  };
1343
- const parentId = { localId: brand(idAllocator.allocate()) };
1446
+ const parentId = { localId: brand(idAllocator.allocate()), revision };
1344
1447
  for (const key of localCrossFieldKeys) {
1345
1448
  crossFieldKeys.set(key, { nodeId: parentId, field: path.field });
1346
1449
  }
@@ -1350,16 +1453,32 @@ function buildModularChangesetFromField(path, fieldChange, nodeChanges, nodeToPa
1350
1453
  field: path.field,
1351
1454
  });
1352
1455
  }
1353
- return buildModularChangesetFromNode(path.parent, nodeChangeset, nodeChanges, nodeToParent, crossFieldKeys, idAllocator, parentId);
1456
+ return buildModularChangesetFromNode({
1457
+ path: path.parent,
1458
+ nodeChange: nodeChangeset,
1459
+ nodeChanges,
1460
+ nodeToParent,
1461
+ crossFieldKeys,
1462
+ idAllocator,
1463
+ revision,
1464
+ nodeId: parentId,
1465
+ });
1354
1466
  }
1355
- function buildModularChangesetFromNode(path, nodeChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator, nodeId = { localId: brand(idAllocator.allocate()) }) {
1356
- setInChangeAtomIdMap(nodeChanges, nodeId, nodeChange);
1467
+ function buildModularChangesetFromNode(props) {
1468
+ const { path, nodeId = { localId: brand(props.idAllocator.allocate()), revision: props.revision }, } = props;
1469
+ setInChangeAtomIdMap(props.nodeChanges, nodeId, props.nodeChange);
1357
1470
  const fieldChangeset = genericFieldKind.changeHandler.editor.buildChildChange(path.parentIndex, nodeId);
1358
1471
  const fieldChange = {
1359
1472
  fieldKind: genericFieldKind.identifier,
1360
1473
  change: fieldChangeset,
1361
1474
  };
1362
- return buildModularChangesetFromField({ parent: path.parent, field: path.parentField }, fieldChange, nodeChanges, nodeToParent, crossFieldKeys, idAllocator, [], nodeId);
1475
+ return buildModularChangesetFromField({
1476
+ ...props,
1477
+ path: { parent: path.parent, field: path.parentField },
1478
+ fieldChange,
1479
+ localCrossFieldKeys: [],
1480
+ childId: nodeId,
1481
+ });
1363
1482
  }
1364
1483
  function getRevInfoFromTaggedChanges(changes) {
1365
1484
  let maxId = -1;