@fluid-experimental/tree 0.58.2000 → 0.58.3000-61081
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 +9 -9
- 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 -100
- 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 +59 -31
- 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 +130 -85
- package/dist/LogViewer.d.ts.map +1 -1
- package/dist/LogViewer.js +110 -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 +90 -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 +400 -0
- package/dist/SharedTree.d.ts.map +1 -0
- package/dist/SharedTree.js +1064 -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 +53 -0
- package/dist/Transaction.d.ts.map +1 -0
- package/dist/Transaction.js +76 -0
- package/dist/Transaction.js.map +1 -0
- package/dist/TransactionInternal.d.ts +543 -0
- package/dist/TransactionInternal.d.ts.map +1 -0
- package/dist/TransactionInternal.js +622 -0
- package/dist/TransactionInternal.js.map +1 -0
- package/dist/TreeCompressor.d.ts +37 -0
- package/dist/TreeCompressor.d.ts.map +1 -0
- package/dist/TreeCompressor.js +132 -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 +217 -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/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 -100
- 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 +51 -23
- 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 +130 -85
- package/lib/LogViewer.d.ts.map +1 -1
- package/lib/LogViewer.js +102 -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 +90 -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 +400 -0
- package/lib/SharedTree.d.ts.map +1 -0
- package/lib/SharedTree.js +1059 -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 +53 -0
- package/lib/Transaction.d.ts.map +1 -0
- package/lib/Transaction.js +72 -0
- package/lib/Transaction.js.map +1 -0
- package/lib/TransactionInternal.d.ts +543 -0
- package/lib/TransactionInternal.d.ts.map +1 -0
- package/lib/TransactionInternal.js +618 -0
- package/lib/TransactionInternal.js.map +1 -0
- package/lib/TreeCompressor.d.ts +37 -0
- package/lib/TreeCompressor.d.ts.map +1 -0
- package/lib/TreeCompressor.js +128 -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 +213 -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 +269 -187
- 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 +76 -330
- 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 +147 -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 +147 -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 +200 -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 +345 -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 +19 -14
- package/src/ChangeCompression.ts +159 -0
- package/src/{default-edits/PersistedTypes.ts → ChangeTypes.ts} +62 -120
- package/src/Checkout.ts +81 -52
- 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 +141 -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 +1448 -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 +94 -0
- package/src/TransactionInternal.ts +1088 -0
- package/src/TreeCompressor.ts +222 -0
- package/src/TreeNodeHandle.ts +19 -32
- package/src/TreeView.ts +321 -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 +119 -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/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
|
@@ -5,73 +5,126 @@
|
|
|
5
5
|
import { expect } from 'chai';
|
|
6
6
|
import { v4 as uuidv4 } from 'uuid';
|
|
7
7
|
import { EditLog } from '../EditLog';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
8
|
+
import { CachingLogViewer, } from '../LogViewer';
|
|
9
|
+
import { assert, copyPropertyIfDefined } from '../Common';
|
|
10
|
+
import { initialTree } from '../InitialTree';
|
|
11
|
+
import { ChangeInternal, ConstraintEffect, EditStatus, StablePlaceInternal, } from '../persisted-types';
|
|
12
|
+
import { areRevisionViewsSemanticallyEqual, newEdit } from '../EditUtilities';
|
|
13
|
+
import { RevisionView } from '../RevisionView';
|
|
14
|
+
import { TransactionInternal } from '../TransactionInternal';
|
|
15
|
+
import { StableRange } from '../ChangeTypes';
|
|
16
|
+
import { expectDefined } from './utilities/TestCommon';
|
|
17
|
+
import { buildLeaf } from './utilities/TestNode';
|
|
14
18
|
import { MockTransaction } from './utilities/MockTransaction';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
import { refreshTestTree, testTraitLabel } from './utilities/TestUtilities';
|
|
20
|
+
/**
|
|
21
|
+
* Creates an {@link EditLog} and accompanying {@link RevisionView} with pre-existing edits.
|
|
22
|
+
*
|
|
23
|
+
* @remarks Intended to be used with {@link getSimpleLogBaseView}
|
|
24
|
+
* @param testTree - Test tree to work on
|
|
25
|
+
* @param numEdits - The number of edits to make to the base tree
|
|
26
|
+
*/
|
|
27
|
+
function getTestTreeLog(testTree) {
|
|
28
|
+
const log = new EditLog();
|
|
29
|
+
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeaf(testTree.left.identifier)], StablePlaceInternal.atStartOf(testTree.left.traitLocation))), { sequenceNumber: 1, referenceSequenceNumber: 0 });
|
|
30
|
+
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeaf(testTree.right.identifier)], StablePlaceInternal.atStartOf(testTree.right.traitLocation))), { sequenceNumber: 2, referenceSequenceNumber: 1 });
|
|
31
|
+
return log;
|
|
32
|
+
}
|
|
33
|
+
function getLogWithNumEdits(nodeIdContext, numEdits) {
|
|
18
34
|
const log = new EditLog();
|
|
19
35
|
for (let i = 0; i < numEdits; i++) {
|
|
20
|
-
log.addSequencedEdit(newEdit(
|
|
21
|
-
|
|
22
|
-
:
|
|
36
|
+
log.addSequencedEdit(newEdit(ChangeInternal.insertTree([buildLeaf(nodeIdContext.generateNodeId())], StablePlaceInternal.atStartOf({
|
|
37
|
+
label: testTraitLabel,
|
|
38
|
+
parent: nodeIdContext.convertToNodeId(initialTree.identifier),
|
|
39
|
+
}))), {
|
|
40
|
+
sequenceNumber: i + 1,
|
|
41
|
+
referenceSequenceNumber: i,
|
|
42
|
+
});
|
|
23
43
|
}
|
|
24
44
|
return log;
|
|
25
45
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
46
|
+
/**
|
|
47
|
+
* Get a base view for a log created with {@link getTestTreeLog}.
|
|
48
|
+
* This can then be used to construct a {@link LogViewer} for that log.
|
|
49
|
+
*
|
|
50
|
+
* @param testTree - Test tree to work from
|
|
51
|
+
*/
|
|
52
|
+
function getSimpleLogBaseView(testTree) {
|
|
53
|
+
const node = { definition: testTree.definition, identifier: testTree.identifier, traits: {} };
|
|
54
|
+
copyPropertyIfDefined(testTree, node, 'payload');
|
|
55
|
+
return RevisionView.fromTree(node);
|
|
56
|
+
}
|
|
57
|
+
function getSimpleLogWithLocalEdits(testTree) {
|
|
58
|
+
const logWithLocalEdits = getTestTreeLog(testTree);
|
|
59
|
+
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.left.traitLocation))));
|
|
60
|
+
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
61
|
+
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.left.traitLocation))));
|
|
31
62
|
return logWithLocalEdits;
|
|
32
63
|
}
|
|
33
|
-
function
|
|
34
|
-
const
|
|
64
|
+
function getViewsForLog(log, baseView) {
|
|
65
|
+
const views = [baseView];
|
|
35
66
|
for (let i = 0; i < log.length; i++) {
|
|
36
67
|
const edit = log.getEditInSessionAtIndex(i);
|
|
37
|
-
|
|
68
|
+
const result = TransactionInternal.factory(views[i]).applyChanges(edit.changes).close();
|
|
69
|
+
if (result.status === EditStatus.Applied) {
|
|
70
|
+
views.push(result.after);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
expect.fail('edit failed to apply');
|
|
74
|
+
}
|
|
38
75
|
}
|
|
39
|
-
return
|
|
76
|
+
return views;
|
|
40
77
|
}
|
|
41
78
|
function runLogViewerCorrectnessTests(viewerCreator) {
|
|
42
79
|
return describe('LogViewer', () => {
|
|
43
|
-
|
|
80
|
+
let simpleLog;
|
|
81
|
+
let simpleLogBaseView;
|
|
82
|
+
let simpleLogInitialView;
|
|
83
|
+
const testTree = refreshTestTree(undefined, (t) => {
|
|
84
|
+
simpleLogBaseView = getSimpleLogBaseView(t);
|
|
85
|
+
simpleLog = getTestTreeLog(t);
|
|
86
|
+
simpleLogInitialView = t.view;
|
|
87
|
+
});
|
|
44
88
|
it('generates initialTree by default for the 0th revision', () => {
|
|
45
|
-
const viewer = viewerCreator(new EditLog());
|
|
46
|
-
const
|
|
47
|
-
expect(
|
|
89
|
+
const viewer = viewerCreator(new EditLog(), simpleLogBaseView);
|
|
90
|
+
const headView = viewer.getRevisionViewInSession(0);
|
|
91
|
+
expect(headView.equals(expectDefined(RevisionView.fromTree(initialTree, testTree))));
|
|
48
92
|
});
|
|
49
93
|
it('can be constructed from a non-empty EditLog', () => {
|
|
50
|
-
const viewer = viewerCreator(
|
|
51
|
-
const
|
|
52
|
-
expect(
|
|
94
|
+
const viewer = viewerCreator(simpleLog, simpleLogBaseView);
|
|
95
|
+
const headView = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
96
|
+
expect(areRevisionViewsSemanticallyEqual(headView, testTree, simpleLogInitialView, testTree));
|
|
97
|
+
expect(headView.equals(simpleLogInitialView)).to.be.true;
|
|
53
98
|
});
|
|
54
|
-
it('can generate all
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
expect(
|
|
60
|
-
|
|
61
|
-
|
|
99
|
+
it('can generate all revision views for an EditLog', () => {
|
|
100
|
+
const baseView = expectDefined(RevisionView.fromTree(initialTree, testTree));
|
|
101
|
+
const numNodes = 10;
|
|
102
|
+
const viewer = viewerCreator(getLogWithNumEdits(testTree, numNodes), baseView);
|
|
103
|
+
const initialRevision = viewer.getRevisionViewInSession(0);
|
|
104
|
+
expect(initialRevision.equals(baseView)).to.be.true;
|
|
105
|
+
expect(initialRevision.size).to.equal(1);
|
|
106
|
+
const oneNodeView = viewer.getRevisionViewInSession(1);
|
|
107
|
+
const testTrait = {
|
|
108
|
+
label: testTraitLabel,
|
|
109
|
+
parent: testTree.convertToNodeId(initialTree.identifier),
|
|
110
|
+
};
|
|
111
|
+
expect(oneNodeView.getTrait(testTrait).length).to.equal(1);
|
|
112
|
+
const twoNodeView = viewer.getRevisionViewInSession(2);
|
|
113
|
+
expect(twoNodeView.getTrait(testTrait).length).to.equal(2);
|
|
114
|
+
const finalView = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
115
|
+
expect(finalView.getTrait(testTrait).length).to.equal(numNodes);
|
|
62
116
|
});
|
|
63
|
-
it('produces correct
|
|
64
|
-
const simpleLog = getSimpleLog();
|
|
117
|
+
it('produces correct revision views when the log is mutated', () => {
|
|
65
118
|
const mutableLog = new EditLog();
|
|
66
|
-
const viewer = viewerCreator(mutableLog,
|
|
67
|
-
const
|
|
119
|
+
const viewer = viewerCreator(mutableLog, simpleLogBaseView);
|
|
120
|
+
const viewsForLog = getViewsForLog(simpleLog, simpleLogBaseView);
|
|
68
121
|
// This test takes an empty log (A) and a log with edits in it (B), and adds the edits from B to A.
|
|
69
|
-
// After each addition, the test code will iterate from [0, length_of_A] and get a
|
|
70
|
-
// and assert that none of the
|
|
122
|
+
// After each addition, the test code will iterate from [0, length_of_A] and get a view for each revision via LogViewer
|
|
123
|
+
// and assert that none of the views differ from those created via pure Transaction APIs.
|
|
71
124
|
for (let i = 0; i <= simpleLog.length; i++) {
|
|
72
125
|
for (let j = 0; j <= mutableLog.length; j++) {
|
|
73
|
-
const
|
|
74
|
-
expect(
|
|
126
|
+
const viewerView = viewer.getRevisionViewInSession(j);
|
|
127
|
+
expect(viewerView.equals(viewsForLog[j])).to.be.true;
|
|
75
128
|
}
|
|
76
129
|
// Revisions are from [0, simpleLog.length], edits are at indices [0, simpleLog.length)
|
|
77
130
|
if (i < simpleLog.length) {
|
|
@@ -80,95 +133,106 @@ function runLogViewerCorrectnessTests(viewerCreator) {
|
|
|
80
133
|
}
|
|
81
134
|
}
|
|
82
135
|
});
|
|
83
|
-
it('produces correct
|
|
84
|
-
function
|
|
85
|
-
const
|
|
136
|
+
it('produces correct revision views when local edits are shifted in the log due to sequenced edits being added', () => {
|
|
137
|
+
function getViewsFromViewer(viewer, lastRevision) {
|
|
138
|
+
const views = [];
|
|
86
139
|
for (let i = 0; i <= lastRevision; i++) {
|
|
87
|
-
|
|
140
|
+
views.push(viewer.getRevisionViewInSession(i));
|
|
88
141
|
}
|
|
89
|
-
return
|
|
142
|
+
return views;
|
|
90
143
|
}
|
|
91
|
-
function
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
expect(
|
|
95
|
-
for (let i = 0; i <
|
|
96
|
-
expect(
|
|
144
|
+
function expectViewsAreEqual(log, viewer) {
|
|
145
|
+
const viewsForLog = getViewsForLog(log, simpleLogBaseView);
|
|
146
|
+
const viewsForViewer = getViewsFromViewer(viewer, log.length);
|
|
147
|
+
expect(viewsForLog.length).to.equal(viewsForViewer.length);
|
|
148
|
+
for (let i = 0; i < viewsForLog.length; i++) {
|
|
149
|
+
expect(viewsForLog[i].equals(viewsForViewer[i])).to.be.true;
|
|
97
150
|
}
|
|
98
151
|
}
|
|
99
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits();
|
|
100
|
-
const viewer = viewerCreator(logWithLocalEdits,
|
|
101
|
-
|
|
152
|
+
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
153
|
+
const viewer = viewerCreator(logWithLocalEdits, simpleLogBaseView);
|
|
154
|
+
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
102
155
|
let seqNumber = 1;
|
|
103
|
-
// Sequence the existing local edits and ensure viewer generates the correct
|
|
156
|
+
// Sequence the existing local edits and ensure viewer generates the correct views
|
|
104
157
|
while (logWithLocalEdits.numberOfLocalEdits > 0) {
|
|
105
158
|
// Add a remote sequenced edit
|
|
106
|
-
logWithLocalEdits.addSequencedEdit(newEdit(
|
|
159
|
+
logWithLocalEdits.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.right.traitLocation))), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
107
160
|
++seqNumber;
|
|
108
|
-
|
|
161
|
+
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
109
162
|
// Sequence a local edit
|
|
110
163
|
logWithLocalEdits.addSequencedEdit(logWithLocalEdits.getEditInSessionAtIndex(logWithLocalEdits.numberOfSequencedEdits), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
111
164
|
++seqNumber;
|
|
112
|
-
|
|
165
|
+
expectViewsAreEqual(logWithLocalEdits, viewer);
|
|
113
166
|
}
|
|
114
167
|
});
|
|
115
168
|
});
|
|
116
169
|
}
|
|
117
170
|
describe('CachingLogViewer', () => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
171
|
+
// TODO: Dedupe? shared hook for getting all of this stuff?
|
|
172
|
+
let simpleLog;
|
|
173
|
+
let simpleLogBaseView;
|
|
174
|
+
let simpleLogInitialView;
|
|
175
|
+
// An arbitrary revision view which can be used to check to see if it gets used when provided as a cached value.
|
|
176
|
+
let arbitraryRevisionView;
|
|
177
|
+
const testTree = refreshTestTree(undefined, (t) => {
|
|
178
|
+
simpleLogBaseView = getSimpleLogBaseView(t);
|
|
179
|
+
simpleLog = getTestTreeLog(t);
|
|
180
|
+
simpleLogInitialView = t.view;
|
|
181
|
+
arbitraryRevisionView = RevisionView.fromTree(t.buildLeaf(t.generateNodeId()));
|
|
182
|
+
});
|
|
183
|
+
function getCachingLogViewerAssumeAppliedEdits(log, baseView, editStatusCallback, sequencedEditResultCallback, knownRevisions) {
|
|
184
|
+
return new CachingLogViewer(log, baseView, knownRevisions === null || knownRevisions === void 0 ? void 0 : knownRevisions.map((pair) => [pair[0], { view: pair[1], result: EditStatus.Applied }]),
|
|
185
|
+
/* expensiveValidation */ true, editStatusCallback, sequencedEditResultCallback, TransactionInternal.factory, log.numberOfSequencedEdits);
|
|
124
186
|
}
|
|
125
187
|
runLogViewerCorrectnessTests(getCachingLogViewerAssumeAppliedEdits);
|
|
126
|
-
it('detects non-integer revisions when setting
|
|
127
|
-
expect(() =>
|
|
128
|
-
|
|
129
|
-
|
|
188
|
+
it('detects non-integer revisions when setting revision views', async () => {
|
|
189
|
+
expect(() => {
|
|
190
|
+
return getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, [
|
|
191
|
+
[2.4, simpleLogInitialView],
|
|
192
|
+
]);
|
|
193
|
+
}).to.throw('revision must be an integer');
|
|
130
194
|
});
|
|
131
|
-
it('detects out-of-bounds revisions when setting
|
|
132
|
-
expect(() =>
|
|
133
|
-
|
|
134
|
-
|
|
195
|
+
it('detects out-of-bounds revisions when setting revision views', async () => {
|
|
196
|
+
expect(() => {
|
|
197
|
+
return getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, [
|
|
198
|
+
[1000, simpleLogInitialView],
|
|
199
|
+
]);
|
|
200
|
+
}).to.throw('revision must correspond to the result of a SequencedEdit');
|
|
135
201
|
});
|
|
136
202
|
it('can be created with known revisions', async () => {
|
|
137
|
-
const
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
const snapshot = snapshots[i];
|
|
142
|
-
expect(viewer.getSnapshotInSession(i).equals(snapshot)).to.be.true;
|
|
203
|
+
const views = getViewsForLog(simpleLog, simpleLogBaseView);
|
|
204
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, undefined, undefined, Array.from(views.keys()).map((revision) => [revision, views[revision]]));
|
|
205
|
+
for (let i = simpleLog.length; i >= 0; i--) {
|
|
206
|
+
expect(viewer.getRevisionViewInSession(i).equals(views[i])).to.be.true;
|
|
143
207
|
}
|
|
144
208
|
});
|
|
145
|
-
async function
|
|
209
|
+
async function requestAllRevisionViews(viewer, log) {
|
|
146
210
|
for (let i = 0; i <= log.length; i++) {
|
|
147
|
-
await viewer.
|
|
211
|
+
await viewer.getRevisionView(i);
|
|
148
212
|
}
|
|
149
213
|
}
|
|
150
|
-
it('caches
|
|
151
|
-
const log = getSimpleLog();
|
|
214
|
+
it('caches revision views for sequenced edits', async () => {
|
|
152
215
|
let editsProcessed = 0;
|
|
153
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(
|
|
154
|
-
assert(
|
|
155
|
-
await
|
|
156
|
-
expect(editsProcessed).to.equal(
|
|
157
|
-
// Ask for every
|
|
158
|
-
for (let i = 0; i <=
|
|
159
|
-
await viewer.
|
|
216
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, () => editsProcessed++);
|
|
217
|
+
assert(simpleLog.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
218
|
+
await requestAllRevisionViews(viewer, simpleLog);
|
|
219
|
+
expect(editsProcessed).to.equal(simpleLog.length);
|
|
220
|
+
// Ask for every view; no edit application should occur, since the views will be cached.
|
|
221
|
+
for (let i = 0; i <= simpleLog.length; i++) {
|
|
222
|
+
await viewer.getRevisionView(i);
|
|
160
223
|
}
|
|
161
|
-
expect(editsProcessed).to.equal(
|
|
224
|
+
expect(editsProcessed).to.equal(simpleLog.length);
|
|
162
225
|
});
|
|
163
226
|
it('caches edit results for sequenced edits', async () => {
|
|
164
|
-
const log = getSimpleLog(2);
|
|
165
227
|
// Add an invalid edit
|
|
166
|
-
|
|
228
|
+
simpleLog.addSequencedEdit(newEdit([
|
|
229
|
+
ChangeInternal.constraint(StableRange.only(testTree.left), ConstraintEffect.InvalidAndDiscard, undefined, 0),
|
|
230
|
+
]), { sequenceNumber: 3, referenceSequenceNumber: 2, minimumSequenceNumber: 2 });
|
|
167
231
|
let editsProcessed = 0;
|
|
168
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(
|
|
169
|
-
assert(
|
|
170
|
-
await
|
|
171
|
-
expect(editsProcessed).to.equal(
|
|
232
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView, () => editsProcessed++);
|
|
233
|
+
assert(simpleLog.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
234
|
+
await requestAllRevisionViews(viewer, simpleLog);
|
|
235
|
+
expect(editsProcessed).to.equal(simpleLog.length);
|
|
172
236
|
expect((await viewer.getEditResult(0)).status).equals(undefined);
|
|
173
237
|
expect((await viewer.getEditResult(1)).status).equals(EditStatus.Applied);
|
|
174
238
|
expect((await viewer.getEditResult(2)).status).equals(EditStatus.Applied);
|
|
@@ -178,202 +242,220 @@ describe('CachingLogViewer', () => {
|
|
|
178
242
|
expect(viewer.getEditResultInSession(2).status).equals(EditStatus.Applied);
|
|
179
243
|
expect(viewer.getEditResultInSession(3).status).equals(EditStatus.Invalid);
|
|
180
244
|
});
|
|
181
|
-
it('
|
|
245
|
+
it('caches the highest revision', async () => {
|
|
246
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(simpleLog, simpleLogBaseView);
|
|
247
|
+
expect(viewer.highestRevisionCached()).to.be.false;
|
|
248
|
+
await requestAllRevisionViews(viewer, simpleLog);
|
|
249
|
+
expect(viewer.highestRevisionCached()).to.be.true;
|
|
250
|
+
simpleLog.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
251
|
+
simpleLog.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))), {
|
|
252
|
+
sequenceNumber: 3,
|
|
253
|
+
referenceSequenceNumber: 2,
|
|
254
|
+
minimumSequenceNumber: 2,
|
|
255
|
+
});
|
|
256
|
+
expect(viewer.highestRevisionCached()).to.be.false;
|
|
257
|
+
});
|
|
258
|
+
it('evicts least recently set cached revision views for sequenced edits', async () => {
|
|
182
259
|
let editsProcessed = 0;
|
|
183
|
-
const log =
|
|
184
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
260
|
+
const log = getLogWithNumEdits(testTree, CachingLogViewer.sequencedCacheSizeMax * 2);
|
|
261
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, expectDefined(RevisionView.fromTree(initialTree, testTree)), () => editsProcessed++);
|
|
185
262
|
viewer.setMinimumSequenceNumber(log.length + 1); // simulate all edits being subject to eviction
|
|
186
|
-
await
|
|
263
|
+
await requestAllRevisionViews(viewer, log);
|
|
187
264
|
expect(editsProcessed).to.equal(log.length);
|
|
188
265
|
editsProcessed = 0;
|
|
189
266
|
for (let i = CachingLogViewer.sequencedCacheSizeMax + 1; i <= log.length; i++) {
|
|
190
|
-
await viewer.
|
|
267
|
+
await viewer.getRevisionView(i);
|
|
191
268
|
}
|
|
192
269
|
expect(editsProcessed).to.equal(0);
|
|
193
|
-
await viewer.
|
|
270
|
+
await viewer.getRevisionView(CachingLogViewer.sequencedCacheSizeMax);
|
|
194
271
|
expect(editsProcessed).to.equal(CachingLogViewer.sequencedCacheSizeMax);
|
|
195
272
|
});
|
|
196
|
-
it('never evicts the
|
|
273
|
+
it('never evicts the revision view for the most recent sequenced edit', async () => {
|
|
197
274
|
let editsProcessed = 0;
|
|
198
|
-
const log =
|
|
199
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
275
|
+
const log = getLogWithNumEdits(testTree, CachingLogViewer.sequencedCacheSizeMax * 2);
|
|
276
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, expectDefined(RevisionView.fromTree(initialTree, testTree)), () => editsProcessed++);
|
|
200
277
|
// Simulate all clients being caught up.
|
|
201
278
|
viewer.setMinimumSequenceNumber(log.numberOfSequencedEdits);
|
|
202
|
-
await
|
|
279
|
+
await requestAllRevisionViews(viewer, log);
|
|
203
280
|
expect(editsProcessed).to.equal(log.length);
|
|
204
281
|
editsProcessed = 0;
|
|
205
282
|
for (let i = 0; i <= CachingLogViewer.sequencedCacheSizeMax; i++) {
|
|
206
|
-
await viewer.
|
|
283
|
+
await viewer.getRevisionView(i);
|
|
207
284
|
}
|
|
208
285
|
expect(editsProcessed).to.equal(CachingLogViewer.sequencedCacheSizeMax);
|
|
209
286
|
editsProcessed = 0;
|
|
210
|
-
await viewer.
|
|
287
|
+
await viewer.getRevisionView(log.numberOfSequencedEdits);
|
|
211
288
|
expect(editsProcessed).to.equal(0);
|
|
212
289
|
});
|
|
213
|
-
it('caches
|
|
214
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits();
|
|
290
|
+
it('caches revision views for local revisions', async () => {
|
|
291
|
+
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
215
292
|
let editsProcessed = 0;
|
|
216
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits,
|
|
293
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits, simpleLogBaseView, () => editsProcessed++);
|
|
217
294
|
assert(logWithLocalEdits.length < CachingLogViewer.sequencedCacheSizeMax);
|
|
218
|
-
await
|
|
295
|
+
await requestAllRevisionViews(viewer, logWithLocalEdits);
|
|
219
296
|
expect(editsProcessed).to.equal(logWithLocalEdits.length);
|
|
220
297
|
// Local edits should now be cached until next remote sequenced edit arrives
|
|
221
298
|
editsProcessed = 0;
|
|
222
299
|
for (let i = logWithLocalEdits.numberOfSequencedEdits + 1; i <= logWithLocalEdits.length; i++) {
|
|
223
|
-
await viewer.
|
|
300
|
+
await viewer.getRevisionView(i);
|
|
224
301
|
expect(editsProcessed).to.equal(0);
|
|
225
302
|
}
|
|
226
303
|
// Add a new local edit, and request the latest view.
|
|
227
304
|
// This should apply only a single edit, as the most recent HEAD should be cached.
|
|
228
305
|
editsProcessed = 0;
|
|
229
|
-
logWithLocalEdits.addLocalEdit(newEdit(
|
|
230
|
-
await
|
|
306
|
+
logWithLocalEdits.addLocalEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))));
|
|
307
|
+
await requestAllRevisionViews(viewer, logWithLocalEdits);
|
|
231
308
|
expect(editsProcessed).to.equal(1);
|
|
232
309
|
editsProcessed = 0;
|
|
233
310
|
let seqNumber = 1;
|
|
234
311
|
while (logWithLocalEdits.numberOfLocalEdits > 0) {
|
|
235
312
|
logWithLocalEdits.addSequencedEdit(logWithLocalEdits.getEditInSessionAtIndex(logWithLocalEdits.numberOfSequencedEdits), { sequenceNumber: seqNumber, referenceSequenceNumber: seqNumber - 1 });
|
|
236
313
|
++seqNumber;
|
|
237
|
-
await viewer.
|
|
238
|
-
await viewer.
|
|
314
|
+
await viewer.getRevisionView(logWithLocalEdits.numberOfSequencedEdits); // get the latest (just added) sequenced edit
|
|
315
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY); // get the last view, which is a local revision
|
|
239
316
|
expect(editsProcessed).to.equal(0);
|
|
240
317
|
}
|
|
241
318
|
});
|
|
242
|
-
it('invalidates cached
|
|
243
|
-
const logWithLocalEdits = getSimpleLogWithLocalEdits();
|
|
319
|
+
it('invalidates cached revision views for local revisions when remote edits are received', () => {
|
|
320
|
+
const logWithLocalEdits = getSimpleLogWithLocalEdits(testTree);
|
|
244
321
|
let editsProcessed = 0;
|
|
245
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits,
|
|
322
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(logWithLocalEdits, simpleLogBaseView, () => editsProcessed++);
|
|
246
323
|
// Request twice, should only process edits once
|
|
247
|
-
viewer.
|
|
248
|
-
viewer.
|
|
324
|
+
viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
325
|
+
viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
249
326
|
expect(editsProcessed).to.equal(logWithLocalEdits.length);
|
|
250
327
|
// Remote edit arrives
|
|
251
328
|
editsProcessed = 0;
|
|
252
|
-
logWithLocalEdits.addSequencedEdit(newEdit(
|
|
253
|
-
viewer.
|
|
329
|
+
logWithLocalEdits.addSequencedEdit(newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atEndOf(testTree.right.traitLocation))), { sequenceNumber: 3, referenceSequenceNumber: 2, minimumSequenceNumber: 2 });
|
|
330
|
+
viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
254
331
|
expect(editsProcessed).to.equal(logWithLocalEdits.numberOfLocalEdits + 1);
|
|
255
332
|
});
|
|
256
|
-
// An arbitrary snapshot which can be used to check to see if it gets used when provided as a cached value.
|
|
257
|
-
const arbitrarySnapshot = Snapshot.fromTree(makeEmptyNode());
|
|
258
333
|
it('uses known editing result', () => {
|
|
259
334
|
const log = new EditLog();
|
|
260
335
|
const editsProcessed = [];
|
|
261
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
262
|
-
const before = viewer.
|
|
336
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
337
|
+
const before = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
263
338
|
const edit = newEdit([]);
|
|
264
339
|
log.addLocalEdit(edit);
|
|
265
340
|
viewer.setKnownEditingResult(edit, {
|
|
266
341
|
status: EditStatus.Applied,
|
|
267
342
|
changes: edit.changes,
|
|
268
343
|
before,
|
|
269
|
-
after:
|
|
344
|
+
after: arbitraryRevisionView,
|
|
270
345
|
steps: [],
|
|
271
346
|
});
|
|
272
|
-
const after = viewer.
|
|
347
|
+
const after = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
273
348
|
expect(editsProcessed).deep.equal([true]);
|
|
274
|
-
expect(after).equal(
|
|
349
|
+
expect(after).equal(arbitraryRevisionView);
|
|
275
350
|
});
|
|
276
|
-
it('ignores known editing if for wrong before
|
|
351
|
+
it('ignores known editing if for wrong before revision view', () => {
|
|
277
352
|
const log = new EditLog();
|
|
278
353
|
const editsProcessed = [];
|
|
279
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
354
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
280
355
|
const edit = newEdit([]);
|
|
281
356
|
log.addLocalEdit(edit);
|
|
282
357
|
viewer.setKnownEditingResult(edit, {
|
|
283
358
|
status: EditStatus.Applied,
|
|
284
359
|
changes: edit.changes,
|
|
285
|
-
before:
|
|
286
|
-
after:
|
|
360
|
+
before: arbitraryRevisionView,
|
|
361
|
+
after: arbitraryRevisionView,
|
|
287
362
|
steps: [],
|
|
288
363
|
});
|
|
289
|
-
const after = viewer.
|
|
364
|
+
const after = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
290
365
|
expect(editsProcessed).deep.equal([false]);
|
|
291
|
-
expect(after).not.equal(
|
|
366
|
+
expect(after).not.equal(arbitraryRevisionView);
|
|
292
367
|
});
|
|
293
368
|
it('ignores known editing if for wrong edit', () => {
|
|
294
369
|
const log = new EditLog();
|
|
295
370
|
const editsProcessed = [];
|
|
296
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
297
|
-
const before = viewer.
|
|
371
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
372
|
+
const before = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
298
373
|
const edit = newEdit([]);
|
|
299
374
|
log.addLocalEdit(edit);
|
|
300
375
|
viewer.setKnownEditingResult(newEdit([]), {
|
|
301
376
|
status: EditStatus.Applied,
|
|
302
377
|
changes: edit.changes,
|
|
303
378
|
before,
|
|
304
|
-
after:
|
|
379
|
+
after: arbitraryRevisionView,
|
|
305
380
|
steps: [],
|
|
306
381
|
});
|
|
307
|
-
const after = viewer.
|
|
382
|
+
const after = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
308
383
|
expect(editsProcessed).deep.equal([false]);
|
|
309
|
-
expect(after).not.equal(
|
|
384
|
+
expect(after).not.equal(arbitraryRevisionView);
|
|
310
385
|
});
|
|
311
386
|
it('uses known editing result with multiple edits', () => {
|
|
312
387
|
const log = new EditLog();
|
|
313
388
|
const editsProcessed = [];
|
|
314
|
-
const viewer = getCachingLogViewerAssumeAppliedEdits(log,
|
|
389
|
+
const viewer = getCachingLogViewerAssumeAppliedEdits(log, simpleLogBaseView, (_, _2, wasCached) => editsProcessed.push(wasCached));
|
|
315
390
|
const edit1 = newEdit([]);
|
|
316
391
|
const edit2 = newEdit([]);
|
|
317
392
|
const edit3 = newEdit([]);
|
|
318
393
|
log.addLocalEdit(edit1);
|
|
319
|
-
const before = viewer.
|
|
394
|
+
const before = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
320
395
|
expect(editsProcessed).deep.equal([false]);
|
|
321
396
|
log.addLocalEdit(edit2);
|
|
322
397
|
viewer.setKnownEditingResult(edit2, {
|
|
323
398
|
status: EditStatus.Applied,
|
|
324
399
|
changes: edit2.changes,
|
|
325
400
|
before,
|
|
326
|
-
after:
|
|
401
|
+
after: arbitraryRevisionView,
|
|
327
402
|
steps: [],
|
|
328
403
|
});
|
|
329
|
-
const after = viewer.
|
|
404
|
+
const after = viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
330
405
|
expect(editsProcessed).deep.equal([false, true]);
|
|
331
|
-
expect(after).equal(
|
|
406
|
+
expect(after).equal(arbitraryRevisionView);
|
|
332
407
|
log.addLocalEdit(edit3);
|
|
333
|
-
viewer.
|
|
408
|
+
viewer.getRevisionViewInSession(Number.POSITIVE_INFINITY);
|
|
334
409
|
expect(editsProcessed).deep.equal([false, true, false]);
|
|
335
410
|
});
|
|
336
|
-
describe('
|
|
411
|
+
describe('Callbacks', () => {
|
|
337
412
|
function getViewer() {
|
|
338
|
-
const log =
|
|
413
|
+
const log = getTestTreeLog(testTree);
|
|
339
414
|
const events = [];
|
|
340
|
-
const viewer = new CachingLogViewer(log,
|
|
341
|
-
/* expensiveValidation */ true, undefined,
|
|
415
|
+
const viewer = new CachingLogViewer(log, simpleLogBaseView, [],
|
|
416
|
+
/* expensiveValidation */ true, undefined, (args) => events.push(args), TransactionInternal.factory);
|
|
342
417
|
return { log, viewer, events };
|
|
343
418
|
}
|
|
344
419
|
function addInvalidEdit(log) {
|
|
345
420
|
// Add a local edit that will be invalid (inserts a node at a location that doesn't exist)
|
|
346
|
-
const edit = newEdit(
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
})));
|
|
421
|
+
const edit = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], expectDefined(StablePlaceInternal.atEndOf({
|
|
422
|
+
label: testTraitLabel,
|
|
423
|
+
parent: testTree.generateNodeId(),
|
|
424
|
+
}))));
|
|
350
425
|
log.addLocalEdit(edit);
|
|
351
426
|
return edit;
|
|
352
427
|
}
|
|
353
|
-
it('is
|
|
354
|
-
const { log, events, viewer } = getViewer();
|
|
355
|
-
const edit = addInvalidEdit(log);
|
|
356
|
-
await viewer.getSnapshot(Number.POSITIVE_INFINITY);
|
|
357
|
-
expect(events.length).equals(0, 'Invalid local edit should not log telemetry');
|
|
358
|
-
log.addSequencedEdit(edit, { sequenceNumber: 3, referenceSequenceNumber: 2 });
|
|
359
|
-
await viewer.getSnapshot(Number.POSITIVE_INFINITY);
|
|
360
|
-
expect(events.length).equals(1);
|
|
361
|
-
});
|
|
362
|
-
it('is only logged once upon first application for invalid locally generated edits', async () => {
|
|
428
|
+
it('processSequencedEditResult is called when a sequenced edit is applied', async () => {
|
|
363
429
|
const { log, events, viewer } = getViewer();
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
430
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY);
|
|
431
|
+
events.splice(0);
|
|
432
|
+
// Non-sequenced edit should not trigger a call
|
|
433
|
+
const invalidEdit = addInvalidEdit(log);
|
|
434
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY);
|
|
367
435
|
expect(events.length).equals(0);
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
}
|
|
436
|
+
log.addSequencedEdit(invalidEdit, { sequenceNumber: 3, referenceSequenceNumber: 2 });
|
|
437
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY);
|
|
438
|
+
expect(events.length).equals(1);
|
|
439
|
+
expect(events[0].edit.id).equals(invalidEdit.id);
|
|
440
|
+
expect(events[0].wasLocal).equals(true);
|
|
441
|
+
expect(events[0].result.status).equals(EditStatus.Invalid);
|
|
442
|
+
expect(events[0].reconciliationPath.length).equals(0);
|
|
443
|
+
const validEdit1 = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.left.traitLocation)));
|
|
444
|
+
log.addSequencedEdit(validEdit1, { sequenceNumber: 3, referenceSequenceNumber: 2 });
|
|
445
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY);
|
|
446
|
+
expect(events.length).equals(2);
|
|
447
|
+
expect(events[1].edit.id).equals(validEdit1.id);
|
|
448
|
+
expect(events[1].wasLocal).equals(false);
|
|
449
|
+
expect(events[1].result.status).equals(EditStatus.Applied);
|
|
450
|
+
expect(events[1].reconciliationPath.length).equals(0);
|
|
451
|
+
const validEdit2 = newEdit(ChangeInternal.insertTree([testTree.buildLeafInternal()], StablePlaceInternal.atStartOf(testTree.left.traitLocation)));
|
|
452
|
+
log.addSequencedEdit(validEdit2, { sequenceNumber: 4, referenceSequenceNumber: 2 });
|
|
453
|
+
await viewer.getRevisionView(Number.POSITIVE_INFINITY);
|
|
454
|
+
expect(events.length).equals(3);
|
|
455
|
+
expect(events[2].edit.id).equals(validEdit2.id);
|
|
456
|
+
expect(events[2].wasLocal).equals(false);
|
|
457
|
+
expect(events[2].result.status).equals(EditStatus.Applied);
|
|
458
|
+
expect(events[2].reconciliationPath.length).equals(1);
|
|
377
459
|
});
|
|
378
460
|
});
|
|
379
461
|
describe('Sequencing', () => {
|
|
@@ -388,8 +470,8 @@ describe('CachingLogViewer', () => {
|
|
|
388
470
|
return edit;
|
|
389
471
|
}
|
|
390
472
|
function minimalLogViewer() {
|
|
391
|
-
return new CachingLogViewer(new EditLog(),
|
|
392
|
-
/* expensiveValidation */ true, undefined,
|
|
473
|
+
return new CachingLogViewer(new EditLog(), simpleLogBaseView, [],
|
|
474
|
+
/* expensiveValidation */ true, undefined, undefined, MockTransaction.factory);
|
|
393
475
|
}
|
|
394
476
|
it('tracks the earliest sequenced edit in the session', () => {
|
|
395
477
|
const logViewer = minimalLogViewer();
|
|
@@ -458,11 +540,11 @@ describe('CachingLogViewer', () => {
|
|
|
458
540
|
// This is deliberately done to simulate scenarios where a given DDS may not be sent all sequenced ops (because an other DDS
|
|
459
541
|
// might be receiving them).
|
|
460
542
|
const edit2 = addFakeEdit(logViewer, 2001, 1001);
|
|
461
|
-
expectReconciliationPath(edit2, [
|
|
462
|
-
const edit3 = addFakeEdit(logViewer, 3001,
|
|
543
|
+
expectReconciliationPath(edit2, []);
|
|
544
|
+
const edit3 = addFakeEdit(logViewer, 3001, 2000);
|
|
463
545
|
expectReconciliationPath(edit3, [edit2]);
|
|
464
546
|
const edit4 = addFakeEdit(logViewer, 4001, 2500);
|
|
465
|
-
expectReconciliationPath(edit4, [
|
|
547
|
+
expectReconciliationPath(edit4, [edit3]);
|
|
466
548
|
const edit5 = addFakeEdit(logViewer, 5001, 500);
|
|
467
549
|
expectReconciliationPath(edit5, [edit1, edit2, edit3, edit4]);
|
|
468
550
|
});
|