@fluid-experimental/tree 0.58.2001 → 0.59.2000-61729
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.
- package/README.md +159 -46
- package/dist/ChangeCompression.d.ts +39 -0
- package/dist/ChangeCompression.d.ts.map +1 -0
- package/dist/ChangeCompression.js +117 -0
- package/dist/ChangeCompression.js.map +1 -0
- package/{lib/default-edits/PersistedTypes.d.ts → dist/ChangeTypes.d.ts} +58 -105
- package/dist/ChangeTypes.d.ts.map +1 -0
- package/dist/{default-edits/PersistedTypes.js → ChangeTypes.js} +21 -76
- package/dist/ChangeTypes.js.map +1 -0
- package/dist/Checkout.d.ts +39 -27
- package/dist/Checkout.d.ts.map +1 -1
- package/dist/Checkout.js +61 -32
- package/dist/Checkout.js.map +1 -1
- package/dist/Common.d.ts +175 -38
- package/dist/Common.d.ts.map +1 -1
- package/dist/Common.js +240 -103
- package/dist/Common.js.map +1 -1
- package/dist/EagerCheckout.d.ts +24 -0
- package/dist/EagerCheckout.d.ts.map +1 -0
- package/dist/{BasicCheckout.js → EagerCheckout.js} +9 -6
- package/dist/EagerCheckout.js.map +1 -0
- package/dist/EditLog.d.ts +77 -63
- package/dist/EditLog.d.ts.map +1 -1
- package/dist/EditLog.js +85 -48
- package/dist/EditLog.js.map +1 -1
- package/dist/EditUtilities.d.ts +168 -0
- package/dist/EditUtilities.d.ts.map +1 -0
- package/dist/EditUtilities.js +373 -0
- package/dist/EditUtilities.js.map +1 -0
- package/dist/EventTypes.d.ts +73 -0
- package/dist/EventTypes.d.ts.map +1 -0
- package/dist/EventTypes.js +78 -0
- package/dist/EventTypes.js.map +1 -0
- package/dist/Forest.d.ts +29 -7
- package/dist/Forest.d.ts.map +1 -1
- package/dist/Forest.js +60 -36
- package/dist/Forest.js.map +1 -1
- package/dist/HistoryEditFactory.d.ts +20 -0
- package/dist/HistoryEditFactory.d.ts.map +1 -0
- package/dist/HistoryEditFactory.js +226 -0
- package/dist/HistoryEditFactory.js.map +1 -0
- package/dist/IdConversion.d.ts +12 -0
- package/dist/IdConversion.d.ts.map +1 -0
- package/dist/IdConversion.js +98 -0
- package/dist/IdConversion.js.map +1 -0
- package/dist/Identifiers.d.ts +89 -2
- package/dist/Identifiers.d.ts.map +1 -1
- package/dist/Identifiers.js +10 -0
- package/dist/Identifiers.js.map +1 -1
- package/dist/InitialTree.d.ts +2 -2
- package/dist/InitialTree.d.ts.map +1 -1
- package/dist/InitialTree.js +2 -1
- package/dist/InitialTree.js.map +1 -1
- package/dist/LazyCheckout.d.ts +28 -0
- package/dist/LazyCheckout.d.ts.map +1 -0
- package/dist/LazyCheckout.js +44 -0
- package/dist/LazyCheckout.js.map +1 -0
- package/dist/LogViewer.d.ts +129 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +111 -85
- package/dist/LogViewer.js.map +1 -1
- package/dist/MergeHealth.d.ts +221 -0
- package/dist/MergeHealth.d.ts.map +1 -0
- package/dist/MergeHealth.js +263 -0
- package/dist/MergeHealth.js.map +1 -0
- package/dist/NodeIdUtilities.d.ts +105 -0
- package/dist/NodeIdUtilities.d.ts.map +1 -0
- package/dist/NodeIdUtilities.js +60 -0
- package/dist/NodeIdUtilities.js.map +1 -0
- package/dist/PayloadUtilities.d.ts +42 -0
- package/dist/PayloadUtilities.d.ts.map +1 -0
- package/dist/PayloadUtilities.js +114 -0
- package/dist/PayloadUtilities.js.map +1 -0
- package/dist/ReconciliationPath.d.ts +18 -13
- package/dist/ReconciliationPath.d.ts.map +1 -1
- package/dist/ReconciliationPath.js.map +1 -1
- package/dist/RevisionValueCache.d.ts +11 -2
- package/dist/RevisionValueCache.d.ts.map +1 -1
- package/dist/RevisionValueCache.js +2 -3
- package/dist/RevisionValueCache.js.map +1 -1
- package/dist/RevisionView.d.ts +83 -0
- package/dist/RevisionView.d.ts.map +1 -0
- package/dist/RevisionView.js +182 -0
- package/dist/RevisionView.js.map +1 -0
- package/dist/SerializationUtilities.d.ts +36 -0
- package/dist/SerializationUtilities.d.ts.map +1 -0
- package/dist/SerializationUtilities.js +102 -0
- package/dist/SerializationUtilities.js.map +1 -0
- package/dist/SharedTree.d.ts +439 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1109 -0
- package/dist/SharedTree.js.map +1 -0
- package/dist/SharedTreeEncoder.d.ts +102 -0
- package/dist/SharedTreeEncoder.d.ts.map +1 -0
- package/dist/SharedTreeEncoder.js +313 -0
- package/dist/SharedTreeEncoder.js.map +1 -0
- package/dist/StringInterner.d.ts +46 -0
- package/dist/StringInterner.d.ts.map +1 -0
- package/dist/StringInterner.js +61 -0
- package/dist/StringInterner.js.map +1 -0
- package/dist/Summary.d.ts +40 -0
- package/dist/Summary.d.ts.map +1 -0
- package/dist/Summary.js +23 -0
- package/dist/Summary.js.map +1 -0
- package/dist/SummaryBackCompatibility.d.ts +22 -22
- package/dist/SummaryBackCompatibility.d.ts.map +1 -1
- package/dist/SummaryBackCompatibility.js +30 -33
- package/dist/SummaryBackCompatibility.js.map +1 -1
- package/dist/SummaryTestUtilities.d.ts +31 -0
- package/dist/SummaryTestUtilities.d.ts.map +1 -0
- package/dist/SummaryTestUtilities.js +37 -0
- package/dist/SummaryTestUtilities.js.map +1 -0
- package/dist/Transaction.d.ts +71 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +92 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +540 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +626 -0
- package/dist/TransactionInternal.js.map +1 -0
- package/dist/TreeCompressor.d.ts +36 -0
- package/dist/TreeCompressor.d.ts.map +1 -0
- package/dist/TreeCompressor.js +137 -0
- package/dist/TreeCompressor.js.map +1 -0
- package/dist/TreeNodeHandle.d.ts +12 -18
- package/dist/TreeNodeHandle.d.ts.map +1 -1
- package/dist/TreeNodeHandle.js +13 -23
- package/dist/TreeNodeHandle.js.map +1 -1
- package/dist/TreeView.d.ts +166 -0
- package/dist/TreeView.d.ts.map +1 -0
- package/dist/TreeView.js +218 -0
- package/dist/TreeView.js.map +1 -0
- package/dist/TreeViewUtilities.d.ts +21 -0
- package/dist/TreeViewUtilities.d.ts.map +1 -0
- package/dist/TreeViewUtilities.js +77 -0
- package/dist/TreeViewUtilities.js.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/dist/UndoRedoHandler.d.ts.map +1 -0
- package/dist/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +5 -9
- package/dist/UndoRedoHandler.js.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/dist/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/dist/id-compressor/AppendOnlySortedMap.js +283 -0
- package/dist/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/dist/id-compressor/IdCompressor.d.ts +389 -0
- package/dist/id-compressor/IdCompressor.d.ts.map +1 -0
- package/dist/id-compressor/IdCompressor.js +1353 -0
- package/dist/id-compressor/IdCompressor.js.map +1 -0
- package/dist/id-compressor/IdRange.d.ts +11 -0
- package/dist/id-compressor/IdRange.d.ts.map +1 -0
- package/dist/id-compressor/IdRange.js +29 -0
- package/dist/id-compressor/IdRange.js.map +1 -0
- package/dist/id-compressor/NumericUuid.d.ts +63 -0
- package/dist/id-compressor/NumericUuid.d.ts.map +1 -0
- package/dist/id-compressor/NumericUuid.js +377 -0
- package/dist/id-compressor/NumericUuid.js.map +1 -0
- package/dist/id-compressor/index.d.ts +12 -0
- package/dist/id-compressor/index.d.ts.map +1 -0
- package/dist/id-compressor/index.js +26 -0
- package/dist/id-compressor/index.js.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/dist/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/0.0.1.js +7 -0
- package/dist/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/dist/id-compressor/persisted-types/index.d.ts +6 -0
- package/dist/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/dist/id-compressor/persisted-types/index.js +18 -0
- package/dist/id-compressor/persisted-types/index.js.map +1 -0
- package/dist/index.d.ts +29 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -35
- package/dist/index.js.map +1 -1
- package/dist/persisted-types/0.0.2.d.ts +385 -0
- package/dist/persisted-types/0.0.2.d.ts.map +1 -0
- package/dist/persisted-types/0.0.2.js +113 -0
- package/dist/persisted-types/0.0.2.js.map +1 -0
- package/dist/persisted-types/0.1.1.d.ts +314 -0
- package/dist/persisted-types/0.1.1.d.ts.map +1 -0
- package/dist/persisted-types/0.1.1.js +153 -0
- package/dist/persisted-types/0.1.1.js.map +1 -0
- package/dist/persisted-types/index.d.ts +7 -0
- package/dist/persisted-types/index.d.ts.map +1 -0
- package/dist/persisted-types/index.js +20 -0
- package/dist/persisted-types/index.js.map +1 -0
- package/docs/0-1-1-Compression.md +228 -0
- package/docs/Breaking-Change-Migration.md +52 -0
- package/docs/Compression.md +2 -2
- package/docs/Telemetry.md +43 -0
- package/docs/Write-Format.md +19 -0
- package/lib/ChangeCompression.d.ts +39 -0
- package/lib/ChangeCompression.d.ts.map +1 -0
- package/lib/ChangeCompression.js +111 -0
- package/lib/ChangeCompression.js.map +1 -0
- package/{dist/default-edits/PersistedTypes.d.ts → lib/ChangeTypes.d.ts} +58 -105
- package/lib/ChangeTypes.d.ts.map +1 -0
- package/lib/{default-edits/PersistedTypes.js → ChangeTypes.js} +15 -68
- package/lib/ChangeTypes.js.map +1 -0
- package/lib/Checkout.d.ts +39 -27
- package/lib/Checkout.d.ts.map +1 -1
- package/lib/Checkout.js +53 -24
- package/lib/Checkout.js.map +1 -1
- package/lib/Common.d.ts +175 -38
- package/lib/Common.d.ts.map +1 -1
- package/lib/Common.js +226 -101
- package/lib/Common.js.map +1 -1
- package/lib/EagerCheckout.d.ts +24 -0
- package/lib/EagerCheckout.d.ts.map +1 -0
- package/lib/{BasicCheckout.js → EagerCheckout.js} +7 -4
- package/lib/EagerCheckout.js.map +1 -0
- package/lib/EditLog.d.ts +77 -63
- package/lib/EditLog.d.ts.map +1 -1
- package/lib/EditLog.js +83 -47
- package/lib/EditLog.js.map +1 -1
- package/lib/EditUtilities.d.ts +168 -0
- package/lib/EditUtilities.d.ts.map +1 -0
- package/lib/EditUtilities.js +353 -0
- package/lib/EditUtilities.js.map +1 -0
- package/lib/EventTypes.d.ts +73 -0
- package/lib/EventTypes.d.ts.map +1 -0
- package/lib/EventTypes.js +75 -0
- package/lib/EventTypes.js.map +1 -0
- package/lib/Forest.d.ts +29 -7
- package/lib/Forest.d.ts.map +1 -1
- package/lib/Forest.js +58 -35
- package/lib/Forest.js.map +1 -1
- package/lib/HistoryEditFactory.d.ts +20 -0
- package/lib/HistoryEditFactory.d.ts.map +1 -0
- package/lib/{default-edits/HistoryEditFactory.js → HistoryEditFactory.js} +78 -39
- package/lib/HistoryEditFactory.js.map +1 -0
- package/lib/IdConversion.d.ts +12 -0
- package/lib/IdConversion.d.ts.map +1 -0
- package/lib/IdConversion.js +91 -0
- package/lib/IdConversion.js.map +1 -0
- package/lib/Identifiers.d.ts +89 -2
- package/lib/Identifiers.d.ts.map +1 -1
- package/lib/Identifiers.js +8 -1
- package/lib/Identifiers.js.map +1 -1
- package/lib/InitialTree.d.ts +2 -2
- package/lib/InitialTree.d.ts.map +1 -1
- package/lib/InitialTree.js +2 -1
- package/lib/InitialTree.js.map +1 -1
- package/lib/LazyCheckout.d.ts +28 -0
- package/lib/LazyCheckout.d.ts.map +1 -0
- package/lib/LazyCheckout.js +40 -0
- package/lib/LazyCheckout.js.map +1 -0
- package/lib/LogViewer.d.ts +129 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +103 -77
- package/lib/LogViewer.js.map +1 -1
- package/lib/MergeHealth.d.ts +221 -0
- package/lib/MergeHealth.d.ts.map +1 -0
- package/lib/MergeHealth.js +258 -0
- package/lib/MergeHealth.js.map +1 -0
- package/lib/NodeIdUtilities.d.ts +105 -0
- package/lib/NodeIdUtilities.d.ts.map +1 -0
- package/lib/NodeIdUtilities.js +53 -0
- package/lib/NodeIdUtilities.js.map +1 -0
- package/lib/PayloadUtilities.d.ts +42 -0
- package/lib/PayloadUtilities.d.ts.map +1 -0
- package/lib/PayloadUtilities.js +110 -0
- package/lib/PayloadUtilities.js.map +1 -0
- package/lib/ReconciliationPath.d.ts +18 -13
- package/lib/ReconciliationPath.d.ts.map +1 -1
- package/lib/ReconciliationPath.js.map +1 -1
- package/lib/RevisionValueCache.d.ts +11 -2
- package/lib/RevisionValueCache.d.ts.map +1 -1
- package/lib/RevisionValueCache.js +2 -3
- package/lib/RevisionValueCache.js.map +1 -1
- package/lib/RevisionView.d.ts +83 -0
- package/lib/RevisionView.d.ts.map +1 -0
- package/lib/RevisionView.js +175 -0
- package/lib/RevisionView.js.map +1 -0
- package/lib/SerializationUtilities.d.ts +36 -0
- package/lib/SerializationUtilities.d.ts.map +1 -0
- package/lib/SerializationUtilities.js +95 -0
- package/lib/SerializationUtilities.js.map +1 -0
- package/lib/SharedTree.d.ts +439 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1104 -0
- package/lib/SharedTree.js.map +1 -0
- package/lib/SharedTreeEncoder.d.ts +102 -0
- package/lib/SharedTreeEncoder.d.ts.map +1 -0
- package/lib/SharedTreeEncoder.js +308 -0
- package/lib/SharedTreeEncoder.js.map +1 -0
- package/lib/StringInterner.d.ts +46 -0
- package/lib/StringInterner.d.ts.map +1 -0
- package/lib/StringInterner.js +57 -0
- package/lib/StringInterner.js.map +1 -0
- package/lib/Summary.d.ts +40 -0
- package/lib/Summary.d.ts.map +1 -0
- package/lib/Summary.js +19 -0
- package/lib/Summary.js.map +1 -0
- package/lib/SummaryBackCompatibility.d.ts +22 -22
- package/lib/SummaryBackCompatibility.d.ts.map +1 -1
- package/lib/SummaryBackCompatibility.js +29 -32
- package/lib/SummaryBackCompatibility.js.map +1 -1
- package/lib/SummaryTestUtilities.d.ts +31 -0
- package/lib/SummaryTestUtilities.d.ts.map +1 -0
- package/lib/SummaryTestUtilities.js +32 -0
- package/lib/SummaryTestUtilities.js.map +1 -0
- package/lib/Transaction.d.ts +71 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +88 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +540 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +622 -0
- package/lib/TransactionInternal.js.map +1 -0
- package/lib/TreeCompressor.d.ts +36 -0
- package/lib/TreeCompressor.d.ts.map +1 -0
- package/lib/TreeCompressor.js +133 -0
- package/lib/TreeCompressor.js.map +1 -0
- package/lib/TreeNodeHandle.d.ts +12 -18
- package/lib/TreeNodeHandle.d.ts.map +1 -1
- package/lib/TreeNodeHandle.js +14 -24
- package/lib/TreeNodeHandle.js.map +1 -1
- package/lib/TreeView.d.ts +166 -0
- package/lib/TreeView.d.ts.map +1 -0
- package/lib/TreeView.js +214 -0
- package/lib/TreeView.js.map +1 -0
- package/lib/TreeViewUtilities.d.ts +21 -0
- package/lib/TreeViewUtilities.d.ts.map +1 -0
- package/lib/TreeViewUtilities.js +71 -0
- package/lib/TreeViewUtilities.js.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.d.ts → UndoRedoHandler.d.ts} +2 -2
- package/lib/UndoRedoHandler.d.ts.map +1 -0
- package/lib/{default-edits/UndoRedoHandler.js → UndoRedoHandler.js} +3 -7
- package/lib/UndoRedoHandler.js.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts +127 -0
- package/lib/id-compressor/AppendOnlySortedMap.d.ts.map +1 -0
- package/lib/id-compressor/AppendOnlySortedMap.js +278 -0
- package/lib/id-compressor/AppendOnlySortedMap.js.map +1 -0
- package/lib/id-compressor/IdCompressor.d.ts +389 -0
- package/lib/id-compressor/IdCompressor.d.ts.map +1 -0
- package/lib/id-compressor/IdCompressor.js +1343 -0
- package/lib/id-compressor/IdCompressor.js.map +1 -0
- package/lib/id-compressor/IdRange.d.ts +11 -0
- package/lib/id-compressor/IdRange.d.ts.map +1 -0
- package/lib/id-compressor/IdRange.js +25 -0
- package/lib/id-compressor/IdRange.js.map +1 -0
- package/lib/id-compressor/NumericUuid.d.ts +63 -0
- package/lib/id-compressor/NumericUuid.d.ts.map +1 -0
- package/lib/id-compressor/NumericUuid.js +365 -0
- package/lib/id-compressor/NumericUuid.js.map +1 -0
- package/lib/id-compressor/index.d.ts +12 -0
- package/lib/id-compressor/index.d.ts.map +1 -0
- package/lib/id-compressor/index.js +12 -0
- package/lib/id-compressor/index.js.map +1 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts +156 -0
- package/lib/id-compressor/persisted-types/0.0.1.d.ts.map +1 -0
- package/lib/{test/Snapshot.tests.d.ts → id-compressor/persisted-types/0.0.1.js} +1 -1
- package/lib/id-compressor/persisted-types/0.0.1.js.map +1 -0
- package/lib/id-compressor/persisted-types/index.d.ts +6 -0
- package/lib/id-compressor/persisted-types/index.d.ts.map +1 -0
- package/lib/id-compressor/persisted-types/index.js +6 -0
- package/lib/id-compressor/persisted-types/index.js.map +1 -0
- package/lib/index.d.ts +29 -9
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +23 -6
- package/lib/index.js.map +1 -1
- package/lib/persisted-types/0.0.2.d.ts +385 -0
- package/lib/persisted-types/0.0.2.d.ts.map +1 -0
- package/lib/persisted-types/0.0.2.js +110 -0
- package/lib/persisted-types/0.0.2.js.map +1 -0
- package/lib/persisted-types/0.1.1.d.ts +314 -0
- package/lib/persisted-types/0.1.1.d.ts.map +1 -0
- package/lib/persisted-types/0.1.1.js +150 -0
- package/lib/persisted-types/0.1.1.js.map +1 -0
- package/lib/persisted-types/index.d.ts +7 -0
- package/lib/persisted-types/index.d.ts.map +1 -0
- package/lib/persisted-types/index.js +8 -0
- package/lib/persisted-types/index.js.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts +6 -0
- package/lib/test/AppendOnlySortedMap.tests.d.ts.map +1 -0
- package/lib/test/AppendOnlySortedMap.tests.js +169 -0
- package/lib/test/AppendOnlySortedMap.tests.js.map +1 -0
- package/lib/test/{SnapshotUtilities.tests.d.ts → ChangeCompression.tests.d.ts} +1 -1
- package/lib/test/ChangeCompression.tests.d.ts.map +1 -0
- package/lib/test/ChangeCompression.tests.js +145 -0
- package/lib/test/ChangeCompression.tests.js.map +1 -0
- package/lib/test/Checkout.tests.d.ts +2 -3
- package/lib/test/Checkout.tests.d.ts.map +1 -1
- package/lib/test/Checkout.tests.js +126 -69
- package/lib/test/Checkout.tests.js.map +1 -1
- package/lib/test/Common.tests.js +60 -2
- package/lib/test/Common.tests.js.map +1 -1
- package/lib/test/{BasicCheckout.tests.d.ts → EagerCheckout.tests.d.ts} +1 -1
- package/lib/test/EagerCheckout.tests.d.ts.map +1 -0
- package/lib/test/EagerCheckout.tests.js +20 -0
- package/lib/test/EagerCheckout.tests.js.map +1 -0
- package/lib/test/Edit.tests.js +22 -14
- package/lib/test/Edit.tests.js.map +1 -1
- package/lib/test/{Anchors.glassBox.tests.d.ts → EditLog.perf.tests.d.ts} +1 -1
- package/lib/test/EditLog.perf.tests.d.ts.map +1 -0
- package/lib/test/EditLog.perf.tests.js +30 -0
- package/lib/test/EditLog.perf.tests.js.map +1 -0
- package/lib/test/EditLog.tests.js +10 -6
- package/lib/test/EditLog.tests.js.map +1 -1
- package/lib/test/EditUtilities.tests.d.ts +6 -0
- package/lib/test/EditUtilities.tests.d.ts.map +1 -0
- package/lib/test/EditUtilities.tests.js +503 -0
- package/lib/test/EditUtilities.tests.js.map +1 -0
- package/lib/test/Forest.perf.tests.d.ts +6 -0
- package/lib/test/Forest.perf.tests.d.ts.map +1 -0
- package/lib/test/Forest.perf.tests.js +133 -0
- package/lib/test/Forest.perf.tests.js.map +1 -0
- package/lib/test/Forest.tests.js +54 -27
- package/lib/test/Forest.tests.js.map +1 -1
- package/lib/test/GenericTransaction.tests.js +12 -3
- package/lib/test/GenericTransaction.tests.js.map +1 -1
- package/lib/test/HistoryEditFactory.tests.d.ts +6 -0
- package/lib/test/HistoryEditFactory.tests.d.ts.map +1 -0
- package/lib/test/HistoryEditFactory.tests.js +90 -0
- package/lib/test/HistoryEditFactory.tests.js.map +1 -0
- package/lib/test/IdCompressor.perf.tests.d.ts +6 -0
- package/lib/test/IdCompressor.perf.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.perf.tests.js +304 -0
- package/lib/test/IdCompressor.perf.tests.js.map +1 -0
- package/lib/test/IdCompressor.tests.d.ts +6 -0
- package/lib/test/IdCompressor.tests.d.ts.map +1 -0
- package/lib/test/IdCompressor.tests.js +1075 -0
- package/lib/test/IdCompressor.tests.js.map +1 -0
- package/lib/test/IdConversion.tests.d.ts +6 -0
- package/lib/test/IdConversion.tests.d.ts.map +1 -0
- package/lib/test/IdConversion.tests.js +36 -0
- package/lib/test/IdConversion.tests.js.map +1 -0
- package/lib/test/LazyCheckout.tests.d.ts +6 -0
- package/lib/test/LazyCheckout.tests.d.ts.map +1 -0
- package/lib/test/LazyCheckout.tests.js +22 -0
- package/lib/test/LazyCheckout.tests.js.map +1 -0
- package/lib/test/LogViewer.tests.js +276 -191
- package/lib/test/LogViewer.tests.js.map +1 -1
- package/lib/test/{SharedTreeWithAnchors.tests.d.ts → MergeHealthTelemetryHeartbeat.tests.d.ts} +1 -1
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.d.ts.map +1 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +342 -0
- package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -0
- package/lib/test/NumericUuid.perf.tests.d.ts +6 -0
- package/lib/test/NumericUuid.perf.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.perf.tests.js +68 -0
- package/lib/test/NumericUuid.perf.tests.js.map +1 -0
- package/lib/test/NumericUuid.tests.d.ts +6 -0
- package/lib/test/NumericUuid.tests.d.ts.map +1 -0
- package/lib/test/NumericUuid.tests.js +191 -0
- package/lib/test/NumericUuid.tests.js.map +1 -0
- package/lib/test/RevisionView.tests.d.ts +6 -0
- package/lib/test/RevisionView.tests.d.ts.map +1 -0
- package/lib/test/RevisionView.tests.js +133 -0
- package/lib/test/RevisionView.tests.js.map +1 -0
- package/lib/test/SharedTree.perf.tests.d.ts +6 -0
- package/lib/test/SharedTree.perf.tests.d.ts.map +1 -0
- package/lib/test/SharedTree.perf.tests.js +39 -0
- package/lib/test/SharedTree.perf.tests.js.map +1 -0
- package/lib/test/SharedTree.tests.js +15 -3
- package/lib/test/SharedTree.tests.js.map +1 -1
- package/lib/test/StringInterner.tests.d.ts +6 -0
- package/lib/test/StringInterner.tests.d.ts.map +1 -0
- package/lib/test/StringInterner.tests.js +71 -0
- package/lib/test/StringInterner.tests.js.map +1 -0
- package/lib/test/Summary.tests.d.ts +8 -0
- package/lib/test/Summary.tests.d.ts.map +1 -0
- package/lib/test/Summary.tests.js +407 -0
- package/lib/test/Summary.tests.js.map +1 -0
- package/lib/test/Transaction.tests.js +109 -329
- package/lib/test/Transaction.tests.js.map +1 -1
- package/lib/test/TransactionInternal.tests.d.ts +6 -0
- package/lib/test/TransactionInternal.tests.d.ts.map +1 -0
- package/lib/test/TransactionInternal.tests.js +568 -0
- package/lib/test/TransactionInternal.tests.js.map +1 -0
- package/lib/test/TreeCompression.tests.d.ts +6 -0
- package/lib/test/TreeCompression.tests.d.ts.map +1 -0
- package/lib/test/TreeCompression.tests.js +292 -0
- package/lib/test/TreeCompression.tests.js.map +1 -0
- package/lib/test/TreeView.tests.d.ts +6 -0
- package/lib/test/TreeView.tests.d.ts.map +1 -0
- package/lib/test/TreeView.tests.js +176 -0
- package/lib/test/TreeView.tests.js.map +1 -0
- package/lib/test/UndoRedoHandler.tests.js +2 -2
- package/lib/test/UndoRedoHandler.tests.js.map +1 -1
- package/lib/test/Virtualization.tests.js +146 -62
- package/lib/test/Virtualization.tests.js.map +1 -1
- package/lib/test/fuzz/Generators.d.ts +19 -0
- package/lib/test/fuzz/Generators.d.ts.map +1 -0
- package/lib/test/fuzz/Generators.js +420 -0
- package/lib/test/fuzz/Generators.js.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts +20 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.d.ts.map +1 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js +217 -0
- package/lib/test/fuzz/SharedTreeFuzzTests.js.map +1 -0
- package/lib/test/fuzz/Types.d.ts +133 -0
- package/lib/test/fuzz/Types.d.ts.map +1 -0
- package/lib/test/{GenericTransactionWithAnchors.tests.d.ts → fuzz/Types.js} +2 -2
- package/lib/test/fuzz/Types.js.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts +180 -0
- package/lib/test/utilities/IdCompressorTestUtilities.d.ts.map +1 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js +528 -0
- package/lib/test/utilities/IdCompressorTestUtilities.js.map +1 -0
- package/lib/test/utilities/MockTransaction.d.ts +26 -7
- package/lib/test/utilities/MockTransaction.d.ts.map +1 -1
- package/lib/test/utilities/MockTransaction.js +40 -11
- package/lib/test/utilities/MockTransaction.js.map +1 -1
- package/lib/test/utilities/PendingLocalStateTests.d.ts +12 -0
- package/lib/test/utilities/PendingLocalStateTests.d.ts.map +1 -0
- package/lib/test/utilities/PendingLocalStateTests.js +105 -0
- package/lib/test/utilities/PendingLocalStateTests.js.map +1 -0
- package/lib/test/utilities/SharedTreeTests.d.ts +3 -4
- package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
- package/lib/test/utilities/SharedTreeTests.js +696 -439
- package/lib/test/utilities/SharedTreeTests.js.map +1 -1
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts +11 -0
- package/lib/test/utilities/SharedTreeVersioningTests.d.ts.map +1 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js +370 -0
- package/lib/test/utilities/SharedTreeVersioningTests.js.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts +10 -0
- package/lib/test/utilities/SummaryLoadPerfTests.d.ts.map +1 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js +102 -0
- package/lib/test/utilities/SummaryLoadPerfTests.js.map +1 -0
- package/lib/test/utilities/SummarySizeTests.d.ts +11 -0
- package/lib/test/utilities/SummarySizeTests.d.ts.map +1 -0
- package/lib/test/utilities/SummarySizeTests.js +158 -0
- package/lib/test/utilities/SummarySizeTests.js.map +1 -0
- package/lib/test/utilities/TestCommon.d.ts +9 -0
- package/lib/test/utilities/TestCommon.d.ts.map +1 -0
- package/lib/test/utilities/TestCommon.js +13 -0
- package/lib/test/utilities/TestCommon.js.map +1 -0
- package/lib/test/utilities/TestNode.d.ts +140 -0
- package/lib/test/utilities/TestNode.d.ts.map +1 -0
- package/lib/test/utilities/TestNode.js +292 -0
- package/lib/test/utilities/TestNode.js.map +1 -0
- package/lib/test/utilities/TestUtilities.d.ts +84 -70
- package/lib/test/utilities/TestUtilities.d.ts.map +1 -1
- package/lib/test/utilities/TestUtilities.js +218 -143
- package/lib/test/utilities/TestUtilities.js.map +1 -1
- package/lib/test/utilities/UndoRedoTests.d.ts +4 -5
- package/lib/test/utilities/UndoRedoTests.d.ts.map +1 -1
- package/lib/test/utilities/UndoRedoTests.js +138 -149
- package/lib/test/utilities/UndoRedoTests.js.map +1 -1
- package/package.json +22 -17
- package/src/ChangeCompression.ts +159 -0
- package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -125
- package/src/Checkout.ts +82 -53
- package/src/Common.ts +317 -117
- package/src/EagerCheckout.ts +38 -0
- package/src/EditLog.ts +153 -100
- package/src/EditUtilities.ts +559 -0
- package/src/EventTypes.ts +74 -0
- package/src/Forest.ts +81 -73
- package/src/{default-edits/HistoryEditFactory.ts → HistoryEditFactory.ts} +103 -53
- package/src/IdConversion.ts +125 -0
- package/src/Identifiers.ts +101 -1
- package/src/InitialTree.ts +5 -4
- package/src/LazyCheckout.ts +51 -0
- package/src/LogViewer.ts +242 -166
- package/src/MergeHealth.ts +447 -0
- package/src/NodeIdUtilities.ts +156 -0
- package/src/PayloadUtilities.ts +124 -0
- package/src/ReconciliationPath.ts +18 -13
- package/src/RevisionValueCache.ts +14 -5
- package/src/RevisionView.ts +252 -0
- package/src/SerializationUtilities.ts +130 -0
- package/src/SharedTree.ts +1501 -0
- package/src/SharedTreeEncoder.ts +493 -0
- package/src/StringInterner.ts +72 -0
- package/src/Summary.ts +48 -0
- package/src/SummaryBackCompatibility.ts +47 -57
- package/src/SummaryTestUtilities.ts +54 -0
- package/src/Transaction.ts +120 -0
- package/src/TransactionInternal.ts +1087 -0
- package/src/TreeCompressor.ts +213 -0
- package/src/TreeNodeHandle.ts +19 -32
- package/src/TreeView.ts +322 -0
- package/src/TreeViewUtilities.ts +77 -0
- package/src/{default-edits/UndoRedoHandler.ts → UndoRedoHandler.ts} +8 -13
- package/src/id-compressor/AppendOnlySortedMap.ts +325 -0
- package/src/id-compressor/IdCompressor.md +3 -0
- package/src/id-compressor/IdCompressor.ts +1848 -0
- package/src/id-compressor/IdRange.ts +33 -0
- package/src/id-compressor/NumericUuid.ts +414 -0
- package/src/id-compressor/index.ts +13 -0
- package/src/id-compressor/persisted-types/0.0.1.ts +179 -0
- package/src/id-compressor/persisted-types/README.md +3 -0
- package/src/id-compressor/persisted-types/index.ts +6 -0
- package/src/index.ts +118 -59
- package/src/persisted-types/0.0.2.ts +442 -0
- package/src/persisted-types/0.1.1.ts +476 -0
- package/src/persisted-types/README.md +22 -0
- package/src/persisted-types/index.ts +9 -0
- package/.mocharc.js +0 -41
- package/api/tree.api.md +0 -729
- package/dist/BasicCheckout.d.ts +0 -23
- package/dist/BasicCheckout.d.ts.map +0 -1
- package/dist/BasicCheckout.js.map +0 -1
- package/dist/Snapshot.d.ts +0 -198
- package/dist/Snapshot.d.ts.map +0 -1
- package/dist/Snapshot.js +0 -267
- package/dist/Snapshot.js.map +0 -1
- package/dist/SnapshotUtilities.d.ts +0 -29
- package/dist/SnapshotUtilities.d.ts.map +0 -1
- package/dist/SnapshotUtilities.js +0 -73
- package/dist/SnapshotUtilities.js.map +0 -1
- package/dist/anchored-edits/AnchorResolution.d.ts +0 -144
- package/dist/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/dist/anchored-edits/AnchorResolution.js +0 -162
- package/dist/anchored-edits/AnchorResolution.js.map +0 -1
- package/dist/anchored-edits/Factory.d.ts +0 -56
- package/dist/anchored-edits/Factory.d.ts.map +0 -1
- package/dist/anchored-edits/Factory.js +0 -79
- package/dist/anchored-edits/Factory.js.map +0 -1
- package/dist/anchored-edits/PersistedTypes.d.ts +0 -245
- package/dist/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/anchored-edits/PersistedTypes.js +0 -131
- package/dist/anchored-edits/PersistedTypes.js.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/dist/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/SharedTreeWithAnchors.js +0 -115
- package/dist/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/dist/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/dist/anchored-edits/TransactionWithAnchors.js +0 -36
- package/dist/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/dist/anchored-edits/index.d.ts +0 -10
- package/dist/anchored-edits/index.d.ts.map +0 -1
- package/dist/anchored-edits/index.js +0 -34
- package/dist/anchored-edits/index.js.map +0 -1
- package/dist/default-edits/EditUtilities.d.ts +0 -57
- package/dist/default-edits/EditUtilities.d.ts.map +0 -1
- package/dist/default-edits/EditUtilities.js +0 -192
- package/dist/default-edits/EditUtilities.js.map +0 -1
- package/dist/default-edits/Factory.d.ts +0 -56
- package/dist/default-edits/Factory.d.ts.map +0 -1
- package/dist/default-edits/Factory.js +0 -79
- package/dist/default-edits/Factory.js.map +0 -1
- package/dist/default-edits/HistoryEditFactory.d.ts +0 -19
- package/dist/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/dist/default-edits/HistoryEditFactory.js +0 -187
- package/dist/default-edits/HistoryEditFactory.js.map +0 -1
- package/dist/default-edits/PersistedTypes.d.ts.map +0 -1
- package/dist/default-edits/PersistedTypes.js.map +0 -1
- package/dist/default-edits/SharedTree.d.ts +0 -111
- package/dist/default-edits/SharedTree.d.ts.map +0 -1
- package/dist/default-edits/SharedTree.js +0 -124
- package/dist/default-edits/SharedTree.js.map +0 -1
- package/dist/default-edits/Summary.d.ts +0 -15
- package/dist/default-edits/Summary.d.ts.map +0 -1
- package/dist/default-edits/Summary.js +0 -35
- package/dist/default-edits/Summary.js.map +0 -1
- package/dist/default-edits/Transaction.d.ts +0 -41
- package/dist/default-edits/Transaction.d.ts.map +0 -1
- package/dist/default-edits/Transaction.js +0 -225
- package/dist/default-edits/Transaction.js.map +0 -1
- package/dist/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/dist/default-edits/UndoRedoHandler.js.map +0 -1
- package/dist/default-edits/index.d.ts +0 -13
- package/dist/default-edits/index.d.ts.map +0 -1
- package/dist/default-edits/index.js +0 -41
- package/dist/default-edits/index.js.map +0 -1
- package/dist/generic/GenericEditUtilities.d.ts +0 -26
- package/dist/generic/GenericEditUtilities.d.ts.map +0 -1
- package/dist/generic/GenericEditUtilities.js +0 -45
- package/dist/generic/GenericEditUtilities.js.map +0 -1
- package/dist/generic/GenericSharedTree.d.ts +0 -221
- package/dist/generic/GenericSharedTree.d.ts.map +0 -1
- package/dist/generic/GenericSharedTree.js +0 -447
- package/dist/generic/GenericSharedTree.js.map +0 -1
- package/dist/generic/GenericTransaction.d.ts +0 -87
- package/dist/generic/GenericTransaction.d.ts.map +0 -1
- package/dist/generic/GenericTransaction.js +0 -144
- package/dist/generic/GenericTransaction.js.map +0 -1
- package/dist/generic/PersistedTypes.d.ts +0 -194
- package/dist/generic/PersistedTypes.d.ts.map +0 -1
- package/dist/generic/PersistedTypes.js +0 -42
- package/dist/generic/PersistedTypes.js.map +0 -1
- package/dist/generic/Summary.d.ts +0 -63
- package/dist/generic/Summary.d.ts.map +0 -1
- package/dist/generic/Summary.js +0 -64
- package/dist/generic/Summary.js.map +0 -1
- package/dist/generic/index.d.ts +0 -10
- package/dist/generic/index.d.ts.map +0 -1
- package/dist/generic/index.js +0 -26
- package/dist/generic/index.js.map +0 -1
- package/docs/Future.md +0 -155
- package/lib/BasicCheckout.d.ts +0 -23
- package/lib/BasicCheckout.d.ts.map +0 -1
- package/lib/BasicCheckout.js.map +0 -1
- package/lib/Snapshot.d.ts +0 -198
- package/lib/Snapshot.d.ts.map +0 -1
- package/lib/Snapshot.js +0 -263
- package/lib/Snapshot.js.map +0 -1
- package/lib/SnapshotUtilities.d.ts +0 -29
- package/lib/SnapshotUtilities.d.ts.map +0 -1
- package/lib/SnapshotUtilities.js +0 -67
- package/lib/SnapshotUtilities.js.map +0 -1
- package/lib/anchored-edits/AnchorResolution.d.ts +0 -144
- package/lib/anchored-edits/AnchorResolution.d.ts.map +0 -1
- package/lib/anchored-edits/AnchorResolution.js +0 -152
- package/lib/anchored-edits/AnchorResolution.js.map +0 -1
- package/lib/anchored-edits/Factory.d.ts +0 -56
- package/lib/anchored-edits/Factory.d.ts.map +0 -1
- package/lib/anchored-edits/Factory.js +0 -74
- package/lib/anchored-edits/Factory.js.map +0 -1
- package/lib/anchored-edits/PersistedTypes.d.ts +0 -245
- package/lib/anchored-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/anchored-edits/PersistedTypes.js +0 -128
- package/lib/anchored-edits/PersistedTypes.js.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts +0 -120
- package/lib/anchored-edits/SharedTreeWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/SharedTreeWithAnchors.js +0 -110
- package/lib/anchored-edits/SharedTreeWithAnchors.js.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.d.ts +0 -28
- package/lib/anchored-edits/TransactionWithAnchors.d.ts.map +0 -1
- package/lib/anchored-edits/TransactionWithAnchors.js +0 -32
- package/lib/anchored-edits/TransactionWithAnchors.js.map +0 -1
- package/lib/anchored-edits/index.d.ts +0 -10
- package/lib/anchored-edits/index.d.ts.map +0 -1
- package/lib/anchored-edits/index.js +0 -11
- package/lib/anchored-edits/index.js.map +0 -1
- package/lib/default-edits/EditUtilities.d.ts +0 -57
- package/lib/default-edits/EditUtilities.d.ts.map +0 -1
- package/lib/default-edits/EditUtilities.js +0 -181
- package/lib/default-edits/EditUtilities.js.map +0 -1
- package/lib/default-edits/Factory.d.ts +0 -56
- package/lib/default-edits/Factory.d.ts.map +0 -1
- package/lib/default-edits/Factory.js +0 -74
- package/lib/default-edits/Factory.js.map +0 -1
- package/lib/default-edits/HistoryEditFactory.d.ts +0 -19
- package/lib/default-edits/HistoryEditFactory.d.ts.map +0 -1
- package/lib/default-edits/HistoryEditFactory.js.map +0 -1
- package/lib/default-edits/PersistedTypes.d.ts.map +0 -1
- package/lib/default-edits/PersistedTypes.js.map +0 -1
- package/lib/default-edits/SharedTree.d.ts +0 -111
- package/lib/default-edits/SharedTree.d.ts.map +0 -1
- package/lib/default-edits/SharedTree.js +0 -100
- package/lib/default-edits/SharedTree.js.map +0 -1
- package/lib/default-edits/Summary.d.ts +0 -15
- package/lib/default-edits/Summary.d.ts.map +0 -1
- package/lib/default-edits/Summary.js +0 -31
- package/lib/default-edits/Summary.js.map +0 -1
- package/lib/default-edits/Transaction.d.ts +0 -41
- package/lib/default-edits/Transaction.d.ts.map +0 -1
- package/lib/default-edits/Transaction.js +0 -221
- package/lib/default-edits/Transaction.js.map +0 -1
- package/lib/default-edits/UndoRedoHandler.d.ts.map +0 -1
- package/lib/default-edits/UndoRedoHandler.js.map +0 -1
- package/lib/default-edits/index.d.ts +0 -13
- package/lib/default-edits/index.d.ts.map +0 -1
- package/lib/default-edits/index.js +0 -14
- package/lib/default-edits/index.js.map +0 -1
- package/lib/generic/GenericEditUtilities.d.ts +0 -26
- package/lib/generic/GenericEditUtilities.d.ts.map +0 -1
- package/lib/generic/GenericEditUtilities.js +0 -38
- package/lib/generic/GenericEditUtilities.js.map +0 -1
- package/lib/generic/GenericSharedTree.d.ts +0 -221
- package/lib/generic/GenericSharedTree.d.ts.map +0 -1
- package/lib/generic/GenericSharedTree.js +0 -443
- package/lib/generic/GenericSharedTree.js.map +0 -1
- package/lib/generic/GenericTransaction.d.ts +0 -87
- package/lib/generic/GenericTransaction.d.ts.map +0 -1
- package/lib/generic/GenericTransaction.js +0 -140
- package/lib/generic/GenericTransaction.js.map +0 -1
- package/lib/generic/PersistedTypes.d.ts +0 -194
- package/lib/generic/PersistedTypes.d.ts.map +0 -1
- package/lib/generic/PersistedTypes.js +0 -39
- package/lib/generic/PersistedTypes.js.map +0 -1
- package/lib/generic/Summary.d.ts +0 -63
- package/lib/generic/Summary.d.ts.map +0 -1
- package/lib/generic/Summary.js +0 -58
- package/lib/generic/Summary.js.map +0 -1
- package/lib/generic/index.d.ts +0 -10
- package/lib/generic/index.d.ts.map +0 -1
- package/lib/generic/index.js +0 -11
- package/lib/generic/index.js.map +0 -1
- package/lib/test/Anchors.glassBox.tests.d.ts.map +0 -1
- package/lib/test/Anchors.glassBox.tests.js +0 -410
- package/lib/test/Anchors.glassBox.tests.js.map +0 -1
- package/lib/test/BasicCheckout.tests.d.ts.map +0 -1
- package/lib/test/BasicCheckout.tests.js +0 -8
- package/lib/test/BasicCheckout.tests.js.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/GenericTransactionWithAnchors.tests.js +0 -25
- package/lib/test/GenericTransactionWithAnchors.tests.js.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.d.ts.map +0 -1
- package/lib/test/SharedTreeWithAnchors.tests.js +0 -420
- package/lib/test/SharedTreeWithAnchors.tests.js.map +0 -1
- package/lib/test/Snapshot.tests.d.ts.map +0 -1
- package/lib/test/Snapshot.tests.js +0 -96
- package/lib/test/Snapshot.tests.js.map +0 -1
- package/lib/test/SnapshotUtilities.tests.d.ts.map +0 -1
- package/lib/test/SnapshotUtilities.tests.js +0 -168
- package/lib/test/SnapshotUtilities.tests.js.map +0 -1
- package/lib/test/undoRedoStackManager.d.ts +0 -26
- package/lib/test/undoRedoStackManager.d.ts.map +0 -1
- package/lib/test/undoRedoStackManager.js +0 -176
- package/lib/test/undoRedoStackManager.js.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts +0 -13
- package/lib/test/utilities/SummaryFormatCompatibilityTests.d.ts.map +0 -1
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js +0 -154
- package/lib/test/utilities/SummaryFormatCompatibilityTests.js.map +0 -1
- package/src/BasicCheckout.ts +0 -34
- package/src/Snapshot.ts +0 -363
- package/src/SnapshotUtilities.ts +0 -88
- package/src/anchored-edits/AnchorResolution.ts +0 -442
- package/src/anchored-edits/Factory.ts +0 -94
- package/src/anchored-edits/PersistedTypes.ts +0 -310
- package/src/anchored-edits/SharedTreeWithAnchors.ts +0 -200
- package/src/anchored-edits/TransactionWithAnchors.ts +0 -39
- package/src/anchored-edits/index.ts +0 -21
- package/src/default-edits/EditUtilities.ts +0 -220
- package/src/default-edits/Factory.ts +0 -94
- package/src/default-edits/SharedTree.ts +0 -174
- package/src/default-edits/Summary.ts +0 -44
- package/src/default-edits/Transaction.ts +0 -262
- package/src/default-edits/index.ts +0 -29
- package/src/generic/GenericEditUtilities.ts +0 -46
- package/src/generic/GenericSharedTree.ts +0 -593
- package/src/generic/GenericTransaction.ts +0 -194
- package/src/generic/PersistedTypes.ts +0 -221
- package/src/generic/Summary.ts +0 -113
- package/src/generic/index.ts +0 -41
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SharedTreeWithAnchors.tests.js","sourceRoot":"","sources":["../../src/test/SharedTreeWithAnchors.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { MockContainerRuntimeFactory } from '@fluidframework/test-runtime-utils';\nimport { NodeId } from '../Identifiers';\nimport { ChangeNode, TraitLocation } from '../generic';\nimport { StablePlace, StableRange, ConstraintEffect, revert } from '../default-edits';\nimport {\n\tAnchoredChange,\n\tAnchoredDelete,\n\tAnchoredInsert,\n\tAnchoredMove,\n\tPlaceAnchor,\n\tPlaceAnchorSemanticsChoice,\n\tRangeAnchor,\n\tSharedTreeWithAnchors,\n} from '../anchored-edits';\nimport { fail } from '../Common';\nimport {\n\tmakeEmptyNode,\n\tsetUpTestSharedTreeWithAnchors,\n\tleftTraitLabel,\n\trightTraitLabel,\n\tsetUpLocalServerTestSharedTreeWithAnchors,\n} from './utilities/TestUtilities';\nimport { runSharedTreeOperationsTests } from './utilities/SharedTreeTests';\nimport { runSummaryTests } from './utilities/SummaryFormatCompatibilityTests';\n\n/**\n * This file contains tests that verify the behavior or anchors by checking how they are resolved in the face of concurrent edits.\n * There are two batteries of tests:\n * - The first is defined by the cartesian product of a representative set of concurrent edits (see `insertScenarios`) and a variety of\n * anchor types--each anchor type is associated with an instance of `AnchorCaseOutcomes` which describe how that anchor should respond to\n * concurrent edits (see `anchorCases`).\n * - The second checks the behavior of a specific anchor in the face of more special/corner-case concurrent edits.\n */\n\n/**\n * The expected contents of the `parent` node's traits after a test.\n */\ninterface Outcome {\n\t/**\n\t * The expected contents of the left trait.\n\t * Defaults to [left].\n\t */\n\tleftTrait?: ChangeNode[];\n\t/**\n\t * The expected contents of the right trait.\n\t * Defaults to [right].\n\t */\n\trightTrait?: ChangeNode[];\n}\n\n/**\n * The expected contents of the `parent` node's traits for a given anchor after each scenario.\n * Each field represents an expected outcome for a different set of concurrent edits in `insertScenarios`.\n */\ninterface AnchorCaseOutcomes {\n\tonNoConcurrency: Outcome;\n\tonMove: Outcome;\n\tonTeleport?: Outcome;\n\tonDelete: Outcome;\n\tonUndoDelete?: Outcome;\n\tonUndoRedoDelete?: Outcome;\n\tonDeleteParent?: Outcome;\n\tonDroppedEdit: Outcome;\n\tonInsert: Outcome;\n}\n\n/**\n * An anchor with specific semantics and in a specific contexts.\n * Includes the expected outcome of inserting the `inserted` node at the given anchor for various test scenarios.\n */\ninterface AnchorCase extends AnchorCaseOutcomes {\n\tname: string;\n\tinsertionPlace: PlaceAnchor;\n}\n\n/**\n * The changes to apply concurrently to the change whose anchor is being tested.\n */\ntype ConcurrentChanges =\n\t| AnchoredChange\n\t| readonly AnchoredChange[]\n\t| ((tree: SharedTreeWithAnchors, anchorCase: AnchorCase) => AnchoredChange[]);\n\n/**\n * A scenario that an `AnchorCase` could be put through.\n */\ninterface TestScenario {\n\ttitle: string;\n\t/**\n\t * Where to find the expected outcome for this scenario on a given `AnchorCase`.\n\t */\n\toutcomeKey: keyof AnchorCaseOutcomes;\n\tconcurrent?: ConcurrentChanges;\n}\n\nconst left: ChangeNode = makeEmptyNode('left' as NodeId);\nconst right: ChangeNode = makeEmptyNode('right' as NodeId);\nconst parent: ChangeNode = {\n\t...makeEmptyNode('parent' as NodeId),\n\ttraits: { [leftTraitLabel]: [left], [rightTraitLabel]: [right] },\n};\nconst initialTree: ChangeNode = {\n\t...makeEmptyNode('root' as NodeId),\n\ttraits: {\n\t\tparentTraitLabel: [parent],\n\t},\n};\nconst leftTraitLocation = {\n\tparent: parent.identifier,\n\tlabel: leftTraitLabel,\n};\nconst rightTraitLocation = {\n\tparent: parent.identifier,\n\tlabel: rightTraitLabel,\n};\n\n/**\n * Used for tests that require more than the left and right nodes.\n */\nconst extra = makeEmptyNode('extra' as NodeId);\n\n/**\n * The node inserted by the change whose anchors are being tested.\n * Tests outcomes are decided based on where this node ends up (if present at all).\n */\nconst inserted = makeEmptyNode('inserted' as NodeId);\n\n/**\n * Used for tests cases where we check `inserted`'s final location with respect to another node that is concurrently inserted.\n */\nconst concurrentlyInserted = makeEmptyNode('concurrently inserted' as NodeId);\n\nconst treeOptions = {\n\tinitialTree,\n\tlocalMode: false,\n\tenableAnchors: true,\n\tallowInvalid: true,\n};\n\nconst secondTreeOptions = {\n\tid: 'secondTestSharedTree',\n\tlocalMode: false,\n\tenableAnchors: true,\n\tallowInvalid: true,\n};\n\nconst thirdTreeOptions = {\n\tid: 'thirdTestSharedTree',\n\tlocalMode: false,\n\tenableAnchors: true,\n\tallowInvalid: true,\n};\n\nconst boundToNodeBefore = {\n\tname: 'BoundToNode Before(left)',\n\tinsertionPlace: PlaceAnchor.before(left, PlaceAnchorSemanticsChoice.BoundToNode),\n\tonNoConcurrency: { leftTrait: [inserted, left] },\n\tonMove: { leftTrait: [], rightTrait: [inserted, left, right] },\n\tonDelete: { leftTrait: [] },\n\tonDroppedEdit: { leftTrait: [inserted, left] },\n\tonInsert: { leftTrait: [concurrentlyInserted, inserted, left] },\n};\n\nconst boundToNodeAfter = {\n\t...boundToNodeBefore,\n\tname: 'BoundToNode After(left)',\n\tinsertionPlace: PlaceAnchor.after(left, PlaceAnchorSemanticsChoice.BoundToNode),\n\tonNoConcurrency: { leftTrait: [left, inserted] },\n\tonMove: { leftTrait: [], rightTrait: [left, inserted, right] },\n\tonDroppedEdit: { leftTrait: [left, inserted] },\n\tonInsert: { leftTrait: [left, inserted, concurrentlyInserted] },\n};\n\nconst boundToNodeStart = {\n\t...boundToNodeBefore,\n\tname: 'BoundToNode Start(left trait)',\n\tinsertionPlace: PlaceAnchor.atStartOf(leftTraitLocation, PlaceAnchorSemanticsChoice.BoundToNode),\n\tonMove: { leftTrait: [inserted], rightTrait: [left, right] },\n\tonDelete: { leftTrait: [inserted] },\n\tonInsert: { leftTrait: [inserted, concurrentlyInserted, left] },\n};\n\nconst boundToNodeEnd = {\n\t...boundToNodeAfter,\n\tname: 'BoundToNode End(left trait)',\n\tinsertionPlace: PlaceAnchor.atEndOf(leftTraitLocation, PlaceAnchorSemanticsChoice.BoundToNode),\n\tonMove: { leftTrait: [inserted], rightTrait: [left, right] },\n\tonDelete: { leftTrait: [inserted] },\n\tonInsert: { leftTrait: [left, concurrentlyInserted, inserted] },\n};\n\nconst relativeToNodeBefore = {\n\t...boundToNodeBefore,\n\tname: 'RelativeToNode Before(left)',\n\tinsertionPlace: PlaceAnchor.before(left, PlaceAnchorSemanticsChoice.RelativeToNode),\n\tonDelete: { leftTrait: [inserted] },\n};\n\nconst relativeToNodeAfter = {\n\t...boundToNodeAfter,\n\tname: 'RelativeToNode After(left)',\n\tinsertionPlace: PlaceAnchor.after(left, PlaceAnchorSemanticsChoice.RelativeToNode),\n\tonDelete: relativeToNodeBefore.onDelete,\n};\n\nconst relativeToNodeStart = {\n\t...boundToNodeStart,\n\tname: 'RelativeToNode Start(left trait)',\n\tinsertionPlace: PlaceAnchor.atStartOf(leftTraitLocation, PlaceAnchorSemanticsChoice.RelativeToNode),\n};\n\nconst relativeToNodeEnd = {\n\t...boundToNodeEnd,\n\tname: 'RelativeToNode End(left trait)',\n\tinsertionPlace: PlaceAnchor.atEndOf(leftTraitLocation, PlaceAnchorSemanticsChoice.RelativeToNode),\n};\n\n/**\n * A representative set of possible anchors with a variety of semantics and in a variety of contexts.\n * Includes the expected outcome of inserting the `inserted` node at the given anchor for various test scenarios.\n */\nconst anchorCases: readonly AnchorCase[] = [\n\tboundToNodeBefore,\n\tboundToNodeAfter,\n\tboundToNodeStart,\n\tboundToNodeEnd,\n\trelativeToNodeBefore,\n\trelativeToNodeAfter,\n\trelativeToNodeStart,\n\trelativeToNodeEnd,\n];\n\n/**\n * A set of test scenario where `inserted` is inserted at a given anchor.\n */\nconst insertScenarios: TestScenario[] = [\n\t{\n\t\ttitle: 'when there are no concurrent edits',\n\t\toutcomeKey: 'onNoConcurrency',\n\t},\n\t{\n\t\ttitle: 'when target sibling is moved to a different trait',\n\t\toutcomeKey: 'onMove',\n\t\tconcurrent: AnchoredMove.create(StableRange.only(left), StablePlace.before(right)),\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted then re-inserted in a different trait',\n\t\toutcomeKey: 'onTeleport',\n\t\tconcurrent: [\n\t\t\tAnchoredDelete.create(StableRange.only(left)),\n\t\t\t...AnchoredInsert.create([left], StablePlace.before(right)),\n\t\t],\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted with (before, before) range',\n\t\toutcomeKey: 'onDelete',\n\t\tconcurrent: AnchoredDelete.create({\n\t\t\tstart: StablePlace.before(left),\n\t\t\tend: StablePlace.atEndOf(leftTraitLocation),\n\t\t}),\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted with (before, after) range',\n\t\toutcomeKey: 'onDelete',\n\t\tconcurrent: AnchoredDelete.create({\n\t\t\tstart: StablePlace.before(left),\n\t\t\tend: StablePlace.after(left),\n\t\t}),\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted with (after, before) range',\n\t\toutcomeKey: 'onDelete',\n\t\tconcurrent: AnchoredDelete.create({\n\t\t\tstart: StablePlace.atStartOf(leftTraitLocation),\n\t\t\tend: StablePlace.atEndOf(leftTraitLocation),\n\t\t}),\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted with (after, after) range',\n\t\toutcomeKey: 'onDelete',\n\t\tconcurrent: AnchoredDelete.create({\n\t\t\tstart: StablePlace.atStartOf(leftTraitLocation),\n\t\t\tend: StablePlace.after(left),\n\t\t}),\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted then un-deleted',\n\t\toutcomeKey: 'onUndoDelete',\n\t\tconcurrent: (tree: SharedTreeWithAnchors) => {\n\t\t\tconst deletionEditId = tree.editor.delete(StableRange.only(left));\n\t\t\tconst deletionEditIndex = tree.edits.getIndexOfId(deletionEditId);\n\t\t\tconst deletionEdit = tree.edits.getEditInSessionAtIndex(deletionEditIndex);\n\t\t\treturn revert(deletionEdit.changes, tree.logViewer.getSnapshotInSession(deletionEditIndex));\n\t\t},\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted then un-deleted and re-deleted',\n\t\toutcomeKey: 'onUndoRedoDelete',\n\t\tconcurrent: (tree: SharedTreeWithAnchors) => {\n\t\t\tconst deletionEditId = tree.editor.delete(StableRange.only(left));\n\t\t\tconst deletionEditIndex = tree.edits.getIndexOfId(deletionEditId);\n\t\t\tconst deletionEdit = tree.edits.getEditInSessionAtIndex(deletionEditIndex);\n\t\t\tconst undoEditId = tree.editor.revert(deletionEdit, tree.logViewer.getSnapshotInSession(deletionEditIndex));\n\t\t\tconst undoEditIndex = tree.edits.getIndexOfId(undoEditId);\n\t\t\tconst undoEdit = tree.edits.getEditInSessionAtIndex(undoEditIndex);\n\t\t\treturn revert(undoEdit.changes, tree.logViewer.getSnapshotInSession(undoEditIndex));\n\t\t},\n\t},\n\t{\n\t\ttitle: 'when target sibling parent is deleted',\n\t\toutcomeKey: 'onDeleteParent',\n\t\tconcurrent: AnchoredDelete.create(StableRange.only(parent)),\n\t},\n\t{\n\t\ttitle: 'when target sibling is moved in an edit that is dropped',\n\t\toutcomeKey: 'onDroppedEdit',\n\t\tconcurrent: [\n\t\t\t// Valid move\n\t\t\t...AnchoredMove.create(StableRange.only(left), StablePlace.before(right)),\n\t\t\t// Invalid constraint\n\t\t\tAnchoredChange.constraint(StableRange.only(left), ConstraintEffect.InvalidAndDiscard, undefined, 0),\n\t\t],\n\t},\n\t{\n\t\ttitle: 'when target sibling is deleted in an edit that is dropped',\n\t\toutcomeKey: 'onDroppedEdit',\n\t\tconcurrent: [\n\t\t\t// Valid delete\n\t\t\tAnchoredDelete.create(StableRange.only(left)),\n\t\t\t// Invalid constraint\n\t\t\tAnchoredChange.constraint(StableRange.only(left), ConstraintEffect.InvalidAndDiscard, undefined, 0),\n\t\t],\n\t},\n\t{\n\t\ttitle: 'when target place is inserted at',\n\t\toutcomeKey: 'onInsert',\n\t\tconcurrent: (_: unknown, anchorCase: AnchorCase) =>\n\t\t\tAnchoredInsert.create([concurrentlyInserted], anchorCase.insertionPlace),\n\t},\n];\n\ndescribe('SharedTreeWithAnchors', () => {\n\tdescribe('Fulfills the SharedTree contract', () => {\n\t\trunSharedTreeOperationsTests<SharedTreeWithAnchors>('SharedTree Operations', setUpTestSharedTreeWithAnchors);\n\t\trunSummaryTests<SharedTreeWithAnchors>(\n\t\t\t'SharedTree Summary',\n\t\t\tsetUpTestSharedTreeWithAnchors,\n\t\t\tsetUpLocalServerTestSharedTreeWithAnchors\n\t\t);\n\t});\n\n\tit('PlaceAnchor builders default to RelativeToNode semantics', () => {\n\t\tconst start = PlaceAnchor.atStartOf(leftTraitLocation);\n\t\tconst end = PlaceAnchor.atEndOf(leftTraitLocation);\n\t\tconst before = PlaceAnchor.before(left);\n\t\tconst after = PlaceAnchor.after(left);\n\t\texpect(start.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t\texpect(end.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t\texpect(before.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t\texpect(after.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t});\n\n\tit('RangeAnchor builders default to RelativeToNode semantics', () => {\n\t\tconst range = RangeAnchor.only(left);\n\t\texpect(range.start.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t\texpect(range.end.semantics).equals(PlaceAnchorSemanticsChoice.RelativeToNode);\n\t});\n\n\t// This is the main battery of tests.\n\t// These tests insert the `inserted` node at a given PlaceAnchor in different scenarios and check where that node ends up.\n\t// The scenarios cover the various ways concurrent change might affect an anchor.\n\tdescribe('Basic scenarios', () => {\n\t\tfor (const insertScenario of insertScenarios) {\n\t\t\tdescribe(insertScenario.title, () => {\n\t\t\t\tinsertTestsWithExtraChanges(insertScenario.outcomeKey, insertScenario.concurrent);\n\t\t\t});\n\t\t}\n\t});\n\n\t// These tests exercise special scenarios that the main battery of tests (above) does not cover.\n\t// They are mainly aimed at uncovering invalid assumptions that the anchor resolution implementation might make.\n\t// While these tests could be made exhaustive like the main battery, doing so would just add redundant coverage.\n\tdescribe(`Special scenarios`, () => {\n\t\tit('when target place is invalid', () => {\n\t\t\tconst { treeA, treeB, container } = setupTrees();\n\t\t\ttreeA.editor.insert(inserted, PlaceAnchor.before(inserted));\n\t\t\tcontainer.processAllMessages();\n\t\t\texpectChangedTraits(treeA, treeB, {});\n\t\t});\n\n\t\t// For each scenario we test with:\n\t\t// groupInEdit=true: the concurrent changes that introduced the conflict were applied in a single edit\n\t\t// groupInEdit=false: the concurrent changes that introduced the conflict were applied in separate edits\n\t\tfor (const groupInEdit of [true, false]) {\n\t\t\tdescribe(groupInEdit ? 'In one edit' : 'In separate edits', () => {\n\t\t\t\t// These tests verify that re-anchoring works even when more than one place anchor needs updating.\n\t\t\t\tit('when target place and source range both need updating due to two deletes', () => {\n\t\t\t\t\tconst { treeA, treeB, container } = setupTrees();\n\t\t\t\t\ttreeA.editor.insert(extra, StablePlace.before(left));\n\t\t\t\t\tcontainer.processAllMessages();\n\n\t\t\t\t\tif (groupInEdit) {\n\t\t\t\t\t\ttreeB.editor.applyChanges([\n\t\t\t\t\t\t\tAnchoredDelete.create(RangeAnchor.only(left)),\n\t\t\t\t\t\t\tAnchoredDelete.create(RangeAnchor.all(rightTraitLocation)),\n\t\t\t\t\t\t]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttreeB.editor.delete(RangeAnchor.only(left));\n\t\t\t\t\t\ttreeB.editor.delete(RangeAnchor.all(rightTraitLocation));\n\t\t\t\t\t}\n\n\t\t\t\t\tconst beforeExtra = PlaceAnchor.before(extra);\n\t\t\t\t\tconst afterExtra = PlaceAnchor.after(extra);\n\t\t\t\t\ttreeA.editor.move(RangeAnchor.from(beforeExtra).to(afterExtra), PlaceAnchor.before(right));\n\t\t\t\t\tcontainer.processAllMessages();\n\t\t\t\t\texpectChangedTraits(treeA, treeB, { leftTrait: [], rightTrait: [extra] });\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// This test covers the scenario that yields different results depending on whether the front-biased approach\n\t\t// seeks backward to find the most recent offending change at the granularity of changes or at the granularity of edits\n\t\t// and then proceeds through changes forward.\n\t\tit('when target place is teleported then deleted in a single edit', () => {\n\t\t\tconst { treeA, treeB, container } = setupTrees();\n\n\t\t\ttreeB.editor.applyChanges([\n\t\t\t\t// The reanchor will happen on this change if seeking backward through edits and then forward through changes\n\t\t\t\tAnchoredDelete.create(RangeAnchor.only(left)),\n\t\t\t\t...AnchoredInsert.create([left], PlaceAnchor.atStartOf(rightTraitLocation)),\n\t\t\t\t// The reanchor will happen on this change if seeking backward through changes\n\t\t\t\tAnchoredDelete.create(RangeAnchor.only(left)),\n\t\t\t]);\n\n\t\t\ttreeA.editor.insert(inserted, PlaceAnchor.before(left));\n\t\t\tcontainer.processAllMessages();\n\t\t\texpectChangedTraits(treeA, treeB, { leftTrait: [], rightTrait: [inserted, right] });\n\t\t});\n\n\t\t// This test covers the scenario that yields different results depending on whether the front-biased approach\n\t\t// seeks backward to find the most recent offending change at the granularity of changes or at the granularity of edits.\n\t\tit('when target place is teleported then deleted across edits', () => {\n\t\t\tconst { treeA, treeB, container } = setupTrees();\n\n\t\t\t// The reanchor will happen on this change if seeking backward through edits\n\t\t\ttreeB.editor.delete(left);\n\t\t\ttreeB.editor.applyChanges([\n\t\t\t\t...AnchoredInsert.create([left], StablePlace.atStartOf(rightTraitLocation)),\n\t\t\t\t// The reanchor will happen on this change if seeking backward through changes\n\t\t\t\tAnchoredDelete.create(StableRange.only(left)),\n\t\t\t]);\n\n\t\t\ttreeA.editor.insert(inserted, PlaceAnchor.before(left));\n\t\t\tcontainer.processAllMessages();\n\t\t\texpectChangedTraits(treeA, treeB, { leftTrait: [], rightTrait: [inserted, right] });\n\t\t});\n\n\t\t// This test covers the scenario that yields different results depending on whether the changes of the edit being applied are\n\t\t// included in the reconciliation path or not.\n\t\tit('when target place is deleted by the edit being rebased', () => {\n\t\t\tconst { treeA, treeB, container } = setupTrees();\n\n\t\t\ttreeB.editor.move(left, PlaceAnchor.before(right));\n\t\t\ttreeA.editor.applyChanges([\n\t\t\t\t// The reanchor will happen on this change if changes for this edit are included in the reconciliation path\n\t\t\t\tAnchoredDelete.create(RangeAnchor.all(rightTraitLocation)),\n\t\t\t\t// This change will fail if changes for this edit are not included in the reconciliation path\n\t\t\t\t...AnchoredInsert.create([inserted], PlaceAnchor.before(left)),\n\t\t\t]);\n\t\t\tcontainer.processAllMessages();\n\t\t\texpectChangedTraits(treeA, treeB, { leftTrait: [], rightTrait: [inserted] });\n\t\t});\n\n\t\t// These tests cover the scenario that yields different results depending on whether the change application performed on the\n\t\t// reconciliation path is itself using anchor resolution\n\t\tfor (const extraChange of [false, true]) {\n\t\t\tit(`when target place resolution requires resolution of a different place in another edit${\n\t\t\t\textraChange ? ' (with extra change)' : ''\n\t\t\t}`, () => {\n\t\t\t\tconst { treeA, treeB, container } = setupTrees();\n\t\t\t\tconst { tree: treeC } = setUpTestSharedTreeWithAnchors({\n\t\t\t\t\tcontainerRuntimeFactory: container,\n\t\t\t\t\t...thirdTreeOptions,\n\t\t\t\t});\n\t\t\t\ttreeA.editor.insert(extra, StablePlace.before(right));\n\t\t\t\ttreeA.editor.move(left, StablePlace.before(extra));\n\t\t\t\tcontainer.processAllMessages();\n\t\t\t\t// State of right trait: [left, extra, right]\n\n\t\t\t\ttreeB.editor.move(left, StablePlace.after(extra));\n\t\t\t\t// State of right trait: [extra, left, right]\n\t\t\t\ttreeB.editor.delete(left);\n\t\t\t\t// State of right trait: [extra, left-tombstone, right]\n\n\t\t\t\ttreeC.editor.applyChanges([\n\t\t\t\t\t// Will be re-anchored to delete [right] instead of [left, extra, right]\n\t\t\t\t\tAnchoredDelete.create(\n\t\t\t\t\t\tRangeAnchor.from(PlaceAnchor.before(left)).to(StablePlace.atEndOf(rightTraitLocation))\n\t\t\t\t\t),\n\t\t\t\t\t// When present, the no-op change after the change of interest to ensures the anchor resolution uses resolved\n\t\t\t\t\t// changes in the reconciliation path (or derives them).\n\t\t\t\t\t// When not present, the above delete is the only change in the edit so there's a possibility that the anchor\n\t\t\t\t\t// resolution would use cached edit results (which reflect the resolved changes) and therefore don't require\n\t\t\t\t\t// the actual use of resolved changes.\n\t\t\t\t\t// We still want to test without this extra change to ensure that such a possibility, if leveraged, does work\n\t\t\t\t\t// properly.\n\t\t\t\t\t...(extraChange ? [AnchoredChange.clearPayload(parent.identifier)] : []),\n\t\t\t\t]);\n\t\t\t\t// State of right trait: [extra, left-tombstone, right-tombstone]\n\n\t\t\t\ttreeA.editor.insert(inserted, PlaceAnchor.after(right));\n\t\t\t\t// State of right trait: [extra, left-tombstone, right-tombstone, inserted]\n\t\t\t\t// Unless anchor resolution is not performed which case the edit will fail when it tries to apply the\n\t\t\t\t// \"delete everything before left\" edit because it will not take into account the resolved location for \"before left\".\n\n\t\t\t\tcontainer.processAllMessages();\n\t\t\t\texpectChangedTraits(treeA, treeB, { leftTrait: [], rightTrait: [extra, inserted] });\n\t\t\t});\n\t\t}\n\t});\n});\n\n/**\n * Runs an insertion test scenario on all possible anchors.\n */\nfunction insertTestsWithExtraChanges(\n\toutcomeField: keyof AnchorCaseOutcomes,\n\tconcurrentSteps?: ConcurrentChanges\n): void {\n\tfor (const anchorCase of anchorCases) {\n\t\tconst outcome = outcomeFromCaseAndField(anchorCase, outcomeField);\n\t\tinsertTest(anchorCase, outcome, concurrentSteps);\n\t}\n}\n\n/**\n * Provides the expected outcome for a particular `AnchorCase` instance and scenario (described by its `outcomeField`)\n * This helps reduce cruft in the `AnchorCase` by providing general expectations (e.g., concurrently deleting a node and undoing the\n * deletion is expected, unless otherwise specified, to yield the same outcome as through no concurrent changes were made).\n */\nfunction outcomeFromCaseAndField(anchorCase: AnchorCase, outcomeField: keyof AnchorCaseOutcomes): Outcome {\n\tif (anchorCase[outcomeField] !== undefined) {\n\t\treturn anchorCase[outcomeField] as Outcome;\n\t}\n\tswitch (outcomeField) {\n\t\tcase 'onUndoDelete':\n\t\t\treturn outcomeFromCaseAndField(anchorCase, 'onNoConcurrency');\n\t\tcase 'onUndoRedoDelete':\n\t\t\treturn outcomeFromCaseAndField(anchorCase, 'onDelete');\n\t\tcase 'onTeleport':\n\t\t\treturn outcomeFromCaseAndField(anchorCase, 'onMove');\n\t\tcase 'onDeleteParent':\n\t\t\treturn { leftTrait: [], rightTrait: [] };\n\t\tdefault:\n\t\t\tfail('The expected outcome for this case has not been specified');\n\t}\n}\n\n/**\n * Runs the insertion test characterized by the anchor as which to insert, the expected outcome, and the concurrent changes to apply.\n */\nfunction insertTest(anchorCase: AnchorCase, expected: Outcome, concurrentSteps?: ConcurrentChanges): void {\n\tit(anchorCase.name, () => {\n\t\tconst { tree: treeA, containerRuntimeFactory } = setUpTestSharedTreeWithAnchors(treeOptions);\n\t\tconst { tree: treeB } = setUpTestSharedTreeWithAnchors({\n\t\t\tcontainerRuntimeFactory,\n\t\t\t...secondTreeOptions,\n\t\t});\n\t\t// Sync initial tree\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\tconst concurrentChanges =\n\t\t\tconcurrentSteps === undefined\n\t\t\t\t? []\n\t\t\t\t: typeof concurrentSteps === 'function'\n\t\t\t\t? concurrentSteps(treeB, anchorCase)\n\t\t\t\t: Array.isArray(concurrentSteps)\n\t\t\t\t? concurrentSteps\n\t\t\t\t: [concurrentSteps as AnchoredChange];\n\n\t\t// Perform the concurrent edit(s) to be sequenced first\n\t\tif (concurrentSteps) {\n\t\t\ttreeB.editor.applyChanges(concurrentChanges);\n\t\t}\n\n\t\t// Make the insertion at the anchored place\n\t\ttreeA.editor.insert(inserted, anchorCase.insertionPlace);\n\n\t\tcontainerRuntimeFactory.processAllMessages();\n\n\t\t// Test the outcome matches expectations\n\t\texpectChangedTraits(treeA, treeB, expected);\n\t});\n}\n\nfunction expectChangedTraits(treeA: SharedTreeWithAnchors, treeB: SharedTreeWithAnchors, expected: Outcome) {\n\tconst leftIds = (expected.leftTrait ?? [left]).map((node) => node.identifier);\n\tconst rightIds = (expected.rightTrait ?? [right]).map((node) => node.identifier);\n\texpect(tryGetTrait(treeA, leftTraitLocation)).deep.equal(leftIds);\n\texpect(tryGetTrait(treeB, leftTraitLocation)).deep.equal(leftIds);\n\texpect(tryGetTrait(treeA, rightTraitLocation)).deep.equal(rightIds);\n\texpect(tryGetTrait(treeB, rightTraitLocation)).deep.equal(rightIds);\n}\n\nfunction tryGetTrait(tree: SharedTreeWithAnchors, location: TraitLocation): readonly NodeId[] {\n\treturn tree.currentView.hasNode(location.parent) ? tree.currentView.getTrait(location) : [];\n}\n\nfunction setupTrees(): {\n\ttreeA: SharedTreeWithAnchors;\n\ttreeB: SharedTreeWithAnchors;\n\tcontainer: MockContainerRuntimeFactory;\n} {\n\tconst { tree: treeA, containerRuntimeFactory: container } = setUpTestSharedTreeWithAnchors(treeOptions);\n\tconst { tree: treeB } = setUpTestSharedTreeWithAnchors({\n\t\tcontainerRuntimeFactory: container,\n\t\t...secondTreeOptions,\n\t});\n\tcontainer.processAllMessages();\n\treturn { treeA, treeB, container };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Snapshot.tests.d.ts","sourceRoot":"","sources":["../../src/test/Snapshot.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { expect } from 'chai';
|
|
6
|
-
import { Side, Snapshot } from '../Snapshot';
|
|
7
|
-
import { EditValidationResult } from '../Checkout';
|
|
8
|
-
import { detachRange, insertIntoTrait, StablePlace, StableRange, validateStableRange } from '../default-edits';
|
|
9
|
-
import { simpleTreeSnapshotWithValidation, left, right, leftTraitLocation, makeEmptyNode, makeTestNode, } from './utilities/TestUtilities';
|
|
10
|
-
describe('Snapshot', () => {
|
|
11
|
-
describe('creation from a ChangeNode', () => {
|
|
12
|
-
it('ignores empty traits', () => {
|
|
13
|
-
const nodeId = '46711f26-5a27-4a35-9f04-0602dd853b43';
|
|
14
|
-
const testNode = makeTestNode();
|
|
15
|
-
const node = {
|
|
16
|
-
traits: {
|
|
17
|
-
trait: [testNode],
|
|
18
|
-
emptyTrait: [],
|
|
19
|
-
},
|
|
20
|
-
definition: '9f9f7fd1-780b-4d78-bca7-2342df4523f2',
|
|
21
|
-
identifier: nodeId,
|
|
22
|
-
};
|
|
23
|
-
const snapshot = Snapshot.fromTree(node);
|
|
24
|
-
expect(snapshot.getChangeNode(nodeId).traits.trait[0].identifier).to.equal(testNode.identifier);
|
|
25
|
-
expect(snapshot.getChangeNode(nodeId).traits.emptyTrait).to.equal(undefined);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
describe('StableRange validation', () => {
|
|
29
|
-
it('is malformed when anchors are malformed', () => {
|
|
30
|
-
expect(validateStableRange(simpleTreeSnapshotWithValidation, {
|
|
31
|
-
// trait and sibling should be mutually exclusive
|
|
32
|
-
start: { referenceTrait: leftTraitLocation, referenceSibling: left.identifier, side: Side.Before },
|
|
33
|
-
end: { referenceSibling: left.identifier, side: Side.After },
|
|
34
|
-
})).equals(EditValidationResult.Malformed);
|
|
35
|
-
});
|
|
36
|
-
it('is invalid when anchors are incorrectly ordered', () => {
|
|
37
|
-
expect(validateStableRange(simpleTreeSnapshotWithValidation, {
|
|
38
|
-
start: { referenceSibling: left.identifier, side: Side.After },
|
|
39
|
-
end: { referenceSibling: left.identifier, side: Side.Before },
|
|
40
|
-
})).equals(EditValidationResult.Invalid);
|
|
41
|
-
});
|
|
42
|
-
it('is invalid when anchors are in different traits', () => {
|
|
43
|
-
expect(validateStableRange(simpleTreeSnapshotWithValidation, {
|
|
44
|
-
start: { referenceSibling: left.identifier, side: Side.Before },
|
|
45
|
-
end: { referenceSibling: right.identifier, side: Side.After },
|
|
46
|
-
})).equals(EditValidationResult.Invalid);
|
|
47
|
-
});
|
|
48
|
-
it('is invalid when an anchor is invalid', () => {
|
|
49
|
-
expect(validateStableRange(simpleTreeSnapshotWithValidation, {
|
|
50
|
-
start: { referenceSibling: '49a7e636-71ed-45f1-a1a8-2b8f2e7e84a3', side: Side.Before },
|
|
51
|
-
end: { referenceSibling: right.identifier, side: Side.After },
|
|
52
|
-
})).equals(EditValidationResult.Invalid);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('Mutators', () => {
|
|
56
|
-
const label = 'label';
|
|
57
|
-
const nodeA = makeEmptyNode();
|
|
58
|
-
const nodeB = makeEmptyNode();
|
|
59
|
-
const tree = Object.assign(Object.assign({}, makeEmptyNode()), { traits: { [label]: [nodeA, nodeB] } });
|
|
60
|
-
const startingSnapshot = Snapshot.fromTree(tree, true);
|
|
61
|
-
it('can detach a single node', () => {
|
|
62
|
-
var _a;
|
|
63
|
-
expect(startingSnapshot.getIndexInTrait(nodeA.identifier)).to.equal(0);
|
|
64
|
-
expect(startingSnapshot.getIndexInTrait(nodeB.identifier)).to.equal(1);
|
|
65
|
-
const { snapshot } = detachRange(startingSnapshot, StableRange.only(nodeA));
|
|
66
|
-
expect(snapshot.size).to.equal(3);
|
|
67
|
-
expect(snapshot.hasNode(nodeA.identifier)).to.be.true;
|
|
68
|
-
expect(snapshot.getParentSnapshotNode(nodeA.identifier)).to.be.undefined;
|
|
69
|
-
expect((_a = snapshot.getParentSnapshotNode(nodeB.identifier)) === null || _a === void 0 ? void 0 : _a.identifier).to.equal(tree.identifier);
|
|
70
|
-
expect(snapshot.getIndexInTrait(nodeB.identifier)).to.equal(0);
|
|
71
|
-
});
|
|
72
|
-
it('can detach an entire trait', () => {
|
|
73
|
-
const { snapshot, detached } = detachRange(startingSnapshot, StableRange.all({ parent: tree.identifier, label }));
|
|
74
|
-
expect(detached).deep.equals([nodeA.identifier, nodeB.identifier]);
|
|
75
|
-
expect(snapshot.size).to.equal(3);
|
|
76
|
-
expect(snapshot.hasNode(nodeA.identifier)).to.be.true;
|
|
77
|
-
expect(snapshot.hasNode(nodeB.identifier)).to.be.true;
|
|
78
|
-
expect(snapshot.getParentSnapshotNode(nodeA.identifier)).to.be.undefined;
|
|
79
|
-
expect(snapshot.getParentSnapshotNode(nodeB.identifier)).to.be.undefined;
|
|
80
|
-
});
|
|
81
|
-
it('can insert a node', () => {
|
|
82
|
-
var _a;
|
|
83
|
-
const newNode = makeEmptyNode();
|
|
84
|
-
let snapshot = startingSnapshot.addNodes([Object.assign(Object.assign({}, newNode), { traits: new Map() })]);
|
|
85
|
-
expect(snapshot.size).to.equal(4);
|
|
86
|
-
expect(snapshot.hasNode(newNode.identifier)).to.be.true;
|
|
87
|
-
expect(snapshot.getParentSnapshotNode(newNode.identifier)).to.be.undefined;
|
|
88
|
-
snapshot = insertIntoTrait(snapshot, [newNode.identifier], StablePlace.atStartOf({ parent: tree.identifier, label }));
|
|
89
|
-
expect((_a = snapshot.getParentSnapshotNode(newNode.identifier)) === null || _a === void 0 ? void 0 : _a.identifier).to.equal(tree.identifier);
|
|
90
|
-
expect(snapshot.getIndexInTrait(newNode.identifier)).to.equal(0);
|
|
91
|
-
expect(snapshot.getIndexInTrait(nodeA.identifier)).to.equal(1);
|
|
92
|
-
expect(snapshot.getIndexInTrait(nodeB.identifier)).to.equal(2);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
//# sourceMappingURL=Snapshot.tests.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Snapshot.tests.js","sourceRoot":"","sources":["../../src/test/Snapshot.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { expect } from 'chai';\nimport { Definition, NodeId, TraitLabel } from '../Identifiers';\nimport { Side, Snapshot } from '../Snapshot';\nimport { EditValidationResult } from '../Checkout';\nimport { detachRange, insertIntoTrait, StablePlace, StableRange, validateStableRange } from '../default-edits';\nimport { ChangeNode } from '../generic';\nimport {\n\tsimpleTreeSnapshotWithValidation,\n\tleft,\n\tright,\n\tleftTraitLocation,\n\tmakeEmptyNode,\n\tmakeTestNode,\n} from './utilities/TestUtilities';\n\ndescribe('Snapshot', () => {\n\tdescribe('creation from a ChangeNode', () => {\n\t\tit('ignores empty traits', () => {\n\t\t\tconst nodeId = '46711f26-5a27-4a35-9f04-0602dd853b43' as NodeId;\n\t\t\tconst testNode = makeTestNode();\n\t\t\tconst node: ChangeNode = {\n\t\t\t\ttraits: {\n\t\t\t\t\ttrait: [testNode],\n\t\t\t\t\temptyTrait: [],\n\t\t\t\t},\n\t\t\t\tdefinition: '9f9f7fd1-780b-4d78-bca7-2342df4523f2' as Definition,\n\t\t\t\tidentifier: nodeId,\n\t\t\t};\n\n\t\t\tconst snapshot = Snapshot.fromTree(node);\n\t\t\texpect(snapshot.getChangeNode(nodeId).traits.trait[0].identifier).to.equal(testNode.identifier);\n\t\t\texpect(snapshot.getChangeNode(nodeId).traits.emptyTrait).to.equal(undefined);\n\t\t});\n\t});\n\n\tdescribe('StableRange validation', () => {\n\t\tit('is malformed when anchors are malformed', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(simpleTreeSnapshotWithValidation, {\n\t\t\t\t\t// trait and sibling should be mutually exclusive\n\t\t\t\t\tstart: { referenceTrait: leftTraitLocation, referenceSibling: left.identifier, side: Side.Before },\n\t\t\t\t\tend: { referenceSibling: left.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).equals(EditValidationResult.Malformed);\n\t\t});\n\t\tit('is invalid when anchors are incorrectly ordered', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(simpleTreeSnapshotWithValidation, {\n\t\t\t\t\tstart: { referenceSibling: left.identifier, side: Side.After },\n\t\t\t\t\tend: { referenceSibling: left.identifier, side: Side.Before },\n\t\t\t\t})\n\t\t\t).equals(EditValidationResult.Invalid);\n\t\t});\n\t\tit('is invalid when anchors are in different traits', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(simpleTreeSnapshotWithValidation, {\n\t\t\t\t\tstart: { referenceSibling: left.identifier, side: Side.Before },\n\t\t\t\t\tend: { referenceSibling: right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).equals(EditValidationResult.Invalid);\n\t\t});\n\t\tit('is invalid when an anchor is invalid', () => {\n\t\t\texpect(\n\t\t\t\tvalidateStableRange(simpleTreeSnapshotWithValidation, {\n\t\t\t\t\tstart: { referenceSibling: '49a7e636-71ed-45f1-a1a8-2b8f2e7e84a3' as NodeId, side: Side.Before },\n\t\t\t\t\tend: { referenceSibling: right.identifier, side: Side.After },\n\t\t\t\t})\n\t\t\t).equals(EditValidationResult.Invalid);\n\t\t});\n\t});\n\n\tdescribe('Mutators', () => {\n\t\tconst label = 'label' as TraitLabel;\n\t\tconst nodeA = makeEmptyNode();\n\t\tconst nodeB = makeEmptyNode();\n\t\tconst tree: ChangeNode = {\n\t\t\t...makeEmptyNode(),\n\t\t\ttraits: { [label]: [nodeA, nodeB] },\n\t\t};\n\t\tconst startingSnapshot = Snapshot.fromTree(tree, true);\n\t\tit('can detach a single node', () => {\n\t\t\texpect(startingSnapshot.getIndexInTrait(nodeA.identifier)).to.equal(0);\n\t\t\texpect(startingSnapshot.getIndexInTrait(nodeB.identifier)).to.equal(1);\n\t\t\tconst { snapshot } = detachRange(startingSnapshot, StableRange.only(nodeA));\n\t\t\texpect(snapshot.size).to.equal(3);\n\t\t\texpect(snapshot.hasNode(nodeA.identifier)).to.be.true;\n\t\t\texpect(snapshot.getParentSnapshotNode(nodeA.identifier)).to.be.undefined;\n\t\t\texpect(snapshot.getParentSnapshotNode(nodeB.identifier)?.identifier).to.equal(tree.identifier);\n\t\t\texpect(snapshot.getIndexInTrait(nodeB.identifier)).to.equal(0);\n\t\t});\n\t\tit('can detach an entire trait', () => {\n\t\t\tconst { snapshot, detached } = detachRange(\n\t\t\t\tstartingSnapshot,\n\t\t\t\tStableRange.all({ parent: tree.identifier, label })\n\t\t\t);\n\t\t\texpect(detached).deep.equals([nodeA.identifier, nodeB.identifier]);\n\t\t\texpect(snapshot.size).to.equal(3);\n\t\t\texpect(snapshot.hasNode(nodeA.identifier)).to.be.true;\n\t\t\texpect(snapshot.hasNode(nodeB.identifier)).to.be.true;\n\t\t\texpect(snapshot.getParentSnapshotNode(nodeA.identifier)).to.be.undefined;\n\t\t\texpect(snapshot.getParentSnapshotNode(nodeB.identifier)).to.be.undefined;\n\t\t});\n\t\tit('can insert a node', () => {\n\t\t\tconst newNode = makeEmptyNode();\n\t\t\tlet snapshot = startingSnapshot.addNodes([{ ...newNode, traits: new Map() }]);\n\t\t\texpect(snapshot.size).to.equal(4);\n\t\t\texpect(snapshot.hasNode(newNode.identifier)).to.be.true;\n\t\t\texpect(snapshot.getParentSnapshotNode(newNode.identifier)).to.be.undefined;\n\t\t\tsnapshot = insertIntoTrait(\n\t\t\t\tsnapshot,\n\t\t\t\t[newNode.identifier],\n\t\t\t\tStablePlace.atStartOf({ parent: tree.identifier, label })\n\t\t\t);\n\t\t\texpect(snapshot.getParentSnapshotNode(newNode.identifier)?.identifier).to.equal(tree.identifier);\n\t\t\texpect(snapshot.getIndexInTrait(newNode.identifier)).to.equal(0);\n\t\t\texpect(snapshot.getIndexInTrait(nodeA.identifier)).to.equal(1);\n\t\t\texpect(snapshot.getIndexInTrait(nodeB.identifier)).to.equal(2);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapshotUtilities.tests.d.ts","sourceRoot":"","sources":["../../src/test/SnapshotUtilities.tests.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { FluidSerializer } from '@fluidframework/shared-object-base';
|
|
6
|
-
import { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';
|
|
7
|
-
import { expect } from 'chai';
|
|
8
|
-
import { comparePayloads } from '../Common';
|
|
9
|
-
describe('SnapshotUtilities', () => {
|
|
10
|
-
describe('comparePayloads', () => {
|
|
11
|
-
const serializer = new FluidSerializer(new MockFluidDataStoreRuntime().IFluidHandleContext, () => { });
|
|
12
|
-
const binder = { bind: () => void {} };
|
|
13
|
-
let Equality;
|
|
14
|
-
(function (Equality) {
|
|
15
|
-
Equality[Equality["Equal"] = 0] = "Equal";
|
|
16
|
-
Equality[Equality["Unequal"] = 1] = "Unequal";
|
|
17
|
-
Equality[Equality["Unspecified"] = 2] = "Unspecified";
|
|
18
|
-
})(Equality || (Equality = {}));
|
|
19
|
-
function checkEquality(equal, equality) {
|
|
20
|
-
if (equality !== Equality.Unspecified) {
|
|
21
|
-
expect(equal).equals(equality === Equality.Equal);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
function check(a, b, flags) {
|
|
25
|
-
// Check reflexive
|
|
26
|
-
expect(comparePayloads(a, a)).equal(true);
|
|
27
|
-
expect(comparePayloads(b, b)).equal(true);
|
|
28
|
-
checkEquality(comparePayloads(a, b), flags.initial);
|
|
29
|
-
// Check commutative
|
|
30
|
-
checkEquality(comparePayloads(b, a), flags.initial);
|
|
31
|
-
const [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);
|
|
32
|
-
const [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);
|
|
33
|
-
checkEquality(aString === bString, flags.serialized);
|
|
34
|
-
checkEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);
|
|
35
|
-
// Check commutative
|
|
36
|
-
checkEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);
|
|
37
|
-
}
|
|
38
|
-
function checkSerialization(a, roundtrip) {
|
|
39
|
-
const aString = serializer.stringify(a, binder);
|
|
40
|
-
const a2 = serializer.parse(aString);
|
|
41
|
-
const aString2 = serializer.stringify(a2, binder);
|
|
42
|
-
expect(aString2).equal(aString);
|
|
43
|
-
checkEquality(comparePayloads(a, a2), roundtrip);
|
|
44
|
-
// Check second round trip, should always be equal
|
|
45
|
-
const a3 = serializer.parse(aString2);
|
|
46
|
-
expect(comparePayloads(a3, a2)).true;
|
|
47
|
-
return [aString, a2];
|
|
48
|
-
}
|
|
49
|
-
const allEqual = {
|
|
50
|
-
initial: Equality.Equal,
|
|
51
|
-
serialized: Equality.Equal,
|
|
52
|
-
deserialized: Equality.Equal,
|
|
53
|
-
roundtrip: Equality.Equal,
|
|
54
|
-
};
|
|
55
|
-
// For when the inputs are logically equal, but may serialize differently due to field ordering.
|
|
56
|
-
const allEqualUnstable = {
|
|
57
|
-
initial: Equality.Equal,
|
|
58
|
-
serialized: Equality.Unspecified,
|
|
59
|
-
deserialized: Equality.Equal,
|
|
60
|
-
roundtrip: Equality.Equal,
|
|
61
|
-
};
|
|
62
|
-
const allUnequal = {
|
|
63
|
-
initial: Equality.Unequal,
|
|
64
|
-
serialized: Equality.Unequal,
|
|
65
|
-
deserialized: Equality.Unequal,
|
|
66
|
-
roundtrip: Equality.Equal,
|
|
67
|
-
};
|
|
68
|
-
it('compares numbers correctly', () => {
|
|
69
|
-
check(0, 0, allEqual);
|
|
70
|
-
check(1, 1, allEqual);
|
|
71
|
-
check(0, 1, allUnequal);
|
|
72
|
-
check(-1, 1, allUnequal);
|
|
73
|
-
check(5.2, 5.200000001, allUnequal);
|
|
74
|
-
});
|
|
75
|
-
it('compares strings', () => {
|
|
76
|
-
check('', '', allEqual);
|
|
77
|
-
check(' ', '', allUnequal);
|
|
78
|
-
check('1', '+1', allUnequal);
|
|
79
|
-
// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work
|
|
80
|
-
// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.
|
|
81
|
-
check('𤭢', '𤭢', allEqual);
|
|
82
|
-
check('𤭢', '', allUnequal);
|
|
83
|
-
check('several characters', 'several characters', allEqual);
|
|
84
|
-
check('several characters', 'several_characters', allUnequal);
|
|
85
|
-
});
|
|
86
|
-
it('compares arrays', () => {
|
|
87
|
-
check([], [], allEqual);
|
|
88
|
-
check([1], [1], allEqual);
|
|
89
|
-
check([[1]], [[1]], allEqual);
|
|
90
|
-
check([[1]], [[2]], allUnequal);
|
|
91
|
-
check([], [1], allUnequal);
|
|
92
|
-
check([1, 2], [2, 1], allUnequal);
|
|
93
|
-
});
|
|
94
|
-
it('compares objects', () => {
|
|
95
|
-
check({ 1: 'x' }, { 1: 'x' }, allEqual);
|
|
96
|
-
check({ x: 'x' }, { y: 'x' }, allUnequal);
|
|
97
|
-
check({ x: 'x' }, { x: {} }, allUnequal);
|
|
98
|
-
check({ x: {} }, { x: {} }, allEqual);
|
|
99
|
-
check({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);
|
|
100
|
-
check({ 1: 'x' }, {}, allUnequal);
|
|
101
|
-
check({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);
|
|
102
|
-
check({ field: 'a' }, { field: 'b' }, allUnequal);
|
|
103
|
-
// Fluid Serialization arbitrarily orders fields.
|
|
104
|
-
// Thus any object with more than one field may have non-deterministic serialization.
|
|
105
|
-
// However objects have field order, and we need to check comparePayloads is not impacted by it.
|
|
106
|
-
check({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);
|
|
107
|
-
});
|
|
108
|
-
it('compares mixed types', () => {
|
|
109
|
-
check({ 0: 1 }, [1], allUnequal);
|
|
110
|
-
// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)
|
|
111
|
-
check(null, 'null', allUnequal);
|
|
112
|
-
check(null, 'null', allUnequal);
|
|
113
|
-
check(1, '1', allUnequal);
|
|
114
|
-
check(null, 0, allUnequal);
|
|
115
|
-
check('', 0, allUnequal);
|
|
116
|
-
});
|
|
117
|
-
const sameAfter = {
|
|
118
|
-
initial: Equality.Unspecified,
|
|
119
|
-
serialized: Equality.Unspecified,
|
|
120
|
-
deserialized: Equality.Equal,
|
|
121
|
-
roundtrip: Equality.Unspecified,
|
|
122
|
-
};
|
|
123
|
-
const differentAfter = {
|
|
124
|
-
initial: Equality.Unequal,
|
|
125
|
-
serialized: Equality.Unequal,
|
|
126
|
-
deserialized: Equality.Unequal,
|
|
127
|
-
roundtrip: Equality.Unspecified,
|
|
128
|
-
};
|
|
129
|
-
it('lossy cases', () => {
|
|
130
|
-
// Undefined fields are omitted in json, and thus lost on the round trip.
|
|
131
|
-
check({ x: undefined }, { y: undefined }, sameAfter);
|
|
132
|
-
check({ x: undefined }, {}, sameAfter);
|
|
133
|
-
// NaN and Infinity become null
|
|
134
|
-
check(NaN, NaN, sameAfter);
|
|
135
|
-
check(NaN, 7, differentAfter);
|
|
136
|
-
check(Infinity, Infinity, sameAfter);
|
|
137
|
-
check(-Infinity, Infinity, sameAfter);
|
|
138
|
-
check(NaN, 'NaN', differentAfter);
|
|
139
|
-
// json loses -0 on round trip
|
|
140
|
-
check(-0, -0, sameAfter);
|
|
141
|
-
});
|
|
142
|
-
it('compares handles', () => {
|
|
143
|
-
function makeMockHandle(data) {
|
|
144
|
-
const handleObject = { absolutePath: data, IFluidHandle: undefined };
|
|
145
|
-
handleObject.IFluidHandle = handleObject;
|
|
146
|
-
const handle = handleObject;
|
|
147
|
-
// Handle gets modified by serializing. This is probably because handle is malformed.
|
|
148
|
-
// To avoid this being an issue, round trip it.
|
|
149
|
-
const serialized = serializer.stringify(handle, binder);
|
|
150
|
-
const finalHandle = serializer.parse(serialized);
|
|
151
|
-
return finalHandle;
|
|
152
|
-
}
|
|
153
|
-
// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic
|
|
154
|
-
// so use allEqualUnstable not allEqual.
|
|
155
|
-
check(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);
|
|
156
|
-
check(makeMockHandle('x'), makeMockHandle('y'), allUnequal);
|
|
157
|
-
check({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);
|
|
158
|
-
});
|
|
159
|
-
// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.
|
|
160
|
-
// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.
|
|
161
|
-
it.skip('strange cases', () => {
|
|
162
|
-
// Top level undefined fails in JSON.parse.
|
|
163
|
-
// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)
|
|
164
|
-
check(undefined, null, sameAfter);
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
//# sourceMappingURL=SnapshotUtilities.tests.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SnapshotUtilities.tests.js","sourceRoot":"","sources":["../../src/test/SnapshotUtilities.tests.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IFluidHandle } from '@fluidframework/core-interfaces';\nimport { FluidSerializer } from '@fluidframework/shared-object-base';\nimport { MockFluidDataStoreRuntime } from '@fluidframework/test-runtime-utils';\nimport { expect } from 'chai';\nimport { comparePayloads } from '../Common';\nimport { Payload } from '../generic';\n\ndescribe('SnapshotUtilities', () => {\n\tdescribe('comparePayloads', () => {\n\t\tconst serializer = new FluidSerializer(new MockFluidDataStoreRuntime().IFluidHandleContext, () => {});\n\t\tconst binder: IFluidHandle = { bind: () => void {} } as unknown as IFluidHandle;\n\n\t\tenum Equality {\n\t\t\tEqual,\n\t\t\tUnequal,\n\t\t\tUnspecified,\n\t\t}\n\n\t\tfunction checkEquality(equal: boolean, equality: Equality): void {\n\t\t\tif (equality !== Equality.Unspecified) {\n\t\t\t\texpect(equal).equals(equality === Equality.Equal);\n\t\t\t}\n\t\t}\n\n\t\tfunction check(\n\t\t\ta: Payload,\n\t\t\tb: Payload,\n\t\t\tflags: { initial: Equality; serialized: Equality; deserialized: Equality; roundtrip: Equality }\n\t\t): void {\n\t\t\t// Check reflexive\n\t\t\texpect(comparePayloads(a, a)).equal(true);\n\t\t\texpect(comparePayloads(b, b)).equal(true);\n\n\t\t\tcheckEquality(comparePayloads(a, b), flags.initial);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(b, a), flags.initial);\n\n\t\t\tconst [aString, aDeserialized] = checkSerialization(a, flags.roundtrip);\n\t\t\tconst [bString, bDeserialized] = checkSerialization(b, flags.roundtrip);\n\n\t\t\tcheckEquality(aString === bString, flags.serialized);\n\t\t\tcheckEquality(comparePayloads(aDeserialized, bDeserialized), flags.deserialized);\n\t\t\t// Check commutative\n\t\t\tcheckEquality(comparePayloads(bDeserialized, aDeserialized), flags.deserialized);\n\t\t}\n\n\t\tfunction checkSerialization(a: Payload, roundtrip: Equality): [string, Payload] {\n\t\t\tconst aString = serializer.stringify(a, binder);\n\t\t\tconst a2: Payload = serializer.parse(aString);\n\t\t\tconst aString2 = serializer.stringify(a2, binder);\n\t\t\texpect(aString2).equal(aString);\n\t\t\tcheckEquality(comparePayloads(a, a2), roundtrip);\n\n\t\t\t// Check second round trip, should always be equal\n\t\t\tconst a3: Payload = serializer.parse(aString2);\n\t\t\texpect(comparePayloads(a3, a2)).true;\n\n\t\t\treturn [aString, a2];\n\t\t}\n\n\t\tconst allEqual = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Equal,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\t// For when the inputs are logically equal, but may serialize differently due to field ordering.\n\t\tconst allEqualUnstable = {\n\t\t\tinitial: Equality.Equal,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tconst allUnequal = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Equal,\n\t\t};\n\n\t\tit('compares numbers correctly', () => {\n\t\t\tcheck(0, 0, allEqual);\n\t\t\tcheck(1, 1, allEqual);\n\t\t\tcheck(0, 1, allUnequal);\n\t\t\tcheck(-1, 1, allUnequal);\n\t\t\tcheck(5.2, 5.200000001, allUnequal);\n\t\t});\n\n\t\tit('compares strings', () => {\n\t\t\tcheck('', '', allEqual);\n\t\t\tcheck(' ', '', allUnequal);\n\t\t\tcheck('1', '+1', allUnequal);\n\t\t\t// This character makes sure multi-byte utf-8 and multi-word utf-16 at least somewhat work\n\t\t\t// Cases like unicode normalization are not covered here here. Normalization or not will be considered ok.\n\t\t\tcheck('𤭢', '𤭢', allEqual);\n\t\t\tcheck('𤭢', '', allUnequal);\n\t\t\tcheck('several characters', 'several characters', allEqual);\n\t\t\tcheck('several characters', 'several_characters', allUnequal);\n\t\t});\n\n\t\tit('compares arrays', () => {\n\t\t\tcheck([], [], allEqual);\n\t\t\tcheck([1], [1], allEqual);\n\t\t\tcheck([[1]], [[1]], allEqual);\n\t\t\tcheck([[1]], [[2]], allUnequal);\n\t\t\tcheck([], [1], allUnequal);\n\t\t\tcheck([1, 2], [2, 1], allUnequal);\n\t\t});\n\n\t\tit('compares objects', () => {\n\t\t\tcheck({ 1: 'x' }, { 1: 'x' }, allEqual);\n\t\t\tcheck({ x: 'x' }, { y: 'x' }, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: {} }, allUnequal);\n\t\t\tcheck({ x: {} }, { x: {} }, allEqual);\n\t\t\tcheck({ x: [1, 2, 3, 5] }, { x: [1, 2, 3, 4] }, allUnequal);\n\t\t\tcheck({ 1: 'x' }, {}, allUnequal);\n\t\t\tcheck({ x: 'x' }, { x: 'x', y: 'x' }, allUnequal);\n\t\t\tcheck({ field: 'a' }, { field: 'b' }, allUnequal);\n\n\t\t\t// Fluid Serialization arbitrarily orders fields.\n\t\t\t// Thus any object with more than one field may have non-deterministic serialization.\n\t\t\t// However objects have field order, and we need to check comparePayloads is not impacted by it.\n\t\t\tcheck({ y: 'a', x: 'b' }, { x: 'b', y: 'a' }, allEqualUnstable);\n\t\t});\n\n\t\tit('compares mixed types', () => {\n\t\t\tcheck({ 0: 1 }, [1], allUnequal);\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface)\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(null, 'null', allUnequal);\n\t\t\tcheck(1, '1', allUnequal);\n\t\t\tcheck(null, 0, allUnequal);\n\t\t\tcheck('', 0, allUnequal);\n\t\t});\n\n\t\tconst sameAfter = {\n\t\t\tinitial: Equality.Unspecified,\n\t\t\tserialized: Equality.Unspecified,\n\t\t\tdeserialized: Equality.Equal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\t\tconst differentAfter = {\n\t\t\tinitial: Equality.Unequal,\n\t\t\tserialized: Equality.Unequal,\n\t\t\tdeserialized: Equality.Unequal,\n\t\t\troundtrip: Equality.Unspecified,\n\t\t};\n\n\t\tit('lossy cases', () => {\n\t\t\t// Undefined fields are omitted in json, and thus lost on the round trip.\n\t\t\tcheck({ x: undefined }, { y: undefined }, sameAfter);\n\t\t\tcheck({ x: undefined }, {}, sameAfter);\n\n\t\t\t// NaN and Infinity become null\n\t\t\tcheck(NaN, NaN, sameAfter);\n\t\t\tcheck(NaN, 7, differentAfter);\n\t\t\tcheck(Infinity, Infinity, sameAfter);\n\t\t\tcheck(-Infinity, Infinity, sameAfter);\n\t\t\tcheck(NaN, 'NaN', differentAfter);\n\n\t\t\t// json loses -0 on round trip\n\t\t\tcheck(-0, -0, sameAfter);\n\t\t});\n\n\t\tit('compares handles', () => {\n\t\t\tfunction makeMockHandle(data: string): IFluidHandle {\n\t\t\t\tconst handleObject = { absolutePath: data, IFluidHandle: undefined as unknown };\n\t\t\t\thandleObject.IFluidHandle = handleObject;\n\t\t\t\tconst handle = handleObject as IFluidHandle;\n\t\t\t\t// Handle gets modified by serializing. This is probably because handle is malformed.\n\t\t\t\t// To avoid this being an issue, round trip it.\n\t\t\t\tconst serialized = serializer.stringify(handle, binder);\n\t\t\t\tconst finalHandle: IFluidHandle = serializer.parse(serialized);\n\t\t\t\treturn finalHandle;\n\t\t\t}\n\t\t\t// Theoretically handles serialize as objects with 2 fields and thus serialization is allowed to be non-deterministic\n\t\t\t// so use allEqualUnstable not allEqual.\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('x'), allEqualUnstable);\n\t\t\tcheck(makeMockHandle('x'), makeMockHandle('y'), allUnequal);\n\t\t\tcheck({ x: makeMockHandle('x') }, makeMockHandle('x'), allUnequal);\n\t\t});\n\n\t\t// These are cases that are allowed by the type system and produce unexpected results due to Json serialization.\n\t\t// Clear documentation and/or adjustments to equality, type checking or serialization would help with these cases.\n\t\tit.skip('strange cases', () => {\n\t\t\t// Top level undefined fails in JSON.parse.\n\t\t\t// Rationale: 'undefined' is reserved for future use (see 'SetValue' interface.)\n\t\t\tcheck(undefined, null, sameAfter);\n\t\t});\n\t});\n});\n"]}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { IRevertible } from '../default-edits/UndoRedoHandler';
|
|
6
|
-
/**
|
|
7
|
-
* Manages the Undo and Redo stacks, and operations withing those stacks.
|
|
8
|
-
* Allows adding items to the current operation on the stack, closing the current operation,
|
|
9
|
-
* and issuing and undo or a redo.
|
|
10
|
-
*/
|
|
11
|
-
export declare class UndoRedoStackManager {
|
|
12
|
-
private static revert;
|
|
13
|
-
private readonly undoStack;
|
|
14
|
-
private readonly redoStack;
|
|
15
|
-
private mode;
|
|
16
|
-
private readonly eventEmitter;
|
|
17
|
-
constructor();
|
|
18
|
-
closeCurrentOperation(): void;
|
|
19
|
-
on(event: 'changePushed', listener: () => void): void;
|
|
20
|
-
removeListener(event: 'changePushed', listener: () => void): void;
|
|
21
|
-
undoOperation(): boolean;
|
|
22
|
-
redoOperation(): boolean;
|
|
23
|
-
pushToCurrentOperation(revertible: IRevertible): void;
|
|
24
|
-
private clearRedoStack;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=undoRedoStackManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"undoRedoStackManager.d.ts","sourceRoot":"","sources":["../../src/test/undoRedoStackManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAmE/D;;;;GAIG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,MAAM,CAAC,MAAM;IA+BrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;;IAO5C,qBAAqB;IAMrB,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI;IAG9C,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,IAAI;IAI1D,aAAa,IAAI,OAAO;IAUxB,aAAa,IAAI,OAAO;IAUxB,sBAAsB,CAAC,UAAU,EAAE,WAAW;IA4BrD,OAAO,CAAC,cAAc;CAatB"}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
// TODO: This is a temporary copy of the 'UndoRedoStackManager' from 'framework/undo-redo'
|
|
6
|
-
// to unblock testing of SharedMatrix undo while we decide on the correct layering
|
|
7
|
-
// for undo.
|
|
8
|
-
import { EventEmitter } from 'events';
|
|
9
|
-
var UndoRedoMode;
|
|
10
|
-
(function (UndoRedoMode) {
|
|
11
|
-
UndoRedoMode[UndoRedoMode["None"] = 0] = "None";
|
|
12
|
-
UndoRedoMode[UndoRedoMode["Redo"] = 1] = "Redo";
|
|
13
|
-
UndoRedoMode[UndoRedoMode["Undo"] = 2] = "Undo";
|
|
14
|
-
})(UndoRedoMode || (UndoRedoMode = {}));
|
|
15
|
-
/**
|
|
16
|
-
* Helper class for createing a stack over an array
|
|
17
|
-
*/
|
|
18
|
-
class Stack {
|
|
19
|
-
constructor(...items) {
|
|
20
|
-
this.items = [];
|
|
21
|
-
if (items !== undefined) {
|
|
22
|
-
items.forEach((item) => this.push(item));
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
empty() {
|
|
26
|
-
return this.items.length === 0;
|
|
27
|
-
}
|
|
28
|
-
top() {
|
|
29
|
-
if (!this.empty()) {
|
|
30
|
-
return this.items[0];
|
|
31
|
-
}
|
|
32
|
-
return undefined;
|
|
33
|
-
}
|
|
34
|
-
pop() {
|
|
35
|
-
return this.items.shift();
|
|
36
|
-
}
|
|
37
|
-
push(item) {
|
|
38
|
-
this.items.unshift(item);
|
|
39
|
-
if (this.itemPushedCallback !== undefined) {
|
|
40
|
-
this.itemPushedCallback();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Helper class for creating the Undo and Redo stacks
|
|
46
|
-
*/
|
|
47
|
-
class UndoRedoStack extends Stack {
|
|
48
|
-
push(item) {
|
|
49
|
-
if (item !== undefined) {
|
|
50
|
-
item.itemPushedCallback = () => this.callItemPushedCallback;
|
|
51
|
-
}
|
|
52
|
-
super.push(item);
|
|
53
|
-
}
|
|
54
|
-
closeCurrentOperationIfInProgress() {
|
|
55
|
-
if (this.top() !== undefined) {
|
|
56
|
-
this.push(undefined);
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
this.callItemPushedCallback();
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
callItemPushedCallback() {
|
|
63
|
-
if (this.itemPushedCallback !== undefined) {
|
|
64
|
-
this.itemPushedCallback();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Manages the Undo and Redo stacks, and operations withing those stacks.
|
|
70
|
-
* Allows adding items to the current operation on the stack, closing the current operation,
|
|
71
|
-
* and issuing and undo or a redo.
|
|
72
|
-
*/
|
|
73
|
-
export class UndoRedoStackManager {
|
|
74
|
-
constructor() {
|
|
75
|
-
this.undoStack = new UndoRedoStack();
|
|
76
|
-
this.redoStack = new UndoRedoStack();
|
|
77
|
-
this.mode = UndoRedoMode.None;
|
|
78
|
-
this.eventEmitter = new EventEmitter();
|
|
79
|
-
this.undoStack.itemPushedCallback = () => this.eventEmitter.emit('changePushed');
|
|
80
|
-
this.redoStack.itemPushedCallback = () => this.eventEmitter.emit('changePushed');
|
|
81
|
-
}
|
|
82
|
-
static revert(revertStack, pushStack) {
|
|
83
|
-
// Close the pushStack, as it could get new ops
|
|
84
|
-
// from the revert, and we don't want those combined
|
|
85
|
-
// with any existing operation
|
|
86
|
-
pushStack.closeCurrentOperationIfInProgress();
|
|
87
|
-
// Search the revert stack for the first defined operation stack
|
|
88
|
-
while (!revertStack.empty() && revertStack.top() === undefined) {
|
|
89
|
-
revertStack.pop();
|
|
90
|
-
}
|
|
91
|
-
// If there is a defined operation stack, revert it
|
|
92
|
-
if (!revertStack.empty()) {
|
|
93
|
-
const operationStack = revertStack.pop();
|
|
94
|
-
if (operationStack !== undefined) {
|
|
95
|
-
while (!operationStack.empty()) {
|
|
96
|
-
const operation = operationStack.pop();
|
|
97
|
-
if (operation !== undefined) {
|
|
98
|
-
operation.revert();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Make sure both stacks have any open operations
|
|
104
|
-
// closed, since we won't want anything added to those
|
|
105
|
-
//
|
|
106
|
-
revertStack.closeCurrentOperationIfInProgress();
|
|
107
|
-
pushStack.closeCurrentOperationIfInProgress();
|
|
108
|
-
}
|
|
109
|
-
closeCurrentOperation() {
|
|
110
|
-
if (this.mode === UndoRedoMode.None) {
|
|
111
|
-
this.undoStack.closeCurrentOperationIfInProgress();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
on(event, listener) {
|
|
115
|
-
this.eventEmitter.on(event, listener);
|
|
116
|
-
}
|
|
117
|
-
removeListener(event, listener) {
|
|
118
|
-
this.eventEmitter.removeListener(event, listener);
|
|
119
|
-
}
|
|
120
|
-
undoOperation() {
|
|
121
|
-
if (this.undoStack.empty()) {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
this.mode = UndoRedoMode.Undo;
|
|
125
|
-
UndoRedoStackManager.revert(this.undoStack, this.redoStack);
|
|
126
|
-
this.mode = UndoRedoMode.None;
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
redoOperation() {
|
|
130
|
-
if (this.redoStack.empty()) {
|
|
131
|
-
return false;
|
|
132
|
-
}
|
|
133
|
-
this.mode = UndoRedoMode.Redo;
|
|
134
|
-
UndoRedoStackManager.revert(this.redoStack, this.undoStack);
|
|
135
|
-
this.mode = UndoRedoMode.None;
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
|
-
pushToCurrentOperation(revertible) {
|
|
139
|
-
let currentStack;
|
|
140
|
-
switch (this.mode) {
|
|
141
|
-
case UndoRedoMode.None:
|
|
142
|
-
currentStack = this.undoStack;
|
|
143
|
-
this.clearRedoStack();
|
|
144
|
-
break;
|
|
145
|
-
case UndoRedoMode.Redo:
|
|
146
|
-
currentStack = this.undoStack;
|
|
147
|
-
break;
|
|
148
|
-
case UndoRedoMode.Undo:
|
|
149
|
-
currentStack = this.redoStack;
|
|
150
|
-
break;
|
|
151
|
-
default:
|
|
152
|
-
throw new Error('unknown mode');
|
|
153
|
-
}
|
|
154
|
-
const operationStack = currentStack.top();
|
|
155
|
-
if (operationStack === undefined) {
|
|
156
|
-
currentStack.push(new Stack(revertible));
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
operationStack.push(revertible);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
clearRedoStack() {
|
|
163
|
-
while (!this.redoStack.empty()) {
|
|
164
|
-
const redoOpertionStack = this.redoStack.pop();
|
|
165
|
-
if (redoOpertionStack !== undefined) {
|
|
166
|
-
while (!redoOpertionStack.empty()) {
|
|
167
|
-
const redoOperation = redoOpertionStack.pop();
|
|
168
|
-
if (redoOperation !== undefined) {
|
|
169
|
-
redoOperation.discard();
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
//# sourceMappingURL=undoRedoStackManager.js.map
|