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