@fluidframework/tree 2.3.1 → 2.4.0-297027
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/api-report/tree.alpha.api.md +77 -38
- package/api-report/tree.beta.api.md +50 -30
- package/api-report/tree.legacy.alpha.api.md +50 -30
- package/api-report/tree.legacy.public.api.md +50 -30
- package/api-report/tree.public.api.md +50 -30
- package/dist/alpha.d.ts +7 -0
- package/dist/beta.d.ts +4 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/rebase/index.d.ts +1 -1
- package/dist/core/rebase/index.d.ts.map +1 -1
- package/dist/core/rebase/index.js +2 -1
- package/dist/core/rebase/index.js.map +1 -1
- package/dist/core/rebase/types.d.ts +1 -0
- package/dist/core/rebase/types.d.ts.map +1 -1
- package/dist/core/rebase/types.js +8 -1
- package/dist/core/rebase/types.js.map +1 -1
- package/dist/core/schema-stored/schema.d.ts +7 -0
- package/dist/core/schema-stored/schema.d.ts.map +1 -1
- package/dist/core/schema-stored/schema.js +9 -0
- package/dist/core/schema-stored/schema.js.map +1 -1
- package/dist/core/tree/anchorSet.d.ts +1 -2
- package/dist/core/tree/anchorSet.d.ts.map +1 -1
- package/dist/core/tree/anchorSet.js +2 -2
- package/dist/core/tree/anchorSet.js.map +1 -1
- package/dist/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/dist/core/tree/detachedFieldIndex.js +13 -2
- package/dist/core/tree/detachedFieldIndex.js.map +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.d.ts +1 -1
- package/dist/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/dist/feature-libraries/editableTreeBinder.d.ts +3 -230
- package/dist/feature-libraries/editableTreeBinder.d.ts.map +1 -1
- package/dist/feature-libraries/editableTreeBinder.js +1 -539
- package/dist/feature-libraries/editableTreeBinder.js.map +1 -1
- package/dist/feature-libraries/flex-tree/context.d.ts +7 -14
- package/dist/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/context.js +3 -3
- package/dist/feature-libraries/flex-tree/context.js.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -16
- package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts +2 -3
- package/dist/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyEntity.js +1 -2
- package/dist/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.d.ts +10 -15
- package/dist/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyField.js +18 -20
- package/dist/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts +4 -5
- package/dist/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/dist/feature-libraries/flex-tree/lazyNode.js +13 -23
- package/dist/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/dist/feature-libraries/flex-tree/utilities.js +1 -1
- package/dist/feature-libraries/flex-tree/utilities.js.map +1 -1
- package/dist/feature-libraries/index.d.ts +4 -7
- package/dist/feature-libraries/index.d.ts.map +1 -1
- package/dist/feature-libraries/index.js +5 -31
- package/dist/feature-libraries/index.js.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts +7 -0
- package/dist/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js +61 -17
- package/dist/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/compose.js +3 -0
- package/dist/feature-libraries/sequence-field/compose.js.map +1 -1
- package/dist/feature-libraries/sequence-field/formatV1.d.ts +18 -18
- package/dist/feature-libraries/sequence-field/formatV2.d.ts +18 -18
- package/dist/feature-libraries/sequence-field/formatV3.d.ts +27 -27
- package/dist/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/dist/feature-libraries/sequence-field/utils.js +1 -4
- package/dist/feature-libraries/sequence-field/utils.js.map +1 -1
- package/dist/feature-libraries/typed-schema/flexList.d.ts +1 -46
- package/dist/feature-libraries/typed-schema/flexList.d.ts.map +1 -1
- package/dist/feature-libraries/typed-schema/flexList.js +1 -13
- package/dist/feature-libraries/typed-schema/flexList.js.map +1 -1
- package/dist/feature-libraries/typed-schema/index.d.ts +2 -4
- package/dist/feature-libraries/typed-schema/index.d.ts.map +1 -1
- package/dist/feature-libraries/typed-schema/index.js +1 -19
- package/dist/feature-libraries/typed-schema/index.js.map +1 -1
- package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts +0 -212
- package/dist/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
- package/dist/feature-libraries/typed-schema/typedTreeSchema.js +0 -266
- package/dist/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/internalTypes.d.ts +1 -1
- package/dist/internalTypes.d.ts.map +1 -1
- package/dist/internalTypes.js.map +1 -1
- package/dist/legacy.d.ts +4 -0
- 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/public.d.ts +4 -0
- package/dist/shared-tree/checkoutFlexTreeView.d.ts +3 -3
- package/dist/shared-tree/checkoutFlexTreeView.d.ts.map +1 -1
- package/dist/shared-tree/checkoutFlexTreeView.js +1 -1
- package/dist/shared-tree/checkoutFlexTreeView.js.map +1 -1
- package/dist/shared-tree/index.d.ts +3 -3
- package/dist/shared-tree/index.d.ts.map +1 -1
- package/dist/shared-tree/index.js +2 -3
- package/dist/shared-tree/index.js.map +1 -1
- package/dist/shared-tree/schematizeTree.d.ts +1 -40
- package/dist/shared-tree/schematizeTree.d.ts.map +1 -1
- package/dist/shared-tree/schematizeTree.js +2 -11
- package/dist/shared-tree/schematizeTree.js.map +1 -1
- package/dist/shared-tree/schematizingTreeView.d.ts +9 -7
- package/dist/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/dist/shared-tree/schematizingTreeView.js +19 -8
- package/dist/shared-tree/schematizingTreeView.js.map +1 -1
- package/dist/shared-tree/sharedTree.d.ts +19 -2
- package/dist/shared-tree/sharedTree.d.ts.map +1 -1
- package/dist/shared-tree/sharedTree.js +10 -2
- package/dist/shared-tree/sharedTree.js.map +1 -1
- package/dist/shared-tree/treeCheckout.d.ts +71 -41
- package/dist/shared-tree/treeCheckout.d.ts.map +1 -1
- package/dist/shared-tree/treeCheckout.js +116 -84
- package/dist/shared-tree/treeCheckout.js.map +1 -1
- package/dist/shared-tree-core/branch.d.ts +8 -11
- package/dist/shared-tree-core/branch.d.ts.map +1 -1
- package/dist/shared-tree-core/branch.js +12 -15
- package/dist/shared-tree-core/branch.js.map +1 -1
- package/dist/simple-tree/api/create.d.ts +1 -1
- package/dist/simple-tree/api/create.d.ts.map +1 -1
- package/dist/simple-tree/api/create.js +11 -13
- package/dist/simple-tree/api/create.js.map +1 -1
- package/dist/simple-tree/api/getJsonSchema.d.ts +3 -3
- package/dist/simple-tree/api/getJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/getJsonSchema.js +1 -1
- package/dist/simple-tree/api/getJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/getSimpleSchema.d.ts +2 -2
- package/dist/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/dist/simple-tree/api/index.d.ts +2 -1
- package/dist/simple-tree/api/index.d.ts.map +1 -1
- package/dist/simple-tree/api/index.js +3 -1
- package/dist/simple-tree/api/index.js.map +1 -1
- package/dist/simple-tree/api/jsonSchema.d.ts +13 -14
- package/dist/simple-tree/api/jsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/jsonSchema.js.map +1 -1
- package/dist/simple-tree/api/schemaFactory.d.ts +14 -8
- package/dist/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactory.js +21 -2
- package/dist/simple-tree/api/schemaFactory.js.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts +3 -3
- package/dist/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/dist/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/dist/simple-tree/api/simpleSchema.d.ts +18 -10
- package/dist/simple-tree/api/simpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchema.js.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js +30 -17
- package/dist/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/dist/simple-tree/api/tree.d.ts +16 -6
- package/dist/simple-tree/api/tree.d.ts.map +1 -1
- package/dist/simple-tree/api/tree.js +4 -4
- package/dist/simple-tree/api/tree.js.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/dist/simple-tree/api/treeNodeApi.js +8 -6
- package/dist/simple-tree/api/treeNodeApi.js.map +1 -1
- package/dist/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/dist/simple-tree/api/verboseTree.js +6 -10
- package/dist/simple-tree/api/verboseTree.js.map +1 -1
- package/{lib/feature-libraries/typed-schema → dist/simple-tree/api}/view.d.ts +4 -11
- package/dist/simple-tree/api/view.d.ts.map +1 -0
- package/dist/{feature-libraries/typed-schema → simple-tree/api}/view.js +9 -9
- package/dist/simple-tree/api/view.js.map +1 -0
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts +2 -2
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js +11 -1
- package/dist/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/dist/simple-tree/arrayNode.d.ts +147 -14
- package/dist/simple-tree/arrayNode.d.ts.map +1 -1
- package/dist/simple-tree/arrayNode.js +32 -20
- package/dist/simple-tree/arrayNode.js.map +1 -1
- package/dist/simple-tree/core/context.d.ts +55 -0
- package/dist/simple-tree/core/context.d.ts.map +1 -0
- package/dist/simple-tree/core/context.js +60 -0
- package/dist/simple-tree/core/context.js.map +1 -0
- package/dist/simple-tree/core/getOrCreateNode.d.ts +15 -0
- package/dist/simple-tree/core/getOrCreateNode.d.ts.map +1 -0
- package/dist/simple-tree/core/getOrCreateNode.js +36 -0
- package/dist/simple-tree/core/getOrCreateNode.js.map +1 -0
- package/dist/simple-tree/core/index.d.ts +7 -3
- package/dist/simple-tree/core/index.d.ts.map +1 -1
- package/dist/simple-tree/core/index.js +16 -7
- package/dist/simple-tree/core/index.js.map +1 -1
- package/dist/simple-tree/core/schemaCaching.d.ts +5 -13
- package/dist/simple-tree/core/schemaCaching.d.ts.map +1 -1
- package/dist/simple-tree/core/schemaCaching.js +16 -45
- package/dist/simple-tree/core/schemaCaching.js.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.d.ts +29 -7
- package/dist/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeKernel.js +94 -58
- package/dist/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.d.ts +24 -0
- package/dist/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/dist/simple-tree/core/types.d.ts +0 -5
- package/dist/simple-tree/core/types.d.ts.map +1 -1
- package/dist/simple-tree/core/types.js.map +1 -1
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts +139 -0
- package/dist/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -0
- package/dist/{feature-libraries/flex-map-tree/mapTreeNode.js → simple-tree/core/unhydratedFlexTree.js} +112 -132
- package/dist/simple-tree/core/unhydratedFlexTree.js.map +1 -0
- package/dist/simple-tree/{walkSchema.d.ts → core/walkSchema.d.ts} +8 -4
- package/dist/simple-tree/core/walkSchema.d.ts.map +1 -0
- package/dist/simple-tree/core/walkSchema.js +34 -0
- package/dist/simple-tree/core/walkSchema.js.map +1 -0
- package/dist/simple-tree/createContext.d.ts +11 -0
- package/dist/simple-tree/createContext.d.ts.map +1 -0
- package/dist/simple-tree/createContext.js +25 -0
- package/dist/simple-tree/createContext.js.map +1 -0
- package/dist/simple-tree/index.d.ts +4 -5
- package/dist/simple-tree/index.d.ts.map +1 -1
- package/dist/simple-tree/index.js +7 -7
- package/dist/simple-tree/index.js.map +1 -1
- package/dist/simple-tree/leafNodeSchema.d.ts +1 -0
- package/dist/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/dist/simple-tree/leafNodeSchema.js +1 -2
- package/dist/simple-tree/leafNodeSchema.js.map +1 -1
- package/dist/simple-tree/mapNode.d.ts +4 -4
- package/dist/simple-tree/mapNode.d.ts.map +1 -1
- package/dist/simple-tree/mapNode.js +9 -5
- package/dist/simple-tree/mapNode.js.map +1 -1
- package/dist/simple-tree/objectNode.d.ts +8 -8
- package/dist/simple-tree/objectNode.d.ts.map +1 -1
- package/dist/simple-tree/objectNode.js +33 -14
- package/dist/simple-tree/objectNode.js.map +1 -1
- package/dist/simple-tree/objectNodeTypes.d.ts +7 -3
- package/dist/simple-tree/objectNodeTypes.d.ts.map +1 -1
- package/dist/simple-tree/objectNodeTypes.js.map +1 -1
- package/dist/simple-tree/proxies.d.ts +1 -2
- package/dist/simple-tree/proxies.d.ts.map +1 -1
- package/dist/simple-tree/proxies.js +6 -22
- package/dist/simple-tree/proxies.js.map +1 -1
- package/dist/simple-tree/schemaTypes.d.ts +44 -4
- package/dist/simple-tree/schemaTypes.d.ts.map +1 -1
- package/dist/simple-tree/schemaTypes.js +10 -0
- package/dist/simple-tree/schemaTypes.js.map +1 -1
- package/dist/simple-tree/toFlexSchema.d.ts +6 -36
- package/dist/simple-tree/toFlexSchema.d.ts.map +1 -1
- package/dist/simple-tree/toFlexSchema.js +58 -142
- package/dist/simple-tree/toFlexSchema.js.map +1 -1
- package/dist/simple-tree/toMapTree.d.ts.map +1 -1
- package/dist/simple-tree/toMapTree.js +2 -2
- package/dist/simple-tree/toMapTree.js.map +1 -1
- package/dist/simple-tree/treeNodeValid.d.ts +13 -5
- package/dist/simple-tree/treeNodeValid.d.ts.map +1 -1
- package/dist/simple-tree/treeNodeValid.js +19 -10
- package/dist/simple-tree/treeNodeValid.js.map +1 -1
- package/dist/simple-tree/typesUnsafe.d.ts +4 -4
- package/dist/simple-tree/typesUnsafe.d.ts.map +1 -1
- package/dist/simple-tree/typesUnsafe.js.map +1 -1
- package/dist/simple-tree/walkFieldSchema.d.ts +11 -0
- package/dist/simple-tree/walkFieldSchema.d.ts.map +1 -0
- package/dist/simple-tree/walkFieldSchema.js +17 -0
- package/dist/simple-tree/walkFieldSchema.js.map +1 -0
- 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/dist/util/typeUtils.d.ts +14 -45
- package/dist/util/typeUtils.d.ts.map +1 -1
- package/dist/util/typeUtils.js.map +1 -1
- package/lib/alpha.d.ts +7 -0
- package/lib/beta.d.ts +4 -0
- package/lib/core/index.d.ts +1 -1
- package/lib/core/index.d.ts.map +1 -1
- package/lib/core/index.js +1 -1
- package/lib/core/index.js.map +1 -1
- package/lib/core/rebase/index.d.ts +1 -1
- package/lib/core/rebase/index.d.ts.map +1 -1
- package/lib/core/rebase/index.js +1 -1
- package/lib/core/rebase/index.js.map +1 -1
- package/lib/core/rebase/types.d.ts +1 -0
- package/lib/core/rebase/types.d.ts.map +1 -1
- package/lib/core/rebase/types.js +6 -0
- package/lib/core/rebase/types.js.map +1 -1
- package/lib/core/schema-stored/schema.d.ts +7 -0
- package/lib/core/schema-stored/schema.d.ts.map +1 -1
- package/lib/core/schema-stored/schema.js +9 -0
- package/lib/core/schema-stored/schema.js.map +1 -1
- package/lib/core/tree/anchorSet.d.ts +1 -2
- package/lib/core/tree/anchorSet.d.ts.map +1 -1
- package/lib/core/tree/anchorSet.js +2 -2
- package/lib/core/tree/anchorSet.js.map +1 -1
- package/lib/core/tree/detachedFieldIndex.d.ts.map +1 -1
- package/lib/core/tree/detachedFieldIndex.js +13 -2
- package/lib/core/tree/detachedFieldIndex.js.map +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.d.ts +1 -1
- package/lib/core/tree/detachedFieldIndexTypes.js.map +1 -1
- package/lib/feature-libraries/editableTreeBinder.d.ts +3 -230
- package/lib/feature-libraries/editableTreeBinder.d.ts.map +1 -1
- package/lib/feature-libraries/editableTreeBinder.js +1 -532
- package/lib/feature-libraries/editableTreeBinder.js.map +1 -1
- package/lib/feature-libraries/flex-tree/context.d.ts +7 -14
- package/lib/feature-libraries/flex-tree/context.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/context.js +3 -3
- package/lib/feature-libraries/flex-tree/context.js.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -16
- package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts +2 -3
- package/lib/feature-libraries/flex-tree/lazyEntity.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyEntity.js +1 -2
- package/lib/feature-libraries/flex-tree/lazyEntity.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.d.ts +10 -15
- package/lib/feature-libraries/flex-tree/lazyField.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyField.js +18 -20
- package/lib/feature-libraries/flex-tree/lazyField.js.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts +4 -5
- package/lib/feature-libraries/flex-tree/lazyNode.d.ts.map +1 -1
- package/lib/feature-libraries/flex-tree/lazyNode.js +13 -23
- package/lib/feature-libraries/flex-tree/lazyNode.js.map +1 -1
- package/lib/feature-libraries/flex-tree/utilities.js +1 -1
- package/lib/feature-libraries/flex-tree/utilities.js.map +1 -1
- package/lib/feature-libraries/index.d.ts +4 -7
- package/lib/feature-libraries/index.d.ts.map +1 -1
- package/lib/feature-libraries/index.js +4 -6
- package/lib/feature-libraries/index.js.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts +7 -0
- package/lib/feature-libraries/modular-schema/modularChangeFamily.d.ts.map +1 -1
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js +62 -18
- package/lib/feature-libraries/modular-schema/modularChangeFamily.js.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/compose.js +3 -0
- package/lib/feature-libraries/sequence-field/compose.js.map +1 -1
- package/lib/feature-libraries/sequence-field/formatV1.d.ts +18 -18
- package/lib/feature-libraries/sequence-field/formatV2.d.ts +18 -18
- package/lib/feature-libraries/sequence-field/formatV3.d.ts +27 -27
- package/lib/feature-libraries/sequence-field/utils.d.ts.map +1 -1
- package/lib/feature-libraries/sequence-field/utils.js +2 -5
- package/lib/feature-libraries/sequence-field/utils.js.map +1 -1
- package/lib/feature-libraries/typed-schema/flexList.d.ts +1 -46
- package/lib/feature-libraries/typed-schema/flexList.d.ts.map +1 -1
- package/lib/feature-libraries/typed-schema/flexList.js +0 -11
- package/lib/feature-libraries/typed-schema/flexList.js.map +1 -1
- package/lib/feature-libraries/typed-schema/index.d.ts +2 -4
- package/lib/feature-libraries/typed-schema/index.d.ts.map +1 -1
- package/lib/feature-libraries/typed-schema/index.js +0 -3
- package/lib/feature-libraries/typed-schema/index.js.map +1 -1
- package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts +0 -212
- package/lib/feature-libraries/typed-schema/typedTreeSchema.d.ts.map +1 -1
- package/lib/feature-libraries/typed-schema/typedTreeSchema.js +1 -253
- package/lib/feature-libraries/typed-schema/typedTreeSchema.js.map +1 -1
- package/lib/index.d.ts +3 -3
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/internalTypes.d.ts +1 -1
- package/lib/internalTypes.d.ts.map +1 -1
- package/lib/internalTypes.js.map +1 -1
- package/lib/legacy.d.ts +4 -0
- 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/public.d.ts +4 -0
- package/lib/shared-tree/checkoutFlexTreeView.d.ts +3 -3
- package/lib/shared-tree/checkoutFlexTreeView.d.ts.map +1 -1
- package/lib/shared-tree/checkoutFlexTreeView.js +1 -1
- package/lib/shared-tree/checkoutFlexTreeView.js.map +1 -1
- package/lib/shared-tree/index.d.ts +3 -3
- package/lib/shared-tree/index.d.ts.map +1 -1
- package/lib/shared-tree/index.js +1 -2
- package/lib/shared-tree/index.js.map +1 -1
- package/lib/shared-tree/schematizeTree.d.ts +1 -40
- package/lib/shared-tree/schematizeTree.d.ts.map +1 -1
- package/lib/shared-tree/schematizeTree.js +1 -9
- package/lib/shared-tree/schematizeTree.js.map +1 -1
- package/lib/shared-tree/schematizingTreeView.d.ts +9 -7
- package/lib/shared-tree/schematizingTreeView.d.ts.map +1 -1
- package/lib/shared-tree/schematizingTreeView.js +22 -11
- package/lib/shared-tree/schematizingTreeView.js.map +1 -1
- package/lib/shared-tree/sharedTree.d.ts +19 -2
- package/lib/shared-tree/sharedTree.d.ts.map +1 -1
- package/lib/shared-tree/sharedTree.js +10 -3
- package/lib/shared-tree/sharedTree.js.map +1 -1
- package/lib/shared-tree/treeCheckout.d.ts +71 -41
- package/lib/shared-tree/treeCheckout.d.ts.map +1 -1
- package/lib/shared-tree/treeCheckout.js +118 -86
- package/lib/shared-tree/treeCheckout.js.map +1 -1
- package/lib/shared-tree-core/branch.d.ts +8 -11
- package/lib/shared-tree-core/branch.d.ts.map +1 -1
- package/lib/shared-tree-core/branch.js +12 -15
- package/lib/shared-tree-core/branch.js.map +1 -1
- package/lib/simple-tree/api/create.d.ts +1 -1
- package/lib/simple-tree/api/create.d.ts.map +1 -1
- package/lib/simple-tree/api/create.js +14 -16
- package/lib/simple-tree/api/create.js.map +1 -1
- package/lib/simple-tree/api/getJsonSchema.d.ts +3 -3
- package/lib/simple-tree/api/getJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/getJsonSchema.js +1 -1
- package/lib/simple-tree/api/getJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/getSimpleSchema.d.ts +2 -2
- package/lib/simple-tree/api/getSimpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/getSimpleSchema.js.map +1 -1
- package/lib/simple-tree/api/index.d.ts +2 -1
- package/lib/simple-tree/api/index.d.ts.map +1 -1
- package/lib/simple-tree/api/index.js +1 -0
- package/lib/simple-tree/api/index.js.map +1 -1
- package/lib/simple-tree/api/jsonSchema.d.ts +13 -14
- package/lib/simple-tree/api/jsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/jsonSchema.js.map +1 -1
- package/lib/simple-tree/api/schemaFactory.d.ts +14 -8
- package/lib/simple-tree/api/schemaFactory.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactory.js +21 -2
- package/lib/simple-tree/api/schemaFactory.js.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts +3 -3
- package/lib/simple-tree/api/schemaFactoryRecursive.d.ts.map +1 -1
- package/lib/simple-tree/api/schemaFactoryRecursive.js.map +1 -1
- package/lib/simple-tree/api/simpleSchema.d.ts +18 -10
- package/lib/simple-tree/api/simpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchema.js.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js +31 -18
- package/lib/simple-tree/api/simpleSchemaToJsonSchema.js.map +1 -1
- package/lib/simple-tree/api/tree.d.ts +16 -6
- package/lib/simple-tree/api/tree.d.ts.map +1 -1
- package/lib/simple-tree/api/tree.js +4 -4
- package/lib/simple-tree/api/tree.js.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.d.ts.map +1 -1
- package/lib/simple-tree/api/treeNodeApi.js +10 -8
- package/lib/simple-tree/api/treeNodeApi.js.map +1 -1
- package/lib/simple-tree/api/verboseTree.d.ts.map +1 -1
- package/lib/simple-tree/api/verboseTree.js +6 -10
- package/lib/simple-tree/api/verboseTree.js.map +1 -1
- package/{dist/feature-libraries/typed-schema → lib/simple-tree/api}/view.d.ts +4 -11
- package/lib/simple-tree/api/view.d.ts.map +1 -0
- package/lib/{feature-libraries/typed-schema → simple-tree/api}/view.js +9 -9
- package/lib/simple-tree/api/view.js.map +1 -0
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts +2 -2
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.d.ts.map +1 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js +11 -1
- package/lib/simple-tree/api/viewSchemaToSimpleSchema.js.map +1 -1
- package/lib/simple-tree/arrayNode.d.ts +147 -14
- package/lib/simple-tree/arrayNode.d.ts.map +1 -1
- package/lib/simple-tree/arrayNode.js +37 -25
- package/lib/simple-tree/arrayNode.js.map +1 -1
- package/lib/simple-tree/core/context.d.ts +55 -0
- package/lib/simple-tree/core/context.d.ts.map +1 -0
- package/lib/simple-tree/core/context.js +55 -0
- package/lib/simple-tree/core/context.js.map +1 -0
- package/lib/simple-tree/core/getOrCreateNode.d.ts +15 -0
- package/lib/simple-tree/core/getOrCreateNode.d.ts.map +1 -0
- package/lib/simple-tree/core/getOrCreateNode.js +32 -0
- package/lib/simple-tree/core/getOrCreateNode.js.map +1 -0
- package/lib/simple-tree/core/index.d.ts +7 -3
- package/lib/simple-tree/core/index.d.ts.map +1 -1
- package/lib/simple-tree/core/index.js +6 -2
- package/lib/simple-tree/core/index.js.map +1 -1
- package/lib/simple-tree/core/schemaCaching.d.ts +5 -13
- package/lib/simple-tree/core/schemaCaching.d.ts.map +1 -1
- package/lib/simple-tree/core/schemaCaching.js +13 -39
- package/lib/simple-tree/core/schemaCaching.js.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.d.ts +29 -7
- package/lib/simple-tree/core/treeNodeKernel.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeKernel.js +89 -54
- package/lib/simple-tree/core/treeNodeKernel.js.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.d.ts +24 -0
- package/lib/simple-tree/core/treeNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/core/treeNodeSchema.js.map +1 -1
- package/lib/simple-tree/core/types.d.ts +0 -5
- package/lib/simple-tree/core/types.d.ts.map +1 -1
- package/lib/simple-tree/core/types.js.map +1 -1
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts +139 -0
- package/lib/simple-tree/core/unhydratedFlexTree.d.ts.map +1 -0
- package/lib/{feature-libraries/flex-map-tree/mapTreeNode.js → simple-tree/core/unhydratedFlexTree.js} +110 -128
- package/lib/simple-tree/core/unhydratedFlexTree.js.map +1 -0
- package/lib/simple-tree/{walkSchema.d.ts → core/walkSchema.d.ts} +8 -4
- package/lib/simple-tree/core/walkSchema.d.ts.map +1 -0
- package/lib/simple-tree/core/walkSchema.js +29 -0
- package/lib/simple-tree/core/walkSchema.js.map +1 -0
- package/lib/simple-tree/createContext.d.ts +11 -0
- package/lib/simple-tree/createContext.d.ts.map +1 -0
- package/lib/simple-tree/createContext.js +21 -0
- package/lib/simple-tree/createContext.js.map +1 -0
- package/lib/simple-tree/index.d.ts +4 -5
- package/lib/simple-tree/index.d.ts.map +1 -1
- package/lib/simple-tree/index.js +3 -4
- package/lib/simple-tree/index.js.map +1 -1
- package/lib/simple-tree/leafNodeSchema.d.ts +1 -0
- package/lib/simple-tree/leafNodeSchema.d.ts.map +1 -1
- package/lib/simple-tree/leafNodeSchema.js +3 -4
- package/lib/simple-tree/leafNodeSchema.js.map +1 -1
- package/lib/simple-tree/mapNode.d.ts +4 -4
- package/lib/simple-tree/mapNode.d.ts.map +1 -1
- package/lib/simple-tree/mapNode.js +12 -8
- package/lib/simple-tree/mapNode.js.map +1 -1
- package/lib/simple-tree/objectNode.d.ts +8 -8
- package/lib/simple-tree/objectNode.d.ts.map +1 -1
- package/lib/simple-tree/objectNode.js +36 -17
- package/lib/simple-tree/objectNode.js.map +1 -1
- package/lib/simple-tree/objectNodeTypes.d.ts +7 -3
- package/lib/simple-tree/objectNodeTypes.d.ts.map +1 -1
- package/lib/simple-tree/objectNodeTypes.js.map +1 -1
- package/lib/simple-tree/proxies.d.ts +1 -2
- package/lib/simple-tree/proxies.d.ts.map +1 -1
- package/lib/simple-tree/proxies.js +7 -22
- package/lib/simple-tree/proxies.js.map +1 -1
- package/lib/simple-tree/schemaTypes.d.ts +44 -4
- package/lib/simple-tree/schemaTypes.d.ts.map +1 -1
- package/lib/simple-tree/schemaTypes.js +10 -0
- package/lib/simple-tree/schemaTypes.js.map +1 -1
- package/lib/simple-tree/toFlexSchema.d.ts +6 -36
- package/lib/simple-tree/toFlexSchema.d.ts.map +1 -1
- package/lib/simple-tree/toFlexSchema.js +61 -142
- package/lib/simple-tree/toFlexSchema.js.map +1 -1
- package/lib/simple-tree/toMapTree.d.ts.map +1 -1
- package/lib/simple-tree/toMapTree.js +4 -4
- package/lib/simple-tree/toMapTree.js.map +1 -1
- package/lib/simple-tree/treeNodeValid.d.ts +13 -5
- package/lib/simple-tree/treeNodeValid.d.ts.map +1 -1
- package/lib/simple-tree/treeNodeValid.js +21 -12
- package/lib/simple-tree/treeNodeValid.js.map +1 -1
- package/lib/simple-tree/typesUnsafe.d.ts +4 -4
- package/lib/simple-tree/typesUnsafe.d.ts.map +1 -1
- package/lib/simple-tree/typesUnsafe.js.map +1 -1
- package/lib/simple-tree/walkFieldSchema.d.ts +11 -0
- package/lib/simple-tree/walkFieldSchema.d.ts.map +1 -0
- package/lib/simple-tree/walkFieldSchema.js +13 -0
- package/lib/simple-tree/walkFieldSchema.js.map +1 -0
- 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/lib/util/typeUtils.d.ts +14 -45
- package/lib/util/typeUtils.d.ts.map +1 -1
- package/lib/util/typeUtils.js.map +1 -1
- package/package.json +41 -22
- package/src/core/index.ts +1 -0
- package/src/core/rebase/index.ts +1 -0
- package/src/core/rebase/types.ts +11 -0
- package/src/core/schema-stored/schema.ts +18 -0
- package/src/core/tree/anchorSet.ts +3 -4
- package/src/core/tree/detachedFieldIndex.ts +14 -3
- package/src/core/tree/detachedFieldIndexTypes.ts +1 -1
- package/src/feature-libraries/editableTreeBinder.ts +2 -915
- package/src/feature-libraries/flex-tree/context.ts +7 -20
- package/src/feature-libraries/flex-tree/flexTreeTypes.ts +2 -18
- package/src/feature-libraries/flex-tree/lazyEntity.ts +1 -4
- package/src/feature-libraries/flex-tree/lazyField.ts +22 -78
- package/src/feature-libraries/flex-tree/lazyNode.ts +24 -39
- package/src/feature-libraries/flex-tree/utilities.ts +1 -1
- package/src/feature-libraries/index.ts +3 -71
- package/src/feature-libraries/modular-schema/modularChangeFamily.ts +97 -10
- package/src/feature-libraries/sequence-field/compose.ts +3 -0
- package/src/feature-libraries/sequence-field/utils.ts +2 -4
- package/src/feature-libraries/typed-schema/flexList.ts +3 -84
- package/src/feature-libraries/typed-schema/index.ts +1 -33
- package/src/feature-libraries/typed-schema/typedTreeSchema.ts +0 -458
- package/src/index.ts +7 -0
- package/src/internalTypes.ts +0 -1
- package/src/packageVersion.ts +1 -1
- package/src/shared-tree/checkoutFlexTreeView.ts +3 -3
- package/src/shared-tree/index.ts +4 -8
- package/src/shared-tree/schematizeTree.ts +2 -56
- package/src/shared-tree/schematizingTreeView.ts +38 -15
- package/src/shared-tree/sharedTree.ts +36 -8
- package/src/shared-tree/treeCheckout.ts +225 -128
- package/src/shared-tree-core/branch.ts +15 -26
- package/src/simple-tree/api/create.ts +18 -20
- package/src/simple-tree/api/getJsonSchema.ts +3 -3
- package/src/simple-tree/api/getSimpleSchema.ts +2 -2
- package/src/simple-tree/api/index.ts +2 -0
- package/src/simple-tree/api/jsonSchema.ts +19 -17
- package/src/simple-tree/api/schemaFactory.ts +53 -18
- package/src/simple-tree/api/schemaFactoryRecursive.ts +3 -6
- package/src/simple-tree/api/simpleSchema.ts +20 -10
- package/src/simple-tree/api/simpleSchemaToJsonSchema.ts +40 -19
- package/src/simple-tree/api/tree.ts +20 -9
- package/src/simple-tree/api/treeNodeApi.ts +12 -10
- package/src/simple-tree/api/verboseTree.ts +6 -12
- package/src/{feature-libraries/typed-schema → simple-tree/api}/view.ts +9 -22
- package/src/simple-tree/api/viewSchemaToSimpleSchema.ts +18 -4
- package/src/simple-tree/arrayNode.ts +202 -53
- package/src/simple-tree/core/context.ts +78 -0
- package/src/simple-tree/core/getOrCreateNode.ts +38 -0
- package/src/simple-tree/core/index.ts +11 -7
- package/src/simple-tree/core/schemaCaching.ts +13 -50
- package/src/simple-tree/core/treeNodeKernel.ts +117 -78
- package/src/simple-tree/core/treeNodeSchema.ts +35 -1
- package/src/simple-tree/core/types.ts +0 -5
- package/src/{feature-libraries/flex-map-tree/mapTreeNode.ts → simple-tree/core/unhydratedFlexTree.ts} +167 -210
- package/src/simple-tree/{walkSchema.ts → core/walkSchema.ts} +12 -34
- package/src/simple-tree/createContext.ts +24 -0
- package/src/simple-tree/index.ts +6 -2
- package/src/simple-tree/leafNodeSchema.ts +3 -9
- package/src/simple-tree/mapNode.ts +20 -17
- package/src/simple-tree/objectNode.ts +63 -38
- package/src/simple-tree/objectNodeTypes.ts +8 -5
- package/src/simple-tree/proxies.ts +8 -26
- package/src/simple-tree/schemaTypes.ts +55 -5
- package/src/simple-tree/toFlexSchema.ts +71 -204
- package/src/simple-tree/toMapTree.ts +5 -5
- package/src/simple-tree/treeNodeValid.ts +28 -22
- package/src/simple-tree/typesUnsafe.ts +4 -4
- package/src/simple-tree/walkFieldSchema.ts +19 -0
- package/src/util/index.ts +1 -5
- package/src/util/typeUtils.ts +14 -56
- package/dist/feature-libraries/fieldGenerator.d.ts +0 -43
- package/dist/feature-libraries/fieldGenerator.d.ts.map +0 -1
- package/dist/feature-libraries/fieldGenerator.js +0 -13
- package/dist/feature-libraries/fieldGenerator.js.map +0 -1
- package/dist/feature-libraries/flex-map-tree/index.d.ts +0 -6
- package/dist/feature-libraries/flex-map-tree/index.d.ts.map +0 -1
- package/dist/feature-libraries/flex-map-tree/index.js +0 -14
- package/dist/feature-libraries/flex-map-tree/index.js.map +0 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts +0 -157
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +0 -1
- package/dist/feature-libraries/flex-map-tree/mapTreeNode.js.map +0 -1
- package/dist/feature-libraries/storedToViewSchema.d.ts +0 -17
- package/dist/feature-libraries/storedToViewSchema.d.ts.map +0 -1
- package/dist/feature-libraries/storedToViewSchema.js +0 -67
- package/dist/feature-libraries/storedToViewSchema.js.map +0 -1
- package/dist/feature-libraries/typed-schema/schemaCollection.d.ts +0 -58
- package/dist/feature-libraries/typed-schema/schemaCollection.d.ts.map +0 -1
- package/dist/feature-libraries/typed-schema/schemaCollection.js +0 -160
- package/dist/feature-libraries/typed-schema/schemaCollection.js.map +0 -1
- package/dist/feature-libraries/typed-schema/typeUtils.d.ts +0 -15
- package/dist/feature-libraries/typed-schema/typeUtils.d.ts.map +0 -1
- package/dist/feature-libraries/typed-schema/typeUtils.js +0 -14
- package/dist/feature-libraries/typed-schema/typeUtils.js.map +0 -1
- package/dist/feature-libraries/typed-schema/view.d.ts.map +0 -1
- package/dist/feature-libraries/typed-schema/view.js.map +0 -1
- package/dist/simple-tree/getSimpleFieldSchema.d.ts +0 -14
- package/dist/simple-tree/getSimpleFieldSchema.d.ts.map +0 -1
- package/dist/simple-tree/getSimpleFieldSchema.js +0 -29
- package/dist/simple-tree/getSimpleFieldSchema.js.map +0 -1
- package/dist/simple-tree/walkSchema.d.ts.map +0 -1
- package/dist/simple-tree/walkSchema.js +0 -49
- package/dist/simple-tree/walkSchema.js.map +0 -1
- package/lib/feature-libraries/fieldGenerator.d.ts +0 -43
- package/lib/feature-libraries/fieldGenerator.d.ts.map +0 -1
- package/lib/feature-libraries/fieldGenerator.js +0 -12
- package/lib/feature-libraries/fieldGenerator.js.map +0 -1
- package/lib/feature-libraries/flex-map-tree/index.d.ts +0 -6
- package/lib/feature-libraries/flex-map-tree/index.d.ts.map +0 -1
- package/lib/feature-libraries/flex-map-tree/index.js +0 -6
- package/lib/feature-libraries/flex-map-tree/index.js.map +0 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts +0 -157
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.d.ts.map +0 -1
- package/lib/feature-libraries/flex-map-tree/mapTreeNode.js.map +0 -1
- package/lib/feature-libraries/storedToViewSchema.d.ts +0 -17
- package/lib/feature-libraries/storedToViewSchema.d.ts.map +0 -1
- package/lib/feature-libraries/storedToViewSchema.js +0 -62
- package/lib/feature-libraries/storedToViewSchema.js.map +0 -1
- package/lib/feature-libraries/typed-schema/schemaCollection.d.ts +0 -58
- package/lib/feature-libraries/typed-schema/schemaCollection.d.ts.map +0 -1
- package/lib/feature-libraries/typed-schema/schemaCollection.js +0 -153
- package/lib/feature-libraries/typed-schema/schemaCollection.js.map +0 -1
- package/lib/feature-libraries/typed-schema/typeUtils.d.ts +0 -15
- package/lib/feature-libraries/typed-schema/typeUtils.d.ts.map +0 -1
- package/lib/feature-libraries/typed-schema/typeUtils.js +0 -10
- package/lib/feature-libraries/typed-schema/typeUtils.js.map +0 -1
- package/lib/feature-libraries/typed-schema/view.d.ts.map +0 -1
- package/lib/feature-libraries/typed-schema/view.js.map +0 -1
- package/lib/simple-tree/getSimpleFieldSchema.d.ts +0 -14
- package/lib/simple-tree/getSimpleFieldSchema.d.ts.map +0 -1
- package/lib/simple-tree/getSimpleFieldSchema.js +0 -25
- package/lib/simple-tree/getSimpleFieldSchema.js.map +0 -1
- package/lib/simple-tree/walkSchema.d.ts.map +0 -1
- package/lib/simple-tree/walkSchema.js +0 -43
- package/lib/simple-tree/walkSchema.js.map +0 -1
- package/src/feature-libraries/fieldGenerator.ts +0 -47
- package/src/feature-libraries/flex-map-tree/index.ts +0 -14
- package/src/feature-libraries/storedToViewSchema.ts +0 -100
- package/src/feature-libraries/typed-schema/schemaCollection.ts +0 -254
- package/src/feature-libraries/typed-schema/typeUtils.ts +0 -29
- package/src/simple-tree/getSimpleFieldSchema.ts +0 -36
|
@@ -3,143 +3,12 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
type DetachedPlaceUpPath,
|
|
10
|
-
type DetachedRangeUpPath,
|
|
11
|
-
type FieldKey,
|
|
12
|
-
type PathVisitor,
|
|
13
|
-
type PlaceUpPath,
|
|
14
|
-
type ProtoNodes,
|
|
15
|
-
type RangeUpPath,
|
|
16
|
-
type UpPath,
|
|
17
|
-
topDownPath,
|
|
18
|
-
} from "../core/index.js";
|
|
19
|
-
import type { Listeners, Listenable } from "../events/index.js";
|
|
20
|
-
import { brand, getOrCreate } from "../util/index.js";
|
|
21
|
-
|
|
22
|
-
import type { FlexTreeNode } from "./flex-tree/index.js";
|
|
23
|
-
|
|
24
|
-
// TODO:
|
|
25
|
-
// Tests for this file were removed along with the old editable-tree implementation in the commit that includes this note.
|
|
26
|
-
// They were a bit heavily tied to the testing patterns specific to the old editable-tree and will need significant changes to be restored.
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Binder events reflecting atomic data operations
|
|
30
|
-
*/
|
|
31
|
-
export interface OperationBinderEvents {
|
|
32
|
-
remove(context: RemoveBindingContext): void;
|
|
33
|
-
insert(context: InsertBindingContext): void;
|
|
34
|
-
batch(context: BatchBindingContext): void;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Binder events signaling state invalidation
|
|
39
|
-
*/
|
|
40
|
-
export interface InvalidationBinderEvents {
|
|
41
|
-
invalidation(context: InvalidationBindingContext): void;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Compare function, generic.
|
|
46
|
-
*/
|
|
47
|
-
export type CompareFunction<T> = (a: T, b: T) => number;
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Compare function for binder events.
|
|
51
|
-
*/
|
|
52
|
-
export type BinderEventsCompare = CompareFunction<VisitorBindingContext>;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Compare function for anchors.
|
|
56
|
-
*/
|
|
57
|
-
export type AnchorsCompare = CompareFunction<UpPath>;
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Options to configure binder behavior.
|
|
61
|
-
*
|
|
62
|
-
* TODO: add more options:
|
|
63
|
-
* `filterFn?: (context: BindingContext) => boolean;`
|
|
64
|
-
* `pathPolicy?: "relative" | "absolute";`
|
|
65
|
-
*/
|
|
66
|
-
export interface BinderOptions {
|
|
67
|
-
sortFn?: BinderEventsCompare;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Specialized binder options for flushable binders.
|
|
72
|
-
*/
|
|
73
|
-
export interface FlushableBinderOptions<E extends Listeners<E>> extends BinderOptions {
|
|
74
|
-
autoFlush: boolean;
|
|
75
|
-
autoFlushPolicy: keyof Listeners<E>;
|
|
76
|
-
sortAnchorsFn?: AnchorsCompare;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Match policy for binding: subtree or path.
|
|
81
|
-
*
|
|
82
|
-
* - `subtree` match policy means that path filtering would return events matching the exact path and its subpaths,
|
|
83
|
-
* ie. changes to (nested) children would be allowed to bubble up to parent listeners.
|
|
84
|
-
* - {@link SubtreePolicy} match policy is equivalent with `subtree` match policy, while allowing to specify a maximum
|
|
85
|
-
* depth for the subtree.
|
|
86
|
-
* - `path` match policy means that path filtering would return events matching the _exact_ path only. In this case
|
|
87
|
-
* _exact_ semantics include interpreting an `undefined` _index_ field in the {@link PathStep} as a wildcard.
|
|
88
|
-
*
|
|
89
|
-
*/
|
|
90
|
-
export type MatchPolicy = SubtreePolicy | "subtree" | "path";
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Subtree match policy where max depth can be specified.
|
|
94
|
-
*/
|
|
95
|
-
export interface SubtreePolicy {
|
|
96
|
-
maxDepth: number;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* The data binder interface
|
|
101
|
-
*/
|
|
102
|
-
export interface DataBinder<B extends OperationBinderEvents | InvalidationBinderEvents> {
|
|
103
|
-
/**
|
|
104
|
-
* Register an event listener
|
|
105
|
-
*
|
|
106
|
-
* @param anchor - The anchor to register the listener on
|
|
107
|
-
* @param eventType - The {@link BindingType} to listen for.
|
|
108
|
-
* @param eventTrees - The {@link BindPolicy}s to filter on.
|
|
109
|
-
* @param listener - The listener to register
|
|
110
|
-
*/
|
|
111
|
-
register<K extends keyof Listeners<B>>(
|
|
112
|
-
anchor: FlexTreeNode,
|
|
113
|
-
eventType: K,
|
|
114
|
-
eventTrees: BindPolicy[],
|
|
115
|
-
listener?: B[K],
|
|
116
|
-
): void;
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Unregister all listeners.
|
|
120
|
-
*/
|
|
121
|
-
unregisterAll(): void;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* An interface describing the ability to flush.
|
|
126
|
-
*/
|
|
127
|
-
export interface Flushable<T> {
|
|
128
|
-
flush(): T;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* An interface describing a flushable data binder.
|
|
133
|
-
*/
|
|
134
|
-
export interface FlushableDataBinder<
|
|
135
|
-
B extends OperationBinderEvents | InvalidationBinderEvents,
|
|
136
|
-
> extends DataBinder<B>,
|
|
137
|
-
Flushable<FlushableDataBinder<B>> {}
|
|
6
|
+
import { type FieldKey, type UpPath, topDownPath } from "../core/index.js";
|
|
138
7
|
|
|
139
8
|
/**
|
|
140
9
|
* A step in a bind path
|
|
141
10
|
*/
|
|
142
|
-
|
|
11
|
+
interface PathStep {
|
|
143
12
|
/**
|
|
144
13
|
* The field being traversed
|
|
145
14
|
*/
|
|
@@ -151,45 +20,6 @@ export interface PathStep {
|
|
|
151
20
|
readonly index?: number;
|
|
152
21
|
}
|
|
153
22
|
|
|
154
|
-
/**
|
|
155
|
-
* The default type for a bind tree
|
|
156
|
-
*/
|
|
157
|
-
export type BindTreeDefault = BindTree;
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* A bind tree is a compact representation of related {@link BindPath}s.
|
|
161
|
-
*/
|
|
162
|
-
export interface BindTree<T = BindTreeDefault> extends PathStep {
|
|
163
|
-
readonly children: Map<FieldKey, T>;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* A bind policy is a combination of a {@link BindTree} and a {@link MatchPolicy}.
|
|
168
|
-
*/
|
|
169
|
-
export interface BindPolicy {
|
|
170
|
-
readonly bindTree: BindTree;
|
|
171
|
-
readonly matchPolicy: MatchPolicy;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
/**
|
|
175
|
-
* Index symbol for syntax tree
|
|
176
|
-
*/
|
|
177
|
-
export const indexSymbol = Symbol("flex-tree-binder:index");
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* A syntax node for the bind language
|
|
181
|
-
*
|
|
182
|
-
* The bind language is a compact representation of related {@link BindPath}s. It can be used to
|
|
183
|
-
* simplify usage and construction of {@link BindTree}s.
|
|
184
|
-
*
|
|
185
|
-
* see {@link BindTree}
|
|
186
|
-
* see {@link compileSyntaxTree}
|
|
187
|
-
*/
|
|
188
|
-
export interface BindSyntaxTree {
|
|
189
|
-
readonly [indexSymbol]?: number;
|
|
190
|
-
readonly [key: string]: true | BindSyntaxTree;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
23
|
/**
|
|
194
24
|
* A top down path in a bind or path tree is a collection of {@link PathStep}s
|
|
195
25
|
*
|
|
@@ -198,619 +28,6 @@ export interface BindSyntaxTree {
|
|
|
198
28
|
*/
|
|
199
29
|
export type DownPath = PathStep[];
|
|
200
30
|
|
|
201
|
-
/**
|
|
202
|
-
* A bind path is a top down path in a bind tree
|
|
203
|
-
*/
|
|
204
|
-
export type BindPath = DownPath;
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* A binding context specialized for {@link PathVisitor} triggered binding events.
|
|
208
|
-
*/
|
|
209
|
-
export type VisitorBindingContext = RemoveBindingContext | InsertBindingContext;
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Enumeration of binding categories
|
|
213
|
-
*/
|
|
214
|
-
export const BindingType = {
|
|
215
|
-
Remove: "remove",
|
|
216
|
-
Insert: "insert",
|
|
217
|
-
Invalidation: "invalidation",
|
|
218
|
-
Batch: "batch",
|
|
219
|
-
} as const;
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* The type of a binding context
|
|
223
|
-
*/
|
|
224
|
-
export type BindingContextType = (typeof BindingType)[keyof typeof BindingType];
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* The binding context attribution common to all binding events
|
|
228
|
-
*/
|
|
229
|
-
export interface BindingContext {
|
|
230
|
-
readonly type: BindingContextType;
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* The binding context for a remove event
|
|
235
|
-
*/
|
|
236
|
-
export interface RemoveBindingContext extends BindingContext {
|
|
237
|
-
readonly type: typeof BindingType.Remove;
|
|
238
|
-
readonly path: UpPath;
|
|
239
|
-
readonly count: number;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* The binding context for an insert event
|
|
244
|
-
*/
|
|
245
|
-
export interface InsertBindingContext extends BindingContext {
|
|
246
|
-
readonly type: typeof BindingType.Insert;
|
|
247
|
-
readonly path: UpPath;
|
|
248
|
-
readonly content: ProtoNodes;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* The binding context for an invalidation event
|
|
253
|
-
*/
|
|
254
|
-
export interface InvalidationBindingContext extends BindingContext {
|
|
255
|
-
readonly type: typeof BindingType.Invalidation;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* The binding context for a batch event
|
|
260
|
-
*/
|
|
261
|
-
export interface BatchBindingContext extends BindingContext {
|
|
262
|
-
readonly type: typeof BindingType.Batch;
|
|
263
|
-
readonly events: VisitorBindingContext[];
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* The listener interface. Internal.
|
|
268
|
-
*/
|
|
269
|
-
type Listener = (...args: unknown[]) => void;
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* A call tree is a {@link BindTree} augmented with listeners. Internal.
|
|
273
|
-
*/
|
|
274
|
-
type CallTree = BindTree<CallTree> & { listeners: Set<Listener>; matchPolicy?: MatchPolicy };
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* A generic implementation of a {@link PathVisitor} enabling the registration of listeners
|
|
278
|
-
* categorized by {@link BindingContextType} and {@link BindPolicy}.
|
|
279
|
-
*/
|
|
280
|
-
abstract class AbstractPathVisitor implements PathVisitor {
|
|
281
|
-
protected readonly registeredListeners: Map<BindingContextType, Map<FieldKey, CallTree>> =
|
|
282
|
-
new Map();
|
|
283
|
-
public constructor(protected readonly options: BinderOptions) {}
|
|
284
|
-
|
|
285
|
-
// TODO: make these methods abstract and make AbstractPathVisitor implementations implement them
|
|
286
|
-
public afterCreate(content: DetachedRangeUpPath): void {}
|
|
287
|
-
public beforeDestroy(content: DetachedRangeUpPath): void {}
|
|
288
|
-
public beforeAttach(source: DetachedRangeUpPath, destination: PlaceUpPath): void {}
|
|
289
|
-
public afterAttach(source: DetachedPlaceUpPath, destination: RangeUpPath): void {
|
|
290
|
-
this.onInsert(
|
|
291
|
-
{
|
|
292
|
-
parent: destination.parent,
|
|
293
|
-
parentField: destination.field,
|
|
294
|
-
parentIndex: destination.start,
|
|
295
|
-
},
|
|
296
|
-
this.getContent(destination),
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
public beforeDetach(source: RangeUpPath, destination: DetachedPlaceUpPath): void {}
|
|
300
|
-
public afterDetach(source: PlaceUpPath, destination: DetachedRangeUpPath): void {
|
|
301
|
-
this.onRemove(
|
|
302
|
-
{
|
|
303
|
-
parent: source.parent,
|
|
304
|
-
parentField: source.field,
|
|
305
|
-
parentIndex: source.index,
|
|
306
|
-
},
|
|
307
|
-
destination.end - destination.start,
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
public beforeReplace(
|
|
311
|
-
newContent: DetachedRangeUpPath,
|
|
312
|
-
oldContent: RangeUpPath,
|
|
313
|
-
oldContentDestination: DetachedPlaceUpPath,
|
|
314
|
-
): void {}
|
|
315
|
-
public afterReplace(
|
|
316
|
-
newContentSource: DetachedPlaceUpPath,
|
|
317
|
-
newContent: RangeUpPath,
|
|
318
|
-
oldContent: DetachedRangeUpPath,
|
|
319
|
-
): void {
|
|
320
|
-
this.onRemove(
|
|
321
|
-
{
|
|
322
|
-
parent: newContent.parent,
|
|
323
|
-
parentField: newContent.field,
|
|
324
|
-
parentIndex: newContent.start,
|
|
325
|
-
},
|
|
326
|
-
oldContent.end - oldContent.start,
|
|
327
|
-
);
|
|
328
|
-
this.onInsert(
|
|
329
|
-
{
|
|
330
|
-
parent: newContent.parent,
|
|
331
|
-
parentField: newContent.field,
|
|
332
|
-
parentIndex: newContent.start,
|
|
333
|
-
},
|
|
334
|
-
this.getContent(newContent),
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
protected getContent(range: RangeUpPath): ProtoNodes {
|
|
338
|
-
// TODO: either lookup the content in the forest or stop providing the content in the events
|
|
339
|
-
return [];
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
public abstract onRemove(path: UpPath, count: number): void;
|
|
343
|
-
public abstract onInsert(path: UpPath, content: ProtoNodes): void;
|
|
344
|
-
public registerListener(
|
|
345
|
-
contextType: BindingContextType,
|
|
346
|
-
policies: BindPolicy[],
|
|
347
|
-
listener: Listener,
|
|
348
|
-
): () => void {
|
|
349
|
-
const contextRoots = getOrCreate(this.registeredListeners, contextType, () => new Map());
|
|
350
|
-
policies.forEach((policy) => {
|
|
351
|
-
const tree = policy.bindTree;
|
|
352
|
-
const currentRoot = this.findRoot(contextType, tree.field);
|
|
353
|
-
if (currentRoot === undefined) {
|
|
354
|
-
const newRoot: CallTree = {
|
|
355
|
-
field: tree.field,
|
|
356
|
-
index: tree.index,
|
|
357
|
-
listeners: new Set(),
|
|
358
|
-
children: new Map(),
|
|
359
|
-
matchPolicy: policy.matchPolicy,
|
|
360
|
-
};
|
|
361
|
-
assert(contextRoots !== undefined, 0x6da /* expected contextRoots to be defined */);
|
|
362
|
-
contextRoots.set(tree.field, newRoot);
|
|
363
|
-
this.bindTree(contextType, tree, listener, newRoot);
|
|
364
|
-
} else {
|
|
365
|
-
this.bindTree(contextType, tree, listener, currentRoot);
|
|
366
|
-
}
|
|
367
|
-
});
|
|
368
|
-
return () => {
|
|
369
|
-
policies.forEach((policy) =>
|
|
370
|
-
this.unregisterListener(contextType, policy.bindTree, listener),
|
|
371
|
-
);
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
private bindTree(
|
|
376
|
-
contextType: BindingContextType,
|
|
377
|
-
tree: BindTree,
|
|
378
|
-
listener: Listener,
|
|
379
|
-
callTree: CallTree,
|
|
380
|
-
): void {
|
|
381
|
-
if (tree.children.size === 0) {
|
|
382
|
-
callTree.listeners.add(listener);
|
|
383
|
-
} else {
|
|
384
|
-
tree.children.forEach((childTree, fieldKey) => {
|
|
385
|
-
const childCallTree = getOrCreate(callTree.children, fieldKey, () => {
|
|
386
|
-
const newChildCallTree: CallTree = {
|
|
387
|
-
field: fieldKey,
|
|
388
|
-
index: childTree.index,
|
|
389
|
-
listeners: new Set(),
|
|
390
|
-
children: new Map(),
|
|
391
|
-
};
|
|
392
|
-
callTree.children.set(fieldKey, newChildCallTree);
|
|
393
|
-
return newChildCallTree;
|
|
394
|
-
});
|
|
395
|
-
this.bindTree(contextType, childTree, listener, childCallTree);
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
private findRoot(contextType: BindingContextType, field: FieldKey): CallTree | undefined {
|
|
401
|
-
return this.registeredListeners.get(contextType)?.get(field);
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
private unregisterListener(
|
|
405
|
-
contextType: BindingContextType,
|
|
406
|
-
tree: BindTree,
|
|
407
|
-
listener: Listener,
|
|
408
|
-
callTree?: CallTree,
|
|
409
|
-
): void {
|
|
410
|
-
const foundTree = callTree ?? this.findRoot(contextType, tree.field);
|
|
411
|
-
if (foundTree !== undefined) {
|
|
412
|
-
if (tree.children.size === 0) {
|
|
413
|
-
foundTree.listeners.delete(listener);
|
|
414
|
-
} else {
|
|
415
|
-
tree.children.forEach((childTree, fieldKey) => {
|
|
416
|
-
assert(foundTree !== undefined, 0x6db /* expected foundTree to be defined */);
|
|
417
|
-
const childCallTree = foundTree.children.get(fieldKey);
|
|
418
|
-
if (childCallTree !== undefined) {
|
|
419
|
-
this.unregisterListener(contextType, childTree, listener, childCallTree);
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
protected getListeners(
|
|
427
|
-
contextType: BindingContextType,
|
|
428
|
-
downPath: DownPath,
|
|
429
|
-
): Set<Listener> | undefined {
|
|
430
|
-
const firstDownPath = downPath[0] ?? oob();
|
|
431
|
-
const foundRoot = this.findRoot(contextType, firstDownPath.field);
|
|
432
|
-
if (foundRoot === undefined) {
|
|
433
|
-
return undefined;
|
|
434
|
-
} else {
|
|
435
|
-
const subtreeMatch = (
|
|
436
|
-
subtreePolicy: SubtreePolicy | undefined,
|
|
437
|
-
depth: number,
|
|
438
|
-
): boolean => {
|
|
439
|
-
if (subtreePolicy?.maxDepth !== undefined && depth > subtreePolicy.maxDepth) {
|
|
440
|
-
return false;
|
|
441
|
-
}
|
|
442
|
-
return true;
|
|
443
|
-
};
|
|
444
|
-
const accumulateMatching = (
|
|
445
|
-
treeNode: CallTree,
|
|
446
|
-
index: number,
|
|
447
|
-
onMatch: (index: number, treeNode: CallTree) => void,
|
|
448
|
-
): void => {
|
|
449
|
-
const step = downPath[index];
|
|
450
|
-
if (
|
|
451
|
-
step === undefined ||
|
|
452
|
-
treeNode.field !== step.field ||
|
|
453
|
-
(treeNode.index !== undefined && step.index !== treeNode.index)
|
|
454
|
-
) {
|
|
455
|
-
return undefined;
|
|
456
|
-
}
|
|
457
|
-
for (const child of treeNode.children.values()) {
|
|
458
|
-
accumulateMatching(child, index + 1, onMatch);
|
|
459
|
-
}
|
|
460
|
-
onMatch(index, treeNode);
|
|
461
|
-
};
|
|
462
|
-
const matchedNodes: Set<Listener> = new Set();
|
|
463
|
-
if (foundRoot.matchPolicy === "path") {
|
|
464
|
-
accumulateMatching(foundRoot, 0, (index: number, treeNode: CallTree): void => {
|
|
465
|
-
if (index === downPath.length - 1) {
|
|
466
|
-
treeNode.listeners.forEach((listener) => matchedNodes.add(listener));
|
|
467
|
-
}
|
|
468
|
-
});
|
|
469
|
-
} else if (foundRoot.matchPolicy === "subtree") {
|
|
470
|
-
accumulateMatching(foundRoot, 0, (index: number, treeNode: CallTree): void => {
|
|
471
|
-
treeNode.listeners.forEach((listener) => matchedNodes.add(listener));
|
|
472
|
-
});
|
|
473
|
-
} else {
|
|
474
|
-
const matchPolicy: SubtreePolicy | undefined = foundRoot.matchPolicy;
|
|
475
|
-
accumulateMatching(foundRoot, 0, (index: number, treeNode: CallTree): void => {
|
|
476
|
-
if (subtreeMatch(matchPolicy, downPath.length - 1)) {
|
|
477
|
-
treeNode.listeners.forEach((listener) => matchedNodes.add(listener));
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
return matchedNodes.size > 0 ? matchedNodes : undefined;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
public hasRegisteredContextType(contextType: BindingContextType): boolean {
|
|
486
|
-
return this.registeredListeners.has(contextType);
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
public dispose(): void {
|
|
490
|
-
this.registeredListeners.clear();
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
/**
|
|
495
|
-
* A visitor that invokes listeners immediately when a path is traversed.
|
|
496
|
-
*/
|
|
497
|
-
class DirectPathVisitor extends AbstractPathVisitor {
|
|
498
|
-
private processListeners(path: UpPath, listeners: Set<Listener>, otherArgs: object): void {
|
|
499
|
-
for (const listener of listeners) {
|
|
500
|
-
listener({
|
|
501
|
-
path,
|
|
502
|
-
...otherArgs,
|
|
503
|
-
});
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
private processRegisteredPaths(
|
|
508
|
-
path: UpPath,
|
|
509
|
-
type: BindingContextType,
|
|
510
|
-
otherArgs: object,
|
|
511
|
-
): void {
|
|
512
|
-
const current = toDownPath(path);
|
|
513
|
-
const listeners = this.getListeners(type, current);
|
|
514
|
-
if (listeners !== undefined) {
|
|
515
|
-
this.processListeners(path, listeners, otherArgs);
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
public onRemove(path: UpPath, count: number): void {
|
|
520
|
-
this.processRegisteredPaths(path, BindingType.Remove, {
|
|
521
|
-
count,
|
|
522
|
-
type: BindingType.Remove,
|
|
523
|
-
});
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
public onInsert(path: UpPath, content: ProtoNodes): void {
|
|
527
|
-
this.processRegisteredPaths(path, BindingType.Insert, {
|
|
528
|
-
content,
|
|
529
|
-
type: BindingType.Insert,
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
/**
|
|
535
|
-
* A visitor that invokes listeners only once when flushed if any modifications detected on the registered paths.
|
|
536
|
-
*/
|
|
537
|
-
class InvalidatingPathVisitor
|
|
538
|
-
extends AbstractPathVisitor
|
|
539
|
-
implements Flushable<InvalidatingPathVisitor>
|
|
540
|
-
{
|
|
541
|
-
private readonly listeners: Set<Listener> = new Set();
|
|
542
|
-
|
|
543
|
-
private processRegisteredPaths(path: UpPath): void {
|
|
544
|
-
const current = toDownPath(path);
|
|
545
|
-
const listeners = this.getListeners(BindingType.Invalidation, current);
|
|
546
|
-
if (listeners !== undefined) {
|
|
547
|
-
for (const listener of listeners) {
|
|
548
|
-
this.listeners.add(listener);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
public onRemove(path: UpPath, count: number): void {
|
|
554
|
-
this.processRegisteredPaths(path);
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
public onInsert(path: UpPath, content: ProtoNodes): void {
|
|
558
|
-
this.processRegisteredPaths(path);
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
public flush(): InvalidatingPathVisitor {
|
|
562
|
-
for (const listener of this.listeners) {
|
|
563
|
-
listener({
|
|
564
|
-
type: BindingType.Invalidation,
|
|
565
|
-
});
|
|
566
|
-
}
|
|
567
|
-
this.listeners.clear();
|
|
568
|
-
return this;
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
public override dispose(): void {
|
|
572
|
-
this.flush();
|
|
573
|
-
super.dispose();
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
type CallableBindingContext = VisitorBindingContext & {
|
|
578
|
-
listeners: Set<Listener>;
|
|
579
|
-
};
|
|
580
|
-
|
|
581
|
-
/**
|
|
582
|
-
* A visitor that buffers all events which match the registered event categories and corresponding paths.
|
|
583
|
-
* Listeners are invoked when flushed. Flushing has also the ability to sort and batch the events.
|
|
584
|
-
*/
|
|
585
|
-
class BufferingPathVisitor
|
|
586
|
-
extends AbstractPathVisitor
|
|
587
|
-
implements Flushable<BufferingPathVisitor>
|
|
588
|
-
{
|
|
589
|
-
private readonly eventQueue: CallableBindingContext[] = [];
|
|
590
|
-
|
|
591
|
-
public onRemove(path: UpPath, count: number): void {
|
|
592
|
-
const current = toDownPath(path);
|
|
593
|
-
const listeners = this.getListeners(BindingType.Remove, current);
|
|
594
|
-
if (listeners !== undefined) {
|
|
595
|
-
this.eventQueue.push({
|
|
596
|
-
path,
|
|
597
|
-
count,
|
|
598
|
-
type: BindingType.Remove,
|
|
599
|
-
listeners,
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
public onInsert(path: UpPath, content: ProtoNodes): void {
|
|
605
|
-
const current = toDownPath(path);
|
|
606
|
-
const listeners = this.getListeners(BindingType.Insert, current);
|
|
607
|
-
if (listeners !== undefined) {
|
|
608
|
-
this.eventQueue.push({
|
|
609
|
-
path,
|
|
610
|
-
content,
|
|
611
|
-
type: BindingType.Insert,
|
|
612
|
-
listeners,
|
|
613
|
-
});
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
public flush(): BufferingPathVisitor {
|
|
618
|
-
const sortedQueue: CallableBindingContext[] = nativeSort(
|
|
619
|
-
this.eventQueue,
|
|
620
|
-
this.options.sortFn ?? (() => 0),
|
|
621
|
-
);
|
|
622
|
-
const batchEventIndices = new Set<number>();
|
|
623
|
-
const batchEvents: CallableBindingContext[] = [];
|
|
624
|
-
const collected = new Set<Listener>();
|
|
625
|
-
if (this.hasRegisteredContextType(BindingType.Batch)) {
|
|
626
|
-
for (const [i, event] of sortedQueue.entries()) {
|
|
627
|
-
const current = toDownPath(event.path);
|
|
628
|
-
const listeners = this.getListeners(BindingType.Batch, current);
|
|
629
|
-
if (listeners !== undefined && listeners.size > 0) {
|
|
630
|
-
for (const listener of listeners) {
|
|
631
|
-
collected.add(listener);
|
|
632
|
-
}
|
|
633
|
-
batchEvents.push(event);
|
|
634
|
-
batchEventIndices.add(i);
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
for (const listener of collected) {
|
|
639
|
-
listener({
|
|
640
|
-
type: BindingType.Batch,
|
|
641
|
-
events: batchEvents,
|
|
642
|
-
});
|
|
643
|
-
}
|
|
644
|
-
for (const [i, { listeners, ...context }] of sortedQueue.entries()) {
|
|
645
|
-
if (batchEventIndices.has(i)) {
|
|
646
|
-
continue;
|
|
647
|
-
}
|
|
648
|
-
for (const listener of listeners) {
|
|
649
|
-
listener({ ...context });
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
this.eventQueue.length = 0;
|
|
653
|
-
return this;
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
public override dispose(): void {
|
|
657
|
-
this.flush();
|
|
658
|
-
super.dispose();
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
class AbstractDataBinder<
|
|
663
|
-
B extends OperationBinderEvents | InvalidationBinderEvents,
|
|
664
|
-
V extends AbstractPathVisitor,
|
|
665
|
-
O extends BinderOptions,
|
|
666
|
-
> implements DataBinder<B>
|
|
667
|
-
{
|
|
668
|
-
protected readonly visitors = new Map<FlexTreeNode, V>();
|
|
669
|
-
protected readonly visitorLocations = new Map<V, UpPath>();
|
|
670
|
-
protected readonly unregisterHandles = new Set<() => void>();
|
|
671
|
-
public constructor(
|
|
672
|
-
protected readonly options: O,
|
|
673
|
-
protected readonly visitorFactory: (anchor: FlexTreeNode) => V,
|
|
674
|
-
) {}
|
|
675
|
-
|
|
676
|
-
public register<K extends keyof Listeners<B>>(
|
|
677
|
-
anchor: FlexTreeNode,
|
|
678
|
-
eventType: K,
|
|
679
|
-
eventTrees: BindPolicy[],
|
|
680
|
-
listener: B[K],
|
|
681
|
-
): void {
|
|
682
|
-
// TODO: validate BindPath semantics against the schema
|
|
683
|
-
const visitor = getOrCreate(this.visitors, anchor, () => {
|
|
684
|
-
const newVisitor = this.visitorFactory(anchor);
|
|
685
|
-
this.unregisterHandles.add(
|
|
686
|
-
anchor.anchorNode.on("subtreeChanging", (upPath: UpPath) => {
|
|
687
|
-
assert(newVisitor !== undefined, 0x6dc /* visitor expected to be defined */);
|
|
688
|
-
if (!this.visitorLocations.has(newVisitor)) {
|
|
689
|
-
this.visitorLocations.set(newVisitor, upPath);
|
|
690
|
-
}
|
|
691
|
-
return newVisitor;
|
|
692
|
-
}),
|
|
693
|
-
);
|
|
694
|
-
return newVisitor;
|
|
695
|
-
});
|
|
696
|
-
const contextType: BindingContextType = eventType as BindingContextType;
|
|
697
|
-
this.unregisterHandles.add(
|
|
698
|
-
visitor.registerListener(contextType, eventTrees, listener as unknown as Listener),
|
|
699
|
-
);
|
|
700
|
-
}
|
|
701
|
-
public unregisterAll(): void {
|
|
702
|
-
this.unregisterHandles.forEach((h) => h());
|
|
703
|
-
this.unregisterHandles.clear();
|
|
704
|
-
this.visitors.forEach((v) => v.dispose());
|
|
705
|
-
this.visitors.clear();
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
public extractBindPaths(root: BindTree): BindPath[] {
|
|
709
|
-
const result: BindPath[] = [];
|
|
710
|
-
const depthFirst = (node: BindTree, path: PathStep[] = [root]): void => {
|
|
711
|
-
if (node.children.size === 0) {
|
|
712
|
-
result.push(path);
|
|
713
|
-
return;
|
|
714
|
-
}
|
|
715
|
-
for (const [field, childNode] of node.children.entries()) {
|
|
716
|
-
depthFirst(childNode, [...path, { field, index: childNode.index }]);
|
|
717
|
-
}
|
|
718
|
-
};
|
|
719
|
-
depthFirst(root);
|
|
720
|
-
return result;
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
class BufferingDataBinder<E extends Listeners<E>>
|
|
725
|
-
extends AbstractDataBinder<
|
|
726
|
-
OperationBinderEvents,
|
|
727
|
-
BufferingPathVisitor,
|
|
728
|
-
FlushableBinderOptions<E>
|
|
729
|
-
>
|
|
730
|
-
implements FlushableDataBinder<OperationBinderEvents>
|
|
731
|
-
{
|
|
732
|
-
protected readonly view: Listenable<E>;
|
|
733
|
-
protected readonly autoFlushPolicy: keyof Listeners<E>;
|
|
734
|
-
public constructor(view: Listenable<E>, options: FlushableBinderOptions<E>) {
|
|
735
|
-
super(options, (anchor: FlexTreeNode) => new BufferingPathVisitor(options));
|
|
736
|
-
this.view = view;
|
|
737
|
-
this.autoFlushPolicy = options.autoFlushPolicy;
|
|
738
|
-
if (options.autoFlush) {
|
|
739
|
-
this.enableAutoFlush();
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
public flush(): FlushableDataBinder<OperationBinderEvents> {
|
|
744
|
-
const unsortedVisitors: BufferingPathVisitor[] = Array.from(this.visitorLocations.keys());
|
|
745
|
-
const sortFn = this.options.sortAnchorsFn ?? (() => 0);
|
|
746
|
-
const compareFn = (a: BufferingPathVisitor, b: BufferingPathVisitor): number => {
|
|
747
|
-
const pathA = this.visitorLocations.get(a);
|
|
748
|
-
const pathB = this.visitorLocations.get(b);
|
|
749
|
-
assert(pathA !== undefined, 0x6dd /* pathA expected to be defined */);
|
|
750
|
-
assert(pathB !== undefined, 0x6de /* pathB expected to be defined */);
|
|
751
|
-
return sortFn(pathA, pathB);
|
|
752
|
-
};
|
|
753
|
-
const sortedVisitors: BufferingPathVisitor[] = nativeSort(unsortedVisitors, compareFn);
|
|
754
|
-
for (const visitor of sortedVisitors) {
|
|
755
|
-
visitor.flush();
|
|
756
|
-
}
|
|
757
|
-
return this;
|
|
758
|
-
}
|
|
759
|
-
|
|
760
|
-
private enableAutoFlush(): FlushableDataBinder<OperationBinderEvents> {
|
|
761
|
-
const callbackFn = (() => {
|
|
762
|
-
this.flush();
|
|
763
|
-
}) as E[keyof Listeners<E>];
|
|
764
|
-
const unregisterFlushing = this.view.on(this.autoFlushPolicy, callbackFn);
|
|
765
|
-
this.unregisterHandles.add(unregisterFlushing);
|
|
766
|
-
return this;
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
|
|
770
|
-
class DirectDataBinder<E extends Listeners<E>> extends AbstractDataBinder<
|
|
771
|
-
OperationBinderEvents,
|
|
772
|
-
DirectPathVisitor,
|
|
773
|
-
BinderOptions
|
|
774
|
-
> {
|
|
775
|
-
public constructor(view: Listenable<E>, options: BinderOptions) {
|
|
776
|
-
super(options, (anchor: FlexTreeNode) => new DirectPathVisitor(options));
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
|
|
780
|
-
class InvalidateDataBinder<E extends Listeners<E>>
|
|
781
|
-
extends AbstractDataBinder<
|
|
782
|
-
InvalidationBinderEvents,
|
|
783
|
-
InvalidatingPathVisitor,
|
|
784
|
-
FlushableBinderOptions<E>
|
|
785
|
-
>
|
|
786
|
-
implements FlushableDataBinder<InvalidationBinderEvents>
|
|
787
|
-
{
|
|
788
|
-
protected readonly view: Listenable<E>;
|
|
789
|
-
protected readonly autoFlushPolicy: keyof Listeners<E>;
|
|
790
|
-
public constructor(view: Listenable<E>, options: FlushableBinderOptions<E>) {
|
|
791
|
-
super(options, (anchor: FlexTreeNode) => new InvalidatingPathVisitor(options));
|
|
792
|
-
this.view = view;
|
|
793
|
-
this.autoFlushPolicy = options.autoFlushPolicy;
|
|
794
|
-
if (options.autoFlush) {
|
|
795
|
-
this.enableAutoFlush();
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
public flush(): FlushableDataBinder<InvalidationBinderEvents> {
|
|
799
|
-
for (const visitor of this.visitors.values()) {
|
|
800
|
-
visitor.flush();
|
|
801
|
-
}
|
|
802
|
-
return this;
|
|
803
|
-
}
|
|
804
|
-
private enableAutoFlush(): FlushableDataBinder<InvalidationBinderEvents> {
|
|
805
|
-
const callbackFn = (() => {
|
|
806
|
-
this.flush();
|
|
807
|
-
}) as E[keyof Listeners<E>];
|
|
808
|
-
const unregisterFlushing = this.view.on(this.autoFlushPolicy, callbackFn);
|
|
809
|
-
this.unregisterHandles.add(unregisterFlushing);
|
|
810
|
-
return this;
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
|
|
814
31
|
/**
|
|
815
32
|
* Compute a top-town {@link DownPath} from an {@link UpPath}.
|
|
816
33
|
*/
|
|
@@ -822,133 +39,3 @@ export function toDownPath(upPath: UpPath): DownPath {
|
|
|
822
39
|
stepDownPath.shift(); // remove last step to the root node
|
|
823
40
|
return stepDownPath;
|
|
824
41
|
}
|
|
825
|
-
|
|
826
|
-
/**
|
|
827
|
-
* Create a buffering data binder.
|
|
828
|
-
*/
|
|
829
|
-
export function createDataBinderBuffering<E extends Listeners<E>>(
|
|
830
|
-
view: Listenable<E>,
|
|
831
|
-
options: FlushableBinderOptions<E>,
|
|
832
|
-
): FlushableDataBinder<OperationBinderEvents> {
|
|
833
|
-
return new BufferingDataBinder(view, options);
|
|
834
|
-
}
|
|
835
|
-
|
|
836
|
-
/**
|
|
837
|
-
* Create a direct data binder.
|
|
838
|
-
*/
|
|
839
|
-
export function createDataBinderDirect<E extends Listeners<E>>(
|
|
840
|
-
view: Listenable<E>,
|
|
841
|
-
options: BinderOptions,
|
|
842
|
-
): DataBinder<OperationBinderEvents> {
|
|
843
|
-
return new DirectDataBinder(view, options);
|
|
844
|
-
}
|
|
845
|
-
|
|
846
|
-
/**
|
|
847
|
-
* Create an invalidating data binder.
|
|
848
|
-
*/
|
|
849
|
-
export function createDataBinderInvalidating<E extends Listeners<E>>(
|
|
850
|
-
view: Listenable<E>,
|
|
851
|
-
options: FlushableBinderOptions<E>,
|
|
852
|
-
): FlushableDataBinder<InvalidationBinderEvents> {
|
|
853
|
-
return new InvalidateDataBinder(view, options);
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
/**
|
|
857
|
-
* Create binder options. If not specified, the default values are:
|
|
858
|
-
* - sortFn: no sorting
|
|
859
|
-
*/
|
|
860
|
-
export function createBinderOptions({
|
|
861
|
-
sortFn,
|
|
862
|
-
}: { sortFn?: BinderEventsCompare }): BinderOptions {
|
|
863
|
-
return { sortFn };
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
/**
|
|
867
|
-
* Create flushable binder options. If not specified, the default values are:
|
|
868
|
-
* - sortFn: no sorting
|
|
869
|
-
* - sortAnchorsFn: no sorting
|
|
870
|
-
* - autoFlush: true
|
|
871
|
-
*/
|
|
872
|
-
export function createFlushableBinderOptions<E extends Listeners<E>>({
|
|
873
|
-
sortFn,
|
|
874
|
-
sortAnchorsFn,
|
|
875
|
-
autoFlush = true,
|
|
876
|
-
autoFlushPolicy,
|
|
877
|
-
}: {
|
|
878
|
-
sortFn?: BinderEventsCompare;
|
|
879
|
-
sortAnchorsFn?: AnchorsCompare;
|
|
880
|
-
autoFlush?: boolean;
|
|
881
|
-
autoFlushPolicy: keyof Listeners<E>;
|
|
882
|
-
}): FlushableBinderOptions<E> {
|
|
883
|
-
return {
|
|
884
|
-
sortFn,
|
|
885
|
-
sortAnchorsFn,
|
|
886
|
-
autoFlush,
|
|
887
|
-
autoFlushPolicy,
|
|
888
|
-
};
|
|
889
|
-
}
|
|
890
|
-
|
|
891
|
-
/**
|
|
892
|
-
* Utility to create a compare function from a list of compare functions.
|
|
893
|
-
*
|
|
894
|
-
* @param fns - a list of compare functions
|
|
895
|
-
* @returns a compare function that can be used for sorting
|
|
896
|
-
*/
|
|
897
|
-
export function comparePipeline<T>(...fns: CompareFunction<T>[]): CompareFunction<T> {
|
|
898
|
-
return (a: T, b: T): number => {
|
|
899
|
-
for (const fn of fns) {
|
|
900
|
-
const result = fn(a, b);
|
|
901
|
-
if (result !== 0) {
|
|
902
|
-
return result;
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
return 0;
|
|
906
|
-
};
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
/**
|
|
910
|
-
* Native sorting algorithm.
|
|
911
|
-
*
|
|
912
|
-
* @param arr - the array to sort
|
|
913
|
-
* @param compareFn - the compare function
|
|
914
|
-
* @returns the sorted array
|
|
915
|
-
*/
|
|
916
|
-
function nativeSort<T>(arr: T[], compareFn: CompareFunction<T>): T[] {
|
|
917
|
-
return [...arr].sort(compareFn);
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
/**
|
|
921
|
-
* Compiles a (user friendly) syntax tree into the internal binding structure.
|
|
922
|
-
* The syntax tree is a compact representation of related {@link BindPath}s.
|
|
923
|
-
* The match policy can be specified. If not specified, the default value is "path".
|
|
924
|
-
* @returns a {@link BindPolicy} object
|
|
925
|
-
*/
|
|
926
|
-
export function compileSyntaxTree(
|
|
927
|
-
syntaxTree: BindSyntaxTree,
|
|
928
|
-
matchPolicy?: MatchPolicy,
|
|
929
|
-
): BindPolicy {
|
|
930
|
-
const entries = Object.entries(syntaxTree);
|
|
931
|
-
if (entries.length === 1) {
|
|
932
|
-
const [fieldName, childNode] = entries[0] ?? oob();
|
|
933
|
-
const fieldKey: FieldKey = brand(fieldName);
|
|
934
|
-
const bindTree = compileSyntaxTreeNode(childNode as BindSyntaxTree, fieldKey);
|
|
935
|
-
return { matchPolicy: matchPolicy ?? "path", bindTree };
|
|
936
|
-
} else throw new Error("Invalid BindSyntaxTree structure");
|
|
937
|
-
}
|
|
938
|
-
|
|
939
|
-
function compileSyntaxTreeNode(node: BindSyntaxTree | true, parentField: FieldKey): BindTree {
|
|
940
|
-
if (node === true) return { field: parentField, children: new Map() };
|
|
941
|
-
const pathStep: PathStep = {
|
|
942
|
-
field: parentField,
|
|
943
|
-
index: node[indexSymbol],
|
|
944
|
-
};
|
|
945
|
-
const children = new Map<FieldKey, BindTree>();
|
|
946
|
-
for (const [key, value] of Object.entries(node)) {
|
|
947
|
-
const fieldKey: FieldKey = brand(key);
|
|
948
|
-
children.set(fieldKey, compileSyntaxTreeNode(value, fieldKey));
|
|
949
|
-
}
|
|
950
|
-
return {
|
|
951
|
-
...pathStep,
|
|
952
|
-
children,
|
|
953
|
-
};
|
|
954
|
-
}
|