@fluidframework/tree 2.1.0-281041 → 2.1.0
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/.vscode/Tree.code-workspace +2 -1
- package/CHANGELOG.md +38 -0
- package/README.md +6 -6
- package/api-report/tree.alpha.api.md +1 -1
- package/api-report/tree.beta.api.md +1 -1
- package/api-report/tree.public.api.md +1 -1
- package/dist/core/forest/editableForest.d.ts.map +1 -1
- package/dist/core/forest/editableForest.js +4 -2
- package/dist/core/forest/editableForest.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts +1 -0
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +13 -0
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts +48 -11
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +144 -20
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexCodec.js +13 -4
- package/dist/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/dist/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/dist/core/tree/index.d.ts +2 -1
- package/dist/core/tree/index.d.ts.map +1 -1
- package/dist/core/tree/index.js.map +1 -1
- package/dist/core/tree/visitDelta.d.ts +3 -1
- package/dist/core/tree/visitDelta.d.ts.map +1 -1
- package/dist/core/tree/visitDelta.js +31 -15
- package/dist/core/tree/visitDelta.js.map +1 -1
- package/dist/core/tree/visitorUtils.d.ts +3 -3
- package/dist/core/tree/visitorUtils.d.ts.map +1 -1
- package/dist/core/tree/visitorUtils.js +4 -4
- package/dist/core/tree/visitorUtils.js.map +1 -1
- package/dist/feature-libraries/editableTreeBinder.js +1 -1
- package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js +0 -52
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/index.d.ts +2 -1
- package/dist/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/index.js +5 -1
- package/dist/feature-libraries/flex-tree/index.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +1 -2
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +10 -18
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +0 -27
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js +1 -1
- package/dist/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +1 -1
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +4 -1
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/discrepancies.js +3 -3
- package/dist/feature-libraries/modular-schema/discrepancies.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/dist/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/dist/feature-libraries/object-forest/objectForest.js +5 -4
- package/dist/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.d.ts.map +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +5 -1
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +8 -1
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/dist/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/dist/shared-tree/treeApi.js +1 -1
- package/dist/shared-tree/treeApi.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +10 -1
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +47 -4
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree/treeView.d.ts.map +1 -1
- package/dist/shared-tree/treeView.js +7 -3
- package/dist/shared-tree/treeView.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +6 -0
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +2 -0
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.d.ts +4 -0
- package/dist/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/dist/shared-tree-core/sharedTreeCore.js +6 -0
- package/dist/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/dist/simple-tree/arrayNode.js +1 -1
- package/dist/simple-tree/arrayNode.js.map +1 -1
- package/dist/simple-tree/index.d.ts +3 -3
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +2 -1
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/proxies.d.ts.map +1 -1
- package/dist/simple-tree/proxies.js +7 -21
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/simple-tree/proxyBinding.d.ts +4 -0
- package/dist/simple-tree/proxyBinding.d.ts.map +1 -1
- package/dist/simple-tree/proxyBinding.js +23 -1
- package/dist/simple-tree/proxyBinding.js.map +1 -1
- package/dist/simple-tree/tree.d.ts.map +1 -1
- package/dist/simple-tree/tree.js +1 -1
- package/dist/simple-tree/tree.js.map +1 -1
- package/dist/simple-tree/treeNodeApi.d.ts +2 -75
- package/dist/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/treeNodeApi.js +7 -15
- package/dist/simple-tree/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/treeNodeKernel.d.ts +26 -0
- package/dist/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/dist/simple-tree/treeNodeKernel.js +83 -0
- package/dist/simple-tree/treeNodeKernel.js.map +1 -0
- package/dist/simple-tree/types.d.ts +73 -0
- package/dist/simple-tree/types.d.ts.map +1 -1
- package/dist/simple-tree/types.js +89 -1
- package/dist/simple-tree/types.js.map +1 -1
- package/dist/util/breakable.js +1 -1
- package/dist/util/breakable.js.map +1 -1
- package/dist/util/index.d.ts +1 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js.map +1 -1
- package/lib/core/forest/editableForest.d.ts.map +1 -1
- package/lib/core/forest/editableForest.js +4 -2
- package/lib/core/forest/editableForest.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts +1 -0
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +13 -0
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts +48 -11
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +145 -21
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexCodec.js +13 -4
- package/lib/core/tree/detachedFieldIndexCodec.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexFormat.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.d.ts +39 -4
- package/lib/core/tree/detachedFieldIndexTypes.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/lib/core/tree/index.d.ts +2 -1
- package/lib/core/tree/index.d.ts.map +1 -1
- package/lib/core/tree/index.js.map +1 -1
- package/lib/core/tree/visitDelta.d.ts +3 -1
- package/lib/core/tree/visitDelta.d.ts.map +1 -1
- package/lib/core/tree/visitDelta.js +31 -15
- package/lib/core/tree/visitDelta.js.map +1 -1
- package/lib/core/tree/visitorUtils.d.ts +3 -3
- package/lib/core/tree/visitorUtils.d.ts.map +1 -1
- package/lib/core/tree/visitorUtils.js +4 -4
- package/lib/core/tree/visitorUtils.js.map +1 -1
- package/lib/feature-libraries/editableTreeBinder.js +1 -1
- package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +1 -8
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js +2 -54
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +1 -13
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js +0 -2
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/index.d.ts +2 -1
- package/lib/feature-libraries/flex-tree/index.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/index.js +2 -1
- package/lib/feature-libraries/flex-tree/index.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +1 -2
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +1 -2
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +12 -20
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +1 -4
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +3 -30
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.d.ts.map +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js +1 -1
- package/lib/feature-libraries/forest-summary/forestSummarizer.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +1 -1
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +1 -1
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/discrepancies.js +3 -3
- package/lib/feature-libraries/modular-schema/discrepancies.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeCodecs.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +14 -17
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.d.ts +3 -2
- package/lib/feature-libraries/object-forest/objectForest.d.ts.map +1 -1
- package/lib/feature-libraries/object-forest/objectForest.js +5 -4
- package/lib/feature-libraries/object-forest/objectForest.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.d.ts.map +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +5 -1
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +8 -1
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js +1 -1
- package/lib/shared-tree/sharedTreeChangeEnricher.js.map +1 -1
- package/lib/shared-tree/treeApi.js +1 -1
- package/lib/shared-tree/treeApi.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +10 -1
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +47 -4
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree/treeView.d.ts.map +1 -1
- package/lib/shared-tree/treeView.js +4 -0
- package/lib/shared-tree/treeView.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +6 -0
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +2 -0
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.d.ts +4 -0
- package/lib/shared-tree-core/sharedTreeCore.d.ts.map +1 -1
- package/lib/shared-tree-core/sharedTreeCore.js +6 -0
- package/lib/shared-tree-core/sharedTreeCore.js.map +1 -1
- package/lib/simple-tree/arrayNode.js +2 -2
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/index.d.ts +3 -3
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +1 -1
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/proxies.d.ts.map +1 -1
- package/lib/simple-tree/proxies.js +7 -21
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/simple-tree/proxyBinding.d.ts +4 -0
- package/lib/simple-tree/proxyBinding.d.ts.map +1 -1
- package/lib/simple-tree/proxyBinding.js +19 -0
- package/lib/simple-tree/proxyBinding.js.map +1 -1
- package/lib/simple-tree/tree.d.ts.map +1 -1
- package/lib/simple-tree/tree.js +1 -1
- package/lib/simple-tree/tree.js.map +1 -1
- package/lib/simple-tree/treeNodeApi.d.ts +2 -75
- package/lib/simple-tree/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/treeNodeApi.js +9 -17
- package/lib/simple-tree/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/treeNodeKernel.d.ts +26 -0
- package/lib/simple-tree/treeNodeKernel.d.ts.map +1 -0
- package/lib/simple-tree/treeNodeKernel.js +79 -0
- package/lib/simple-tree/treeNodeKernel.js.map +1 -0
- package/lib/simple-tree/types.d.ts +73 -0
- package/lib/simple-tree/types.d.ts.map +1 -1
- package/lib/simple-tree/types.js +90 -2
- package/lib/simple-tree/types.js.map +1 -1
- package/lib/util/breakable.js +1 -1
- package/lib/util/breakable.js.map +1 -1
- package/lib/util/index.d.ts +1 -1
- package/lib/util/index.d.ts.map +1 -1
- package/lib/util/index.js.map +1 -1
- package/package.json +22 -22
- package/src/core/forest/editableForest.ts +10 -2
- package/src/core/tree/anchorSet.ts +14 -0
- package/src/core/tree/detachedFieldIndex.ts +217 -35
- package/src/core/tree/detachedFieldIndexCodec.ts +17 -8
- package/src/core/tree/detachedFieldIndexFormat.ts +1 -1
- package/src/core/tree/detachedFieldIndexTypes.ts +41 -5
- package/src/core/tree/index.ts +2 -1
- package/src/core/tree/visitDelta.ts +57 -16
- package/src/core/tree/visitorUtils.ts +7 -4
- package/src/feature-libraries/editableTreeBinder.ts +1 -1
- package/src/feature-libraries/flex-map-tree/mapTreeNode.ts +1 -65
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +0 -19
- package/src/feature-libraries/flex-tree/index.ts +7 -1
- package/src/feature-libraries/flex-tree/lazyEntity.ts +0 -3
- package/src/feature-libraries/flex-tree/lazyField.ts +14 -26
- package/src/feature-libraries/flex-tree/lazyNode.ts +1 -42
- package/src/feature-libraries/forest-summary/forestSummarizer.ts +1 -0
- package/src/feature-libraries/index.ts +3 -0
- package/src/feature-libraries/modular-schema/discrepancies.ts +3 -3
- package/src/feature-libraries/modular-schema/modularChangeCodecs.ts +1 -1
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +22 -20
- package/src/feature-libraries/object-forest/objectForest.ts +7 -3
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/sharedTree.ts +8 -1
- package/src/shared-tree/sharedTreeChangeEnricher.ts +1 -1
- package/src/shared-tree/treeApi.ts +1 -1
- package/src/shared-tree/treeCheckout.ts +56 -5
- package/src/shared-tree/treeView.ts +5 -0
- package/src/shared-tree-core/branch.ts +9 -0
- package/src/shared-tree-core/sharedTreeCore.ts +7 -0
- package/src/simple-tree/arrayNode.ts +2 -2
- package/src/simple-tree/index.ts +3 -3
- package/src/simple-tree/proxies.ts +8 -29
- package/src/simple-tree/proxyBinding.ts +23 -0
- package/src/simple-tree/tree.ts +4 -1
- package/src/simple-tree/treeNodeApi.ts +14 -96
- package/src/simple-tree/treeNodeKernel.ts +91 -0
- package/src/simple-tree/types.ts +233 -2
- package/src/util/breakable.ts +1 -1
- package/src/util/index.ts +1 -0
package/src/simple-tree/types.ts
CHANGED
|
@@ -9,6 +9,7 @@ import { assert } from "@fluidframework/core-utils/internal";
|
|
|
9
9
|
import {
|
|
10
10
|
NodeKind,
|
|
11
11
|
type TreeNodeSchema,
|
|
12
|
+
type TreeNodeSchemaClass,
|
|
12
13
|
type WithType,
|
|
13
14
|
typeNameSymbol,
|
|
14
15
|
} from "./schemaTypes.js";
|
|
@@ -23,7 +24,7 @@ import { isTreeNode } from "./proxies.js";
|
|
|
23
24
|
import { UsageError } from "@fluidframework/telemetry-utils/internal";
|
|
24
25
|
import { getFlexSchema } from "./toFlexSchema.js";
|
|
25
26
|
import { fail } from "../util/index.js";
|
|
26
|
-
import { setFlexNode } from "./proxyBinding.js";
|
|
27
|
+
import { getFlexNode, createKernel, setFlexNode } from "./proxyBinding.js";
|
|
27
28
|
import { tryGetSchema } from "./treeNodeApi.js";
|
|
28
29
|
|
|
29
30
|
/**
|
|
@@ -37,6 +38,81 @@ import { tryGetSchema } from "./treeNodeApi.js";
|
|
|
37
38
|
*/
|
|
38
39
|
export type Unhydrated<T> = T;
|
|
39
40
|
|
|
41
|
+
/**
|
|
42
|
+
* A collection of events that can be emitted by a {@link TreeNode}.
|
|
43
|
+
*
|
|
44
|
+
* @privateRemarks
|
|
45
|
+
* TODO: add a way to subscribe to a specific field (for nodeChanged and treeChanged).
|
|
46
|
+
* Probably have object node and map node specific APIs for this.
|
|
47
|
+
*
|
|
48
|
+
* TODO: ensure that subscription API for fields aligns with API for subscribing to the root.
|
|
49
|
+
*
|
|
50
|
+
* TODO: add more wider area (avoid needing tons of nodeChanged registration) events for use-cases other than treeChanged.
|
|
51
|
+
* Some ideas:
|
|
52
|
+
*
|
|
53
|
+
* - treeChanged, but with some subtrees/fields/paths excluded
|
|
54
|
+
* - helper to batch several nodeChanged calls to a treeChanged scope
|
|
55
|
+
* - parent change (ex: registration on the parent field for a specific index: maybe allow it for a range. Ex: node event takes optional field and optional index range?)
|
|
56
|
+
* - new content inserted into subtree. Either provide event for this and/or enough info to treeChanged to find and search the new sub-trees.
|
|
57
|
+
* Add separate (non event related) API to efficiently scan tree for given set of types (using low level cursor and schema based filtering)
|
|
58
|
+
* to allow efficiently searching for new content (and initial content) of a given type.
|
|
59
|
+
*
|
|
60
|
+
* @sealed @public
|
|
61
|
+
*/
|
|
62
|
+
export interface TreeChangeEvents {
|
|
63
|
+
/**
|
|
64
|
+
* Emitted by a node after a batch of changes has been applied to the tree, if a change affected the node, where a
|
|
65
|
+
* change is:
|
|
66
|
+
*
|
|
67
|
+
* - For an object node, when the value of one of its properties changes (i.e., the property's value is set
|
|
68
|
+
* to something else, including `undefined`).
|
|
69
|
+
*
|
|
70
|
+
* - For an array node, when an element is added, removed, or moved.
|
|
71
|
+
*
|
|
72
|
+
* - For a map node, when an entry is added, updated, or removed.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* This event is not emitted when:
|
|
76
|
+
*
|
|
77
|
+
* - Properties of a child node change. Notably, updates to an array node or a map node (like adding or removing
|
|
78
|
+
* elements/entries) will emit this event on the array/map node itself, but not on the node that contains the
|
|
79
|
+
* array/map node as one of its properties.
|
|
80
|
+
*
|
|
81
|
+
* - The node is moved to a different location in the tree or removed from the tree.
|
|
82
|
+
* In this case the event is emitted on the _parent_ node, not the node itself.
|
|
83
|
+
*
|
|
84
|
+
* For remote edits, this event is not guaranteed to occur in the same order or quantity that it did in
|
|
85
|
+
* the client that made the original edit.
|
|
86
|
+
*
|
|
87
|
+
* When it is emitted, the tree is guaranteed to be in-schema.
|
|
88
|
+
*
|
|
89
|
+
* @privateRemarks
|
|
90
|
+
* This event occurs whenever the apparent contents of the node instance change, regardless of what caused the change.
|
|
91
|
+
* For example, it will fire when the local client reassigns a child, when part of a remote edit is applied to the
|
|
92
|
+
* node, or when the node has to be updated due to resolution of a merge conflict
|
|
93
|
+
* (for example a previously applied local change might be undone, then reapplied differently or not at all).
|
|
94
|
+
*/
|
|
95
|
+
nodeChanged(): void;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Emitted by a node after a batch of changes has been applied to the tree, when something changed anywhere in the
|
|
99
|
+
* subtree rooted at it.
|
|
100
|
+
*
|
|
101
|
+
* @remarks
|
|
102
|
+
* This event is not emitted when the node itself is moved to a different location in the tree or removed from the tree.
|
|
103
|
+
* In that case it is emitted on the _parent_ node, not the node itself.
|
|
104
|
+
*
|
|
105
|
+
* The node itself is part of the subtree, so this event will be emitted even if the only changes are to the properties
|
|
106
|
+
* of the node itself.
|
|
107
|
+
*
|
|
108
|
+
* For remote edits, this event is not guaranteed to occur in the same order or quantity that it did in
|
|
109
|
+
* the client that made the original edit.
|
|
110
|
+
*
|
|
111
|
+
* When it is emitted, the tree is guaranteed to be in-schema.
|
|
112
|
+
*/
|
|
113
|
+
treeChanged(): void;
|
|
114
|
+
}
|
|
115
|
+
|
|
40
116
|
/**
|
|
41
117
|
* A non-{@link NodeKind.Leaf|leaf} SharedTree node. Includes objects, arrays, and maps.
|
|
42
118
|
*
|
|
@@ -239,7 +315,7 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
239
315
|
schemaBase.constructorCached = { constructor: this, oneTimeInitialized: false };
|
|
240
316
|
assert(
|
|
241
317
|
this.constructorCached === schemaBase.constructorCached,
|
|
242
|
-
|
|
318
|
+
0x9b5 /* Inheritance should work */,
|
|
243
319
|
);
|
|
244
320
|
return this.constructorCached;
|
|
245
321
|
} else if (this.constructorCached.constructor === this) {
|
|
@@ -285,6 +361,7 @@ export abstract class TreeNodeValid<TInput> extends TreeNode {
|
|
|
285
361
|
);
|
|
286
362
|
|
|
287
363
|
const result = schema.prepareInstance(this, node);
|
|
364
|
+
createKernel(result);
|
|
288
365
|
setFlexNode(result, node);
|
|
289
366
|
return result;
|
|
290
367
|
}
|
|
@@ -323,3 +400,157 @@ export function toFlexTreeNode(node: InternalTreeNode): FlexTreeNode {
|
|
|
323
400
|
assert(isFlexTreeNode(node), 0x963 /* Invalid InternalTreeNode */);
|
|
324
401
|
return node;
|
|
325
402
|
}
|
|
403
|
+
|
|
404
|
+
// #region NodeJS custom inspect for TreeNodes.
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Used to customize "inspect" behavior in NodeJS.
|
|
408
|
+
* See https://nodejs.org/api/util.html#utilinspectcustom for details.
|
|
409
|
+
*
|
|
410
|
+
* VS-Code's debugger also uses this to inspect objects,
|
|
411
|
+
* see https://github.com/microsoft/vscode-js-debug/blob/64df2686c92bac402909dee5c3c389bbb7a81f6d/src/adapter/templates/getStringyProps.ts#L11 for details.
|
|
412
|
+
*/
|
|
413
|
+
const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Node inspecting function for use with {@link customInspectSymbol}.
|
|
417
|
+
*/
|
|
418
|
+
function inspectNodeFunction(
|
|
419
|
+
this: TreeNodeValid<unknown>,
|
|
420
|
+
depth: number,
|
|
421
|
+
options?: unknown,
|
|
422
|
+
inspect?: unknown,
|
|
423
|
+
): unknown {
|
|
424
|
+
// TODO: replicated from tryGetSchema to avoid cycle.
|
|
425
|
+
// This case could be optimized, for example by placing the simple schema in a symbol on tree nodes.
|
|
426
|
+
const schema = tryGetSimpleNodeSchema(getFlexNode(this).schema) as TreeNodeSchemaClass;
|
|
427
|
+
const title = `${schema.name}: ${NodeKind[schema.kind]} Node (${schema.identifier})`;
|
|
428
|
+
|
|
429
|
+
if (depth < 2) {
|
|
430
|
+
const short = shortContent(this);
|
|
431
|
+
if (short !== undefined) {
|
|
432
|
+
return `${title} ${short}`;
|
|
433
|
+
}
|
|
434
|
+
return title;
|
|
435
|
+
}
|
|
436
|
+
const content = `${title} ${JSON.stringify(this)}`;
|
|
437
|
+
return content;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* If the node has no items, a short JSON string for it.
|
|
442
|
+
*/
|
|
443
|
+
function shortContent(node: TreeNodeValid<unknown>): string | undefined {
|
|
444
|
+
if (Object.values(node).length === 0) {
|
|
445
|
+
return JSON.stringify(node);
|
|
446
|
+
}
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Add inherited non-enumerable symbol for NodeJS inspection to all nodes.
|
|
452
|
+
*
|
|
453
|
+
* See {@link customInspectSymbol}.
|
|
454
|
+
*/
|
|
455
|
+
Object.defineProperty(TreeNodeValid.prototype, customInspectSymbol, {
|
|
456
|
+
value: inspectNodeFunction,
|
|
457
|
+
enumerable: false,
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
// #endregion
|
|
461
|
+
|
|
462
|
+
// #region Browser custom debug format for TreeNodes
|
|
463
|
+
|
|
464
|
+
// This section has side-effects, so including it in this file ensures its loaded whenever TreeNodes could exist.
|
|
465
|
+
// Supported in at least Chrome and FireFox, more details at https://firefox-source-docs.mozilla.org/devtools-user/custom_formatters/index.html
|
|
466
|
+
// For this to work the browser's dev tools generally have to "Enable custom formatters".
|
|
467
|
+
|
|
468
|
+
// This formatter is inspired by https://github.com/andrewdavey/immutable-devtools/blob/master/src/createFormatters.js which provides a similar formatter for the immutable.js library.
|
|
469
|
+
|
|
470
|
+
const globals = typeof window === "undefined" ? globalThis : window;
|
|
471
|
+
const formatters = ((
|
|
472
|
+
globals as { devtoolsFormatters?: DevtoolsFormatter.DevtoolsFormatter[] }
|
|
473
|
+
).devtoolsFormatters ??= []);
|
|
474
|
+
|
|
475
|
+
const nodeFormatter: DevtoolsFormatter.DevtoolsFormatter = {
|
|
476
|
+
header(object, config) {
|
|
477
|
+
if (isTreeNode(object)) {
|
|
478
|
+
return ["span", `${inspectNodeFunction.call(object, 1)}`];
|
|
479
|
+
}
|
|
480
|
+
return null;
|
|
481
|
+
},
|
|
482
|
+
body(object, config): DevtoolsFormatter.Item {
|
|
483
|
+
const children: DevtoolsFormatter.Item[] = [];
|
|
484
|
+
for (const [key, value] of Object.entries(object as TreeNode)) {
|
|
485
|
+
children.push(["li", ["span", `${key}: `], formattedReference(value)]);
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// TODO:
|
|
489
|
+
// for array nodes, this isn't great since (at least in FireFox) the list items show up with a prefixed number starting from 1.
|
|
490
|
+
// This looks messy when followed by the array index.
|
|
491
|
+
// Find a way to hide the list index.
|
|
492
|
+
// { style: 'list-style-type: none` } did not seem to work.
|
|
493
|
+
|
|
494
|
+
return ["ol", ...children];
|
|
495
|
+
},
|
|
496
|
+
hasBody(object, config) {
|
|
497
|
+
return shortContent(object as TreeNodeValid<undefined>) === undefined;
|
|
498
|
+
},
|
|
499
|
+
};
|
|
500
|
+
|
|
501
|
+
function formattedReference(
|
|
502
|
+
object: unknown,
|
|
503
|
+
config?: DevtoolsFormatter.ObjectConfig,
|
|
504
|
+
): DevtoolsFormatter.Item {
|
|
505
|
+
if (typeof object === "undefined") {
|
|
506
|
+
return ["span", "undefined"];
|
|
507
|
+
} else if (object === "null") {
|
|
508
|
+
return ["span", "null"];
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return ["object", { object, config }];
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
formatters.push(nodeFormatter);
|
|
515
|
+
|
|
516
|
+
// #endregion
|
|
517
|
+
|
|
518
|
+
// These types are based on https://github.com/BenjaminAster/Better-TypeScript/blob/main/types/devtools-formatters.d.ts
|
|
519
|
+
// however the original package causes multiple compile errors due to some of its other types it used, so the relevant part has been extracted and adjusted to better match our conventions.
|
|
520
|
+
declare namespace DevtoolsFormatter {
|
|
521
|
+
type ObjectConfig = Record<string | symbol, unknown>;
|
|
522
|
+
|
|
523
|
+
type ElementTagName = "div" | "span" | "ol" | "li" | "table" | "tr" | "td";
|
|
524
|
+
|
|
525
|
+
type ElementTemplate = StyledElementTemplate | UnstyledElementTemplate;
|
|
526
|
+
|
|
527
|
+
type StyledElementTemplate = readonly [
|
|
528
|
+
ElementTagName,
|
|
529
|
+
{
|
|
530
|
+
style?: string;
|
|
531
|
+
},
|
|
532
|
+
...Item[],
|
|
533
|
+
];
|
|
534
|
+
|
|
535
|
+
type UnstyledElementTemplate = readonly [ElementTagName, ...Item[]];
|
|
536
|
+
|
|
537
|
+
type ObjectReference = readonly [
|
|
538
|
+
"object",
|
|
539
|
+
{
|
|
540
|
+
object: unknown;
|
|
541
|
+
config?: ObjectConfig;
|
|
542
|
+
},
|
|
543
|
+
];
|
|
544
|
+
|
|
545
|
+
type Item = string | ElementTemplate | ObjectReference;
|
|
546
|
+
|
|
547
|
+
interface DevtoolsFormatter {
|
|
548
|
+
header(
|
|
549
|
+
object?: unknown,
|
|
550
|
+
config?: ObjectConfig,
|
|
551
|
+
// eslint-disable-next-line @rushstack/no-new-null
|
|
552
|
+
): Item | null;
|
|
553
|
+
hasBody(object?: unknown, config?: ObjectConfig): boolean;
|
|
554
|
+
body(object?: unknown, config?: ObjectConfig): Item;
|
|
555
|
+
}
|
|
556
|
+
}
|
package/src/util/breakable.ts
CHANGED
|
@@ -79,7 +79,7 @@ export class Breakable {
|
|
|
79
79
|
* This is pretty much only safe in tests which just were checking a specific error was thrown, and which know that error closepath is actually exception safe.
|
|
80
80
|
*/
|
|
81
81
|
public clearError(): void {
|
|
82
|
-
assert(this.brokenBy !== undefined,
|
|
82
|
+
assert(this.brokenBy !== undefined, 0x9b6 /* No error to clear */);
|
|
83
83
|
this.brokenBy = undefined;
|
|
84
84
|
}
|
|
85
85
|
}
|