@fluid-experimental/tree 1.0.0 → 1.1.0-76254

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/EditLog.d.ts.map +1 -1
  2. package/dist/EditLog.js +4 -7
  3. package/dist/EditLog.js.map +1 -1
  4. package/dist/LogViewer.d.ts.map +1 -1
  5. package/dist/LogViewer.js +1 -7
  6. package/dist/LogViewer.js.map +1 -1
  7. package/dist/SharedTree.d.ts.map +1 -1
  8. package/dist/SharedTree.js +12 -12
  9. package/dist/SharedTree.js.map +1 -1
  10. package/dist/SharedTreeEncoder.d.ts.map +1 -1
  11. package/dist/SharedTreeEncoder.js +6 -12
  12. package/dist/SharedTreeEncoder.js.map +1 -1
  13. package/dist/TransactionInternal.d.ts.map +1 -1
  14. package/dist/TransactionInternal.js +4 -7
  15. package/dist/TransactionInternal.js.map +1 -1
  16. package/dist/id-compressor/IdCompressor.d.ts +3 -1
  17. package/dist/id-compressor/IdCompressor.d.ts.map +1 -1
  18. package/dist/id-compressor/IdCompressor.js +45 -17
  19. package/dist/id-compressor/IdCompressor.js.map +1 -1
  20. package/lib/EditLog.d.ts.map +1 -1
  21. package/lib/EditLog.js +4 -7
  22. package/lib/EditLog.js.map +1 -1
  23. package/lib/LogViewer.d.ts.map +1 -1
  24. package/lib/LogViewer.js +1 -7
  25. package/lib/LogViewer.js.map +1 -1
  26. package/lib/SharedTree.d.ts.map +1 -1
  27. package/lib/SharedTree.js +12 -12
  28. package/lib/SharedTree.js.map +1 -1
  29. package/lib/SharedTreeEncoder.d.ts.map +1 -1
  30. package/lib/SharedTreeEncoder.js +6 -12
  31. package/lib/SharedTreeEncoder.js.map +1 -1
  32. package/lib/TransactionInternal.d.ts.map +1 -1
  33. package/lib/TransactionInternal.js +4 -7
  34. package/lib/TransactionInternal.js.map +1 -1
  35. package/lib/id-compressor/IdCompressor.d.ts +3 -1
  36. package/lib/id-compressor/IdCompressor.d.ts.map +1 -1
  37. package/lib/id-compressor/IdCompressor.js +45 -17
  38. package/lib/id-compressor/IdCompressor.js.map +1 -1
  39. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js +1 -1
  40. package/lib/test/MergeHealthTelemetryHeartbeat.tests.js.map +1 -1
  41. package/lib/test/SessionIdNormalizer.tests.js +4 -6
  42. package/lib/test/SessionIdNormalizer.tests.js.map +1 -1
  43. package/lib/test/Summary.tests.js +3 -6
  44. package/lib/test/Summary.tests.js.map +1 -1
  45. package/lib/test/utilities/SharedTreeTests.d.ts.map +1 -1
  46. package/lib/test/utilities/SharedTreeTests.js +33 -11
  47. package/lib/test/utilities/SharedTreeTests.js.map +1 -1
  48. package/lib/test/utilities/TestNode.d.ts.map +1 -1
  49. package/lib/test/utilities/TestNode.js +2 -12
  50. package/lib/test/utilities/TestNode.js.map +1 -1
  51. package/package.json +18 -18
  52. package/src/EditLog.ts +21 -23
  53. package/src/LogViewer.ts +1 -6
  54. package/src/SharedTree.ts +17 -16
  55. package/src/SharedTreeEncoder.ts +6 -17
  56. package/src/TransactionInternal.ts +11 -13
  57. package/src/id-compressor/IdCompressor.ts +46 -15
@@ -1 +1 @@
1
- {"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TestNode.d.ts","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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"}
@@ -118,12 +118,7 @@ export class SimpleTestTree {
118
118
  return convertTreeNodes(this, (node) => convertNodeDataIds(node, identity));
119
119
  }
120
120
  buildLeaf(id, payload) {
121
- if (id === undefined) {
122
- return buildLeaf(undefined, payload);
123
- }
124
- else {
125
- return buildLeaf(id, payload);
126
- }
121
+ return id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);
127
122
  }
128
123
  buildLeafInternal(id, payload) {
129
124
  return buildLeafInternal(this, id, payload);
@@ -206,12 +201,7 @@ export class RefreshingTestTree {
206
201
  return convertTreeNodes(this.testTree, (node) => convertNodeDataIds(node, identity));
207
202
  }
208
203
  buildLeaf(id, payload) {
209
- if (id === undefined) {
210
- return this.testTree.buildLeaf(undefined, payload);
211
- }
212
- else {
213
- return this.testTree.buildLeaf(id, payload);
214
- }
204
+ return id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);
215
205
  }
216
206
  buildLeafInternal(id, payload) {
217
207
  return this.testTree.buildLeafInternal(id, payload);
@@ -1 +1 @@
1
- {"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\tif (id === undefined) {\n\t\t\treturn this.testTree.buildLeaf(undefined, payload);\n\t\t} else {\n\t\t\treturn this.testTree.buildLeaf(id, payload);\n\t\t}\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
1
+ {"version":3,"file":"TestNode.js","sourceRoot":"","sources":["../../../src/test/utilities/TestNode.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { BuildTreeNode } from '../../ChangeTypes';\nimport { memoizeGetter, fail, setPropertyIfDefined, identity } from '../../Common';\nimport { convertTreeNodes } from '../../EditUtilities';\nimport { convertNodeDataIds } from '../../IdConversion';\nimport { Definition, NodeId, OpSpaceNodeId, SessionId, StableNodeId, TraitLabel } from '../../Identifiers';\nimport { initialTree } from '../../InitialTree';\nimport { NodeIdContext, NodeIdConverter, NodeIdNormalizer } from '../../NodeIdUtilities';\nimport {\n\tBuildNodeInternal,\n\tChangeNode,\n\tPayload,\n\tTraitLocationInternal,\n\tTraitLocationInternal_0_0_2,\n\tTraitMap,\n\tTreeNode,\n} from '../../persisted-types';\nimport { RevisionView } from '../../RevisionView';\nimport { TraitLocation } from '../../TreeView';\n\n/** A legacy format of a `TestNode` */\nexport type TestNode_0_0_2 = TreeNode<TestNode_0_0_2, StableNodeId>;\n\n/**\n * A node with no children\n */\nexport type LeafNode<T> = Omit<T, 'traits'> & { traits: Record<string, never> };\n\n/**\n * Test extension of {@link TraitLocation} which can be converted to stable or legacy formats\n */\nexport interface TestTraitLocation extends TraitLocation {\n\tstable: TraitLocationInternal_0_0_2;\n\t/** Translate this location into the equivalent location in another ID context */\n\ttranslate(idConverter: NodeIdConverter): TestTraitLocation;\n}\n\n/**\n * An object containing useful properties for analyzing a node within a test context.\n */\nexport interface TestNode extends TreeNode<TestNode, NodeId> {\n\t/** The label of the trait under which this node resides */\n\ttraitLabel: TraitLabel;\n\t/** The trait location at which this node resides */\n\ttraitLocation: TestTraitLocation;\n\t/** A revision view of this node */\n\tview: RevisionView;\n\t/** A version of this tree with stable IDs */\n\tstable: TestNode_0_0_2;\n\t/** Translate this node's ID into the equivalent ID in another ID context */\n\ttranslateId(idConverter: NodeIdConverter): NodeId;\n\t/** Express this tree as a ChangeNode */\n\ttoChangeNode(): ChangeNode;\n}\n\n/**\n * A small tree of `TestNode`s consisting of a root/parent node, a \"left\" child and a \"right\" child. This is a useful tree for initializing\n * tests as it makes it ergonomic to retrieve various properties of the tree. Note that it only represents the initial state of the tree,\n * it does not update even if the SharedTree that it was the initial state for is mutated.\n */\nexport interface TestTree extends TestNode, NodeIdContext, NodeIdNormalizer<OpSpaceNodeId> {\n\t/** The left child node */\n\tleft: TestNode;\n\t/** The right child node */\n\tright: TestNode;\n\t/** Create an arbitrary unparented node with the given payload, if specified */\n\tbuildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\t/** Create an arbitrary unparented node with the given identifier and payload, if specified */\n\tbuildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\t/**\n\t * Generates a leaf node for use in internal build changes.\n\t * If no `id` is explicitly provided, one will be generated.\n\t * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n\t */\n\tbuildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>>;\n}\n\n/**\n * A TestTree for general use within the shared-tree package. The nodes in every `SimpleTestTree` will have unique identifiers - i.e. two\n * different instances of `SimpleTestTree` are never equivalent.\n */\nexport class SimpleTestTree implements TestTree {\n\tpublic static readonly definition = 'node' as Definition;\n\tpublic static readonly traitLabel = 'e276f382-fa99-49a1-ae81-42001791c733' as TraitLabel;\n\tpublic static readonly leftTraitLabel = 'left' as TraitLabel;\n\tpublic static readonly rightTraitLabel = 'right' as TraitLabel;\n\n\tprivate readonly root: TestNode;\n\tpublic readonly left: TestNode;\n\tpublic readonly right: TestNode;\n\tpublic readonly expensiveValidation;\n\n\tpublic constructor(\n\t\tprivate readonly nodeIdContext: NodeIdContext,\n\t\tprivate readonly nodeIdNormalizer: NodeIdNormalizer<OpSpaceNodeId>,\n\t\texpensiveValidation = true\n\t) {\n\t\tconst leftIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rightIdentifier = nodeIdContext.generateNodeId();\n\t\tconst rootIdentifier = nodeIdContext.generateNodeId();\n\t\tthis.expensiveValidation = expensiveValidation;\n\t\tthis.left = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: leftIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.leftTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.leftTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.leftTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(leftIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.left, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tthis.right = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rightIdentifier,\n\t\t\ttraits: {},\n\t\t\ttraitLabel: SimpleTestTree.rightTraitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tparent: rootIdentifier,\n\t\t\t\tlabel: SimpleTestTree.rightTraitLabel,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.rightTraitLabel, rootIdentifier, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rightIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.right, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t\tconst rootParent = nodeIdContext.convertToNodeId(initialTree.identifier);\n\t\tthis.root = {\n\t\t\tdefinition: SimpleTestTree.definition,\n\t\t\tidentifier: rootIdentifier,\n\t\t\ttraits: {\n\t\t\t\t[SimpleTestTree.leftTraitLabel]: [this.left],\n\t\t\t\t[SimpleTestTree.rightTraitLabel]: [this.right],\n\t\t\t},\n\t\t\ttraitLabel: SimpleTestTree.traitLabel,\n\t\t\ttraitLocation: {\n\t\t\t\tlabel: SimpleTestTree.traitLabel,\n\t\t\t\tparent: rootParent,\n\t\t\t\tget stable() {\n\t\t\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, nodeIdContext));\n\t\t\t\t},\n\t\t\t\ttranslate: (idConverter: NodeIdConverter) =>\n\t\t\t\t\ttranslateTraitLocation(SimpleTestTree.traitLabel, rootParent, nodeIdContext, idConverter),\n\t\t\t},\n\t\t\tget view() {\n\t\t\t\treturn memoizeGetter(this, 'view', RevisionView.fromTree(this, expensiveValidation));\n\t\t\t},\n\t\t\tget stable() {\n\t\t\t\treturn memoizeGetter(this, 'stable', convertToTestNode_0_0_2(this, nodeIdContext));\n\t\t\t},\n\t\t\ttranslateId: (idConverter: NodeIdConverter) => translateId(rootIdentifier, nodeIdContext, idConverter),\n\t\t\ttoChangeNode: () =>\n\t\t\t\tconvertTreeNodes<ChangeNode, ChangeNode>(this.root, (node) => convertNodeDataIds(node, identity)),\n\t\t};\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.root.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.root.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.root.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.root.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.root.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.root.view;\n\t}\n\n\tpublic get stable() {\n\t\treturn this.root.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.root.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? buildLeaf(undefined, payload) : buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn buildLeafInternal(this, id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.nodeIdContext.generateNodeId(override);\n\t}\n\n\tpublic convertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.nodeIdContext.convertToStableNodeId(id);\n\t}\n\n\tpublic tryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToStableNodeId(id);\n\t}\n\n\tpublic convertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.nodeIdContext.convertToNodeId(id);\n\t}\n\n\tpublic tryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.nodeIdContext.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.nodeIdNormalizer.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToOpSpace(id);\n\t}\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.nodeIdNormalizer.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** A TestTree which resets before each test */\nexport class RefreshingTestTree<T extends TestTree> implements TestTree {\n\tprivate _testTree?: T;\n\n\tpublic constructor(createTestTree: () => T, fn?: (testTree: T) => void) {\n\t\tbeforeEach(() => {\n\t\t\tthis._testTree = createTestTree();\n\t\t\tfn?.(this._testTree);\n\t\t});\n\t\tafterEach(() => {\n\t\t\tthis._testTree = undefined;\n\t\t});\n\t}\n\n\tprivate get testTree(): T {\n\t\treturn (\n\t\t\tthis._testTree ??\n\t\t\tfail(\n\t\t\t\t'RefreshingTestTree should be created within a describe() block and should only be read within it() blocks'\n\t\t\t)\n\t\t);\n\t}\n\n\tpublic get left(): TestNode {\n\t\treturn this.testTree.left;\n\t}\n\n\tpublic get right(): TestNode {\n\t\treturn this.testTree.right;\n\t}\n\n\tpublic get definition(): Definition {\n\t\treturn this.testTree.definition;\n\t}\n\n\tpublic get identifier(): NodeId {\n\t\treturn this.testTree.identifier;\n\t}\n\n\tpublic get traits(): TraitMap<TestNode> {\n\t\treturn this.testTree.traits;\n\t}\n\n\tpublic get traitLabel(): TraitLabel {\n\t\treturn this.testTree.traitLabel;\n\t}\n\n\tpublic get traitLocation(): TestTraitLocation {\n\t\treturn this.testTree.traitLocation;\n\t}\n\n\tpublic get view(): RevisionView {\n\t\treturn this.testTree.view;\n\t}\n\n\tpublic get stable(): TestNode_0_0_2 {\n\t\treturn this.testTree.stable;\n\t}\n\n\tpublic translateId(idConverter: NodeIdConverter): NodeId {\n\t\treturn this.testTree.translateId(idConverter);\n\t}\n\n\tpublic toChangeNode(): ChangeNode {\n\t\treturn convertTreeNodes<ChangeNode, ChangeNode>(this.testTree, (node) => convertNodeDataIds(node, identity));\n\t}\n\n\tpublic buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n\tpublic buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n\tpublic buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\t\treturn id === undefined ? this.testTree.buildLeaf(undefined, payload) : this.testTree.buildLeaf(id, payload);\n\t}\n\n\tpublic buildLeafInternal(id?: NodeId, payload?: Payload): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\t\treturn this.testTree.buildLeafInternal(id, payload);\n\t}\n\n\tpublic generateNodeId(override?: string): NodeId {\n\t\treturn this.testTree.generateNodeId(override);\n\t}\n\n\tconvertToStableNodeId(id: NodeId): StableNodeId {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\ttryConvertToStableNodeId(id: NodeId): StableNodeId | undefined {\n\t\treturn this.testTree.convertToStableNodeId(id);\n\t}\n\n\tconvertToNodeId(id: StableNodeId): NodeId {\n\t\treturn this.testTree.convertToNodeId(id);\n\t}\n\n\ttryConvertToNodeId(id: StableNodeId): NodeId | undefined {\n\t\treturn this.testTree.tryConvertToNodeId(id);\n\t}\n\n\tget localSessionId(): SessionId {\n\t\treturn this.testTree.localSessionId;\n\t}\n\n\tnormalizeToOpSpace(id: NodeId): OpSpaceNodeId {\n\t\treturn this.testTree.normalizeToOpSpace(id);\n\t}\n\n\tnormalizeToSessionSpace(id: OpSpaceNodeId, sessionId: SessionId): NodeId {\n\t\treturn this.testTree.normalizeToSessionSpace(id, sessionId);\n\t}\n}\n\n/** Create a new node with an automatically generated ID and the given payload */\nexport function buildLeaf(id?: undefined, payload?: Payload): LeafNode<BuildTreeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id: NodeId, payload?: Payload): LeafNode<ChangeNode>;\n/** Create a new node with the given ID and payload */\nexport function buildLeaf(id?: NodeId, payload?: Payload): LeafNode<BuildTreeNode> | LeafNode<ChangeNode> {\n\tconst node: LeafNode<BuildTreeNode> = {\n\t\tdefinition: SimpleTestTree.definition,\n\t\ttraits: {},\n\t};\n\tsetPropertyIfDefined(id, node, 'identifier');\n\tsetPropertyIfDefined(payload, node, 'payload');\n\treturn node;\n}\n\n/**\n * Generates a leaf {@link ChangeNode}.\n * If no `id` is explicitly provided, one will be generated.\n * @param id - Explicit ID to use as the new node's identifier. If not provided, one will be generated.\n */\nexport function buildLeafInternal(\n\tnodeIdContext: NodeIdContext,\n\tid?: NodeId,\n\tpayload?: Payload\n): LeafNode<TreeNode<BuildNodeInternal, NodeId>> {\n\tconst leaf = buildLeaf(undefined, payload);\n\treturn {\n\t\tdefinition: leaf.definition as Definition,\n\t\tidentifier: id ?? nodeIdContext.generateNodeId(),\n\t\ttraits: {},\n\t};\n}\n\n/** Translate an ID in one context to an ID in another */\nfunction translateId(id: NodeId, from: NodeIdConverter, to: NodeIdConverter): NodeId {\n\treturn to.convertToNodeId(from.convertToStableNodeId(id));\n}\n\nfunction translateTraitLocation(\n\tlabel: TraitLabel,\n\tparentId: NodeId,\n\tfrom: NodeIdConverter,\n\tto: NodeIdConverter\n): TestTraitLocation {\n\treturn {\n\t\tlabel,\n\t\tparent: translateId(parentId, from, to),\n\t\tget stable() {\n\t\t\treturn memoizeGetter(this, 'stable', convertToTraitLocation_0_0_2(this, to));\n\t\t},\n\t\ttranslate: (idManager) => translateTraitLocation(label, parentId, to, idManager),\n\t};\n}\n\nfunction convertToTestNode_0_0_2(node: TestNode, idConverter: NodeIdConverter): TestNode_0_0_2 {\n\t// This is equivalent to calling tryConvertToChangeNode_0_0_2 but that causes lint to stack overflow\n\treturn convertTreeNodes<TestNode, TestNode_0_0_2>(node, (nodeData) =>\n\t\tconvertNodeDataIds(nodeData, (id) => idConverter.convertToStableNodeId(id))\n\t);\n}\n\nfunction convertToTraitLocation_0_0_2(\n\ttraitLocation: TraitLocationInternal,\n\tidConverter: NodeIdConverter\n): TraitLocationInternal_0_0_2 {\n\tconst parent = idConverter.convertToStableNodeId(traitLocation.parent);\n\treturn {\n\t\tlabel: traitLocation.label,\n\t\tparent,\n\t};\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluid-experimental/tree",
3
- "version": "1.0.0",
3
+ "version": "1.1.0-76254",
4
4
  "description": "Distributed tree",
5
5
  "homepage": "https://fluidframework.com",
6
6
  "repository": {
@@ -38,13 +38,13 @@
38
38
  "dependencies": {
39
39
  "@fluidframework/common-definitions": "^0.20.1",
40
40
  "@fluidframework/common-utils": "^0.32.1",
41
- "@fluidframework/container-definitions": "^1.0.0",
42
- "@fluidframework/core-interfaces": "^1.0.0",
43
- "@fluidframework/datastore-definitions": "^1.0.0",
41
+ "@fluidframework/container-definitions": "1.1.0-76254",
42
+ "@fluidframework/core-interfaces": "1.1.0-76254",
43
+ "@fluidframework/datastore-definitions": "1.1.0-76254",
44
44
  "@fluidframework/protocol-definitions": "^0.1028.2000",
45
- "@fluidframework/runtime-definitions": "^1.0.0",
46
- "@fluidframework/shared-object-base": "^1.0.0",
47
- "@fluidframework/telemetry-utils": "^1.0.0",
45
+ "@fluidframework/runtime-definitions": "1.1.0-76254",
46
+ "@fluidframework/shared-object-base": "1.1.0-76254",
47
+ "@fluidframework/telemetry-utils": "1.1.0-76254",
48
48
  "buffer": "^6.0.3",
49
49
  "denque": "^1.5.1",
50
50
  "lru-cache": "^6.0.0",
@@ -52,19 +52,19 @@
52
52
  "uuid": "^8.3.1"
53
53
  },
54
54
  "devDependencies": {
55
- "@fluid-internal/stochastic-test-utils": "^1.0.0",
55
+ "@fluid-internal/stochastic-test-utils": "1.1.0-76254",
56
56
  "@fluid-tools/benchmark": "^0.40.0",
57
- "@fluidframework/build-common": "^0.23.0",
58
- "@fluidframework/container-loader": "^1.0.0",
59
- "@fluidframework/container-runtime": "^1.0.0",
57
+ "@fluidframework/build-common": "^0.24.0-0",
58
+ "@fluidframework/container-loader": "1.1.0-76254",
59
+ "@fluidframework/container-runtime": "1.1.0-76254",
60
60
  "@fluidframework/eslint-config-fluid": "^0.28.2000",
61
- "@fluidframework/mocha-test-setup": "^1.0.0",
62
- "@fluidframework/runtime-utils": "^1.0.0",
63
- "@fluidframework/test-driver-definitions": "^1.0.0",
64
- "@fluidframework/test-drivers": "^1.0.0",
65
- "@fluidframework/test-runtime-utils": "^1.0.0",
66
- "@fluidframework/test-utils": "^1.0.0",
67
- "@fluidframework/undo-redo": "^1.0.0",
61
+ "@fluidframework/mocha-test-setup": "1.1.0-76254",
62
+ "@fluidframework/runtime-utils": "1.1.0-76254",
63
+ "@fluidframework/test-driver-definitions": "1.1.0-76254",
64
+ "@fluidframework/test-drivers": "1.1.0-76254",
65
+ "@fluidframework/test-runtime-utils": "1.1.0-76254",
66
+ "@fluidframework/test-utils": "1.1.0-76254",
67
+ "@fluidframework/undo-redo": "1.1.0-76254",
68
68
  "@microsoft/api-extractor": "^7.22.2",
69
69
  "@rushstack/eslint-config": "^2.5.1",
70
70
  "@types/lru-cache": "^5.1.0",
package/src/EditLog.ts CHANGED
@@ -645,29 +645,27 @@ export class EditLog<TChange = unknown> extends TypedEventEmitter<IEditLogEvents
645
645
  public getEditLogSummary<TCompressedChange>(
646
646
  compressEdit?: (edit: Pick<Edit<TChange>, 'changes'>) => Pick<Edit<TCompressedChange>, 'changes'>
647
647
  ): EditLogSummary<TChange, FluidEditHandle> | EditLogSummary<TCompressedChange, FluidEditHandle> {
648
- if (compressEdit !== undefined) {
649
- return {
650
- editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
651
- startRevision,
652
- chunk:
653
- handle?.baseHandle ??
654
- edits?.map((edit) => compressEdit(edit)) ??
655
- fail('An edit chunk must have either a handle or a list of edits.'),
656
- })),
657
- editIds: this.sequencedEditIds,
658
- };
659
- } else {
660
- return {
661
- editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
662
- startRevision,
663
- chunk:
664
- handle?.baseHandle ??
665
- edits ??
666
- fail('An edit chunk must have either a handle or a list of edits.'),
667
- })),
668
- editIds: this.sequencedEditIds,
669
- };
670
- }
648
+ return compressEdit !== undefined
649
+ ? {
650
+ editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
651
+ startRevision,
652
+ chunk:
653
+ handle?.baseHandle ??
654
+ edits?.map((edit) => compressEdit(edit)) ??
655
+ fail('An edit chunk must have either a handle or a list of edits.'),
656
+ })),
657
+ editIds: this.sequencedEditIds,
658
+ }
659
+ : {
660
+ editChunks: this.editChunks.toArray().map(([startRevision, { handle, edits }]) => ({
661
+ startRevision,
662
+ chunk:
663
+ handle?.baseHandle ??
664
+ edits ??
665
+ fail('An edit chunk must have either a handle or a list of edits.'),
666
+ })),
667
+ editIds: this.sequencedEditIds,
668
+ };
671
669
  }
672
670
 
673
671
  private addKeyToCache(newKey: number): void {
package/src/LogViewer.ts CHANGED
@@ -439,12 +439,7 @@ export class CachingLogViewer implements LogViewer {
439
439
  }
440
440
 
441
441
  const revision = editIndex + 1;
442
- let nextView: RevisionView;
443
- if (editingResult.status === EditStatus.Applied) {
444
- nextView = editingResult.after;
445
- } else {
446
- nextView = prevView;
447
- }
442
+ const nextView: RevisionView = editingResult.status === EditStatus.Applied ? editingResult.after : prevView;
448
443
 
449
444
  const computedCacheEntry =
450
445
  editingResult.status === EditStatus.Applied
package/src/SharedTree.ts CHANGED
@@ -478,17 +478,15 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
478
478
  uploadEditChunks: boolean;
479
479
  } {
480
480
  const noCompatOptions = options as SharedTreeOptions<WriteFormat, 'None'>;
481
- if (typeof noCompatOptions.summarizeHistory === 'object') {
482
- return {
483
- summarizeHistory: true,
484
- uploadEditChunks: noCompatOptions.summarizeHistory.uploadEditChunks,
485
- };
486
- } else {
487
- return {
488
- summarizeHistory: noCompatOptions.summarizeHistory ?? false,
489
- uploadEditChunks: false,
490
- };
491
- }
481
+ return typeof noCompatOptions.summarizeHistory === 'object'
482
+ ? {
483
+ summarizeHistory: true,
484
+ uploadEditChunks: noCompatOptions.summarizeHistory.uploadEditChunks,
485
+ }
486
+ : {
487
+ summarizeHistory: noCompatOptions.summarizeHistory ?? false,
488
+ uploadEditChunks: false,
489
+ };
492
490
  }
493
491
 
494
492
  /**
@@ -532,7 +530,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
532
530
  );
533
531
 
534
532
  const attributionId = (options as SharedTreeOptions<WriteFormat.v0_1_1>).attributionId;
535
- this.idCompressor = new IdCompressor(createSessionId(), reservedIdCount, attributionId);
533
+ this.idCompressor = new IdCompressor(createSessionId(), reservedIdCount, attributionId, this.logger);
536
534
  const { editLog, cachingLogViewer } = this.initializeNewEditLogFromSummary(
537
535
  {
538
536
  editChunks: [],
@@ -1093,9 +1091,12 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
1093
1091
  };
1094
1092
  this.cachingLogViewer.setMinimumSequenceNumber(typedMessage.minimumSequenceNumber);
1095
1093
  const op = typedMessage.contents;
1094
+ if (op.version === undefined) {
1095
+ // Back-compat: some legacy documents may contain trailing ops with an unstamped version; normalize them.
1096
+ (op as { version: WriteFormat | undefined }).version = WriteFormat.v0_0_2;
1097
+ }
1096
1098
  const { type, version } = op;
1097
- const resolvedVersion = version ?? WriteFormat.v0_0_2;
1098
- const sameVersion = resolvedVersion === this.writeFormat;
1099
+ const sameVersion = version === this.writeFormat;
1099
1100
 
1100
1101
  // Edit and handle ops should only be processed if they're the same version as the tree write version.
1101
1102
  // Update ops should only be processed if they're not the same version.
@@ -1128,7 +1129,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
1128
1129
  }
1129
1130
  } else if (type === SharedTreeOpType.Update) {
1130
1131
  this.processVersionUpdate(op.version);
1131
- } else if (compareSummaryFormatVersions(resolvedVersion, this.writeFormat) === 1) {
1132
+ } else if (compareSummaryFormatVersions(version, this.writeFormat) === 1) {
1132
1133
  // An op version newer than our current version should not be received. If this happens, either an
1133
1134
  // incorrect op version has been written or an update op was skipped.
1134
1135
  const error = 'Newer op version received by a client that has yet to be updated.';
@@ -1264,7 +1265,7 @@ export class SharedTree extends SharedObject<ISharedTreeEvents> implements NodeI
1264
1265
  this.interner = new MutableStringInterner([initialTree.definition]);
1265
1266
  const oldIdCompressor = this.idCompressor;
1266
1267
  // Create the IdCompressor that will be used after the upgrade
1267
- const newIdCompressor = new IdCompressor(createSessionId(), reservedIdCount, this.attributionId);
1268
+ const newIdCompressor = new IdCompressor(createSessionId(), reservedIdCount, this.attributionId, this.logger);
1268
1269
  const newContext = getNodeIdContext(newIdCompressor);
1269
1270
  // Generate all local IDs in the new compressor that were in the old compressor and preserve their UUIDs.
1270
1271
  // This will allow the client to continue to use local IDs that were allocated pre-upgrade
@@ -134,18 +134,9 @@ export class SharedTreeEncoder_0_1_1 {
134
134
  interner: StringInterner,
135
135
  serializedIdCompressor: SerializedIdCompressorWithNoSession
136
136
  ): SharedTreeSummary {
137
- if (this.summarizeHistory) {
138
- return this.fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor);
139
- } else {
140
- return this.noHistorySummarizer(
141
- edits,
142
- currentView,
143
- idContext,
144
- idNormalizer,
145
- interner,
146
- serializedIdCompressor
147
- );
148
- }
137
+ return this.summarizeHistory
138
+ ? this.fullHistorySummarizer(edits, currentView, idNormalizer, interner, serializedIdCompressor)
139
+ : this.noHistorySummarizer(edits, currentView, idContext, idNormalizer, interner, serializedIdCompressor);
149
140
  }
150
141
 
151
142
  /**
@@ -364,11 +355,9 @@ export class SharedTreeEncoder_0_0_2 {
364
355
  currentView: RevisionView,
365
356
  idConverter: NodeIdConverter
366
357
  ): SharedTreeSummary_0_0_2 {
367
- if (this.summarizeHistory) {
368
- return this.fullHistorySummarizer(edits, currentView, idConverter);
369
- } else {
370
- return this.noHistorySummarizer(edits, currentView, idConverter);
371
- }
358
+ return this.summarizeHistory
359
+ ? this.fullHistorySummarizer(edits, currentView, idConverter)
360
+ : this.noHistorySummarizer(edits, currentView, idConverter);
372
361
  }
373
362
 
374
363
  /**
@@ -347,19 +347,17 @@ export class GenericTransaction {
347
347
  }
348
348
  const resolvedChange = resolutionResult.result;
349
349
  const changeResult = this.policy.dispatchChange(this.state, resolvedChange);
350
- if (Result.isOk(changeResult)) {
351
- this.state = {
352
- status: EditStatus.Applied,
353
- view: changeResult.result,
354
- changes: this.changes.concat(change),
355
- steps: this.steps.concat({ resolvedChange, after: changeResult.result }),
356
- };
357
- } else {
358
- this.state = {
359
- ...this.state,
360
- ...changeResult.error,
361
- };
362
- }
350
+ this.state = Result.isOk(changeResult)
351
+ ? {
352
+ status: EditStatus.Applied,
353
+ view: changeResult.result,
354
+ changes: this.changes.concat(change),
355
+ steps: this.steps.concat({ resolvedChange, after: changeResult.result }),
356
+ }
357
+ : {
358
+ ...this.state,
359
+ ...changeResult.error,
360
+ };
363
361
  return this;
364
362
  }
365
363
  }
@@ -5,6 +5,7 @@
5
5
 
6
6
  /* eslint-disable @typescript-eslint/restrict-plus-operands */
7
7
 
8
+ import { ITelemetryLogger } from '@fluidframework/common-definitions';
8
9
  import BTree from 'sorted-btree';
9
10
  import {
10
11
  assert,
@@ -384,7 +385,8 @@ export class IdCompressor {
384
385
  public constructor(
385
386
  public readonly localSessionId: SessionId,
386
387
  public readonly reservedIdCount: number,
387
- attributionId?: AttributionId
388
+ attributionId?: AttributionId,
389
+ private readonly logger?: ITelemetryLogger
388
390
  ) {
389
391
  assert(reservedIdCount >= 0, 'reservedIdCount must be non-negative');
390
392
  if (attributionId !== undefined) {
@@ -565,6 +567,7 @@ export class IdCompressor {
565
567
  const finalizeCount = normalizedLastFinalizedLocal - newLastFinalizedLocal;
566
568
  assert(finalizeCount >= 1, 'Cannot finalize an empty range.');
567
569
 
570
+ let eagerFinalIdCount = 0;
568
571
  let initialClusterCount = 0;
569
572
  let remainingCount = finalizeCount;
570
573
  let newBaseUuid: NumericUuid | undefined;
@@ -577,6 +580,7 @@ export class IdCompressor {
577
580
  Math.min(currentCluster.count + finalizeCount, currentCluster.capacity) -
578
581
  1) as FinalCompressedId;
579
582
  if (lastFinalInCluster > lastKnownFinal) {
583
+ eagerFinalIdCount = lastFinalInCluster - (lastKnownFinal + 1);
580
584
  this.sessionIdNormalizer.addFinalIds(
581
585
  (lastKnownFinal + 1) as FinalCompressedId,
582
586
  lastFinalInCluster,
@@ -596,6 +600,7 @@ export class IdCompressor {
596
600
  // The cluster is full but is the last in the list of clusters.
597
601
  // This allows it to be expanded instead of allocating a new one.
598
602
  const expansionAmount = this.newClusterCapacity + overflow;
603
+ const previousCapacity = currentCluster.capacity;
599
604
  currentCluster.capacity += expansionAmount;
600
605
  this.nextClusterBaseFinalId = (this.nextClusterBaseFinalId + expansionAmount) as FinalCompressedId;
601
606
  assert(
@@ -617,6 +622,13 @@ export class IdCompressor {
617
622
  const lastFinalizedFinal = (currentBaseFinalId + currentCluster.count - 1) as FinalCompressedId;
618
623
  const finalPivot = (lastFinalizedFinal - overflow + 1) as FinalCompressedId;
619
624
  this.sessionIdNormalizer.addFinalIds(finalPivot, lastFinalizedFinal, currentCluster);
625
+ this.logger?.sendTelemetryEvent({
626
+ eventName: 'IdCompressor:ClusterExpansion',
627
+ sessionId: this.localSessionId,
628
+ previousCapacity,
629
+ newCapacity: currentCluster.capacity,
630
+ overflow,
631
+ });
620
632
  }
621
633
  }
622
634
  } else {
@@ -625,10 +637,18 @@ export class IdCompressor {
625
637
  newBaseUuid = incrementUuid(currentCluster.baseUuid, currentCluster.capacity);
626
638
  currentCluster.count += remainingCapacity;
627
639
  remainingCount -= remainingCapacity;
640
+ this.logger?.sendTelemetryEvent({
641
+ eventName: 'IdCompressor:OverfilledCluster',
642
+ sessionId: this.localSessionId,
643
+ });
628
644
  }
629
645
  } else {
630
646
  // Session has never made a cluster, form a new one with the session UUID as the baseUuid
631
647
  newBaseUuid = session.sessionUuid;
648
+ this.logger?.sendTelemetryEvent({
649
+ eventName: 'IdCompressor:FirstCluster',
650
+ sessionId: this.localSessionId,
651
+ });
632
652
  }
633
653
 
634
654
  // Finalizing a range results in one of three cases:
@@ -652,9 +672,10 @@ export class IdCompressor {
652
672
  }
653
673
 
654
674
  newBaseFinalId = this.nextClusterBaseFinalId;
675
+ const newCapacity = Math.max(this.newClusterCapacity, remainingCount);
655
676
  newCluster = {
656
677
  baseUuid: newBaseUuid,
657
- capacity: Math.max(this.newClusterCapacity, remainingCount),
678
+ capacity: newCapacity,
658
679
  count: remainingCount,
659
680
  session,
660
681
  };
@@ -663,6 +684,12 @@ export class IdCompressor {
663
684
  localIdPivot = (newFirstFinalizedLocal - usedCapacity) as LocalCompressedId;
664
685
 
665
686
  if (isLocal) {
687
+ this.logger?.sendTelemetryEvent({
688
+ eventName: 'IdCompressor:NewCluster',
689
+ sessionId: this.localSessionId,
690
+ clusterCapacity: newCapacity,
691
+ clusterCount: remainingCount,
692
+ });
666
693
  const lastFinalizedFinal = (newBaseFinalId + newCluster.count - 1) as FinalCompressedId;
667
694
  this.sessionIdNormalizer.addFinalIds(newBaseFinalId, lastFinalizedFinal, newCluster);
668
695
  }
@@ -779,6 +806,16 @@ export class IdCompressor {
779
806
  }
780
807
  }
781
808
 
809
+ if (isLocal) {
810
+ this.logger?.sendTelemetryEvent({
811
+ eventName: 'IdCompressor:IdCompressorStatus',
812
+ eagerFinalIdCount,
813
+ localIdCount: remainingCount,
814
+ overridesCount: overrides?.length ?? 0,
815
+ sessionId: this.localSessionId,
816
+ });
817
+ }
818
+
782
819
  session.lastFinalizedLocalId = newLastFinalizedLocal;
783
820
  }
784
821
 
@@ -1014,11 +1051,9 @@ export class IdCompressor {
1014
1051
  // `localOverrides`s. Otherwise, it is a sequential allocation from the session UUID and can simply be negated and
1015
1052
  // added to that UUID to obtain the stable ID associated with it.
1016
1053
  const localOverride = this.localOverrides?.get(id);
1017
- if (localOverride !== undefined) {
1018
- return localOverride;
1019
- } else {
1020
- return stableIdFromNumericUuid(this.localSession.sessionUuid, idOffset - 1);
1021
- }
1054
+ return localOverride !== undefined
1055
+ ? localOverride
1056
+ : stableIdFromNumericUuid(this.localSession.sessionUuid, idOffset - 1);
1022
1057
  }
1023
1058
  }
1024
1059
 
@@ -1056,14 +1091,10 @@ export class IdCompressor {
1056
1091
  const [key, compressionMapping] = closestMatch;
1057
1092
  if (!IdCompressor.isClusterInfo(compressionMapping)) {
1058
1093
  if (key === inversionKey) {
1059
- if (IdCompressor.isUnfinalizedOverride(compressionMapping)) {
1060
- return compressionMapping;
1061
- } else {
1062
- return (
1063
- compressionMapping.associatedLocalId ??
1064
- (compressionMapping.originalOverridingFinal as SessionSpaceCompressedId)
1065
- );
1066
- }
1094
+ return IdCompressor.isUnfinalizedOverride(compressionMapping)
1095
+ ? compressionMapping
1096
+ : compressionMapping.associatedLocalId ??
1097
+ (compressionMapping.originalOverridingFinal as SessionSpaceCompressedId);
1067
1098
  }
1068
1099
  } else {
1069
1100
  if (!isStable) {