@fluidframework/tree 2.61.0-355990 → 2.61.0-356132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -0
  2. package/dist/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  3. package/dist/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  4. package/dist/feature-libraries/flex-tree/observer.d.ts +8 -0
  5. package/dist/feature-libraries/flex-tree/observer.d.ts.map +1 -1
  6. package/dist/feature-libraries/flex-tree/observer.js +3 -0
  7. package/dist/feature-libraries/flex-tree/observer.js.map +1 -1
  8. package/dist/packageVersion.d.ts +1 -1
  9. package/dist/packageVersion.js +1 -1
  10. package/dist/packageVersion.js.map +1 -1
  11. package/dist/shared-tree/treeAlpha.d.ts +1 -1
  12. package/dist/shared-tree/treeAlpha.d.ts.map +1 -1
  13. package/dist/shared-tree/treeAlpha.js +85 -65
  14. package/dist/shared-tree/treeAlpha.js.map +1 -1
  15. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts +2 -0
  16. package/lib/feature-libraries/flex-tree/flexTreeTypes.d.ts.map +1 -1
  17. package/lib/feature-libraries/flex-tree/flexTreeTypes.js.map +1 -1
  18. package/lib/feature-libraries/flex-tree/observer.d.ts +8 -0
  19. package/lib/feature-libraries/flex-tree/observer.d.ts.map +1 -1
  20. package/lib/feature-libraries/flex-tree/observer.js +3 -0
  21. package/lib/feature-libraries/flex-tree/observer.js.map +1 -1
  22. package/lib/packageVersion.d.ts +1 -1
  23. package/lib/packageVersion.js +1 -1
  24. package/lib/packageVersion.js.map +1 -1
  25. package/lib/shared-tree/treeAlpha.d.ts +1 -1
  26. package/lib/shared-tree/treeAlpha.d.ts.map +1 -1
  27. package/lib/shared-tree/treeAlpha.js +86 -66
  28. package/lib/shared-tree/treeAlpha.js.map +1 -1
  29. package/package.json +23 -23
  30. package/src/feature-libraries/flex-tree/flexTreeTypes.ts +2 -0
  31. package/src/feature-libraries/flex-tree/observer.ts +18 -1
  32. package/src/packageVersion.ts +1 -1
  33. package/src/shared-tree/treeAlpha.ts +99 -74
@@ -1 +1 @@
1
- {"version":3,"file":"treeAlpha.js","sourceRoot":"","sources":["../../src/shared-tree/treeAlpha.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tassert,\n\tdebugAssert,\n\tfail,\n\tunreachableCase,\n} from \"@fluidframework/core-utils/internal\";\nimport { createIdCompressor } from \"@fluidframework/id-compressor/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport type { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tasIndex,\n\tgetKernel,\n\ttype Unhydrated,\n\tTreeBeta,\n\ttryGetSchema,\n\tcreateFromCursor,\n\tFieldKind,\n\tnormalizeFieldSchema,\n\tTreeNode,\n\ttype ImplicitFieldSchema,\n\ttype InsertableField,\n\ttype TreeFieldFromImplicitField,\n\ttype TreeLeafValue,\n\ttype UnsafeUnknownSchema,\n\tconciseFromCursor,\n\ttype ConciseTree,\n\tapplySchemaToParserOptions,\n\tcursorFromVerbose,\n\tverboseFromCursor,\n\ttype TreeEncodingOptions,\n\ttype VerboseTree,\n\textractPersistedSchema,\n\ttype TreeBranch,\n\tTreeViewConfigurationAlpha,\n\tgetStoredKey,\n\tgetPropertyKeyFromStoredKey,\n\ttreeNodeApi,\n\tgetIdentifierFromNode,\n\tunhydratedFlexTreeFromInsertable,\n\tgetOrCreateNodeFromInnerNode,\n\tgetOrCreateNodeFromInnerUnboxedNode,\n\tgetOrCreateInnerNode,\n\tNodeKind,\n\ttryGetTreeNodeForField,\n\tisObjectNodeSchema,\n\tisTreeNode,\n\ttoInitialSchema,\n\tconvertField,\n\ttoUnhydratedSchema,\n\ttype TreeParsingOptions,\n\ttype NodeChangedData,\n} from \"../simple-tree/index.js\";\nimport { brand, extractFromOpaque, type JsonCompatible } from \"../util/index.js\";\nimport {\n\tFluidClientVersion,\n\tnoopValidator,\n\ttype ICodecOptions,\n\ttype CodecWriteOptions,\n} from \"../codec/index.js\";\nimport { EmptyKey, type FieldKey, type ITreeCursorSynchronous } from \"../core/index.js\";\nimport {\n\tcursorForMapTreeField,\n\tdefaultSchemaPolicy,\n\tisTreeValue,\n\tmakeFieldBatchCodec,\n\tmapTreeFromCursor,\n\tTreeCompressionStrategy,\n\ttype FieldBatch,\n\ttype FieldBatchEncodingContext,\n\tfluidVersionToFieldBatchCodecWriteVersion,\n\ttype LocalNodeIdentifier,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeNode,\n\ttype Observer,\n\twithObservation,\n} from \"../feature-libraries/index.js\";\nimport { independentInitializedView, type ViewContent } from \"./independentView.js\";\nimport { SchematizingSimpleTreeView, ViewSlot } from \"./schematizingTreeView.js\";\n\nconst identifier: TreeIdentifierUtils = (node: TreeNode): string | undefined => {\n\tconst nodeIdentifier = getIdentifierFromNode(node, \"uncompressed\");\n\tif (typeof nodeIdentifier === \"number\") {\n\t\tthrow new TypeError(\"identifier should be uncompressed.\");\n\t}\n\treturn nodeIdentifier;\n};\n\nidentifier.shorten = (branch: TreeBranch, nodeIdentifier: string): number | undefined => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\tconst localNodeKey = nodeKeyManager.tryLocalizeNodeIdentifier(nodeIdentifier);\n\treturn localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : undefined;\n};\n\nidentifier.lengthen = (branch: TreeBranch, nodeIdentifier: number): string => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\treturn nodeKeyManager.stabilizeNodeIdentifier(\n\t\tnodeIdentifier as unknown as LocalNodeIdentifier,\n\t);\n};\n\nidentifier.getShort = (node: TreeNode): number | undefined => {\n\tconst shortIdentifier = getIdentifierFromNode(node, \"compressed\");\n\treturn typeof shortIdentifier === \"number\" ? shortIdentifier : undefined;\n};\n\nidentifier.create = (branch: TreeBranch): string => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\treturn nodeKeyManager.stabilizeNodeIdentifier(nodeKeyManager.generateLocalNodeIdentifier());\n};\n\nObject.freeze(identifier);\n\n/**\n * A utility interface for retrieving or converting node identifiers.\n *\n * @remarks\n * This provides methods to:\n *\n * - Retrieve long or short identifiers from nodes\n *\n * - Convert between long identifiers and short identifiers\n *\n * - Generates long identifiers\n *\n * @alpha @sealed\n */\nexport interface TreeIdentifierUtils {\n\t/**\n\t * Returns the contents of a node's {@link SchemaFactory.identifier} field as a stable identifier.\n\t * If the identifier field does not exist, returns undefined.\n\t *\n\t * @param node - The TreeNode you want to get the identifier from,\n\t */\n\t(node: TreeNode): string | undefined;\n\n\t/**\n\t * Returns the shortened identifier as a number given long identifier known by the id compressor on the branch if possible.\n\t * Otherwise, it will return the original string identifier provided.\n\t * If the id does not exist, or is unknown by the id compressor, it returns undefined.\n\t *\n\t * This method is the inverse of {@link TreeIdentifierUtils.lengthen}. If you shorten an identifier\n\t * and then immediately pass it to {@link TreeIdentifierUtils.lengthen}, you will get the original string back.\n\t *\n\t * @param branch - TreeBranch from where you get the idCompressor to do the decompression.\n\t * @param nodeIdentifier - the stable identifier that needs to be shortened.\n\t */\n\tshorten(branch: TreeBranch, nodeIdentifier: string): number | undefined;\n\n\t/**\n\t * Returns the stable id as a string if the identifier is decompressible and known by the id compressor. Otherwise, it will throw an error.\n\t *\n\t * This method is the inverse of {@link TreeIdentifierUtils.shorten}. If you lengthen an identifier\n\t * and then immediately pass it to {@link TreeIdentifierUtils.shorten}, you will get the original short identifier back.\n\t *\n\t * @param branch - TreeBranch from where you want to get the id compressor to do the decompression.\n\t * @param nodeIdentifier - The local identifier that needs to be expanded.\n\t */\n\tlengthen(branch: TreeBranch, nodeIdentifier: number): string;\n\n\t/**\n\t * Returns the {@link SchemaFactory.identifier | identifier} of the given node in the most compressed form possible.\n\t * @remarks\n\t * If the node is {@link Unhydrated | hydrated} and its identifier is a valid UUID that was automatically generated by the SharedTree it is part of (or something else using the same {@link @fluidframework/id-compressor#IIdCompressor}), then this will return a process-unique integer corresponding to that identifier.\n\t * This is useful for performance-sensitive scenarios involving many nodes with identifiers that need to be compactly retained in memory or used for efficient lookup.\n\t * Note that automatically generated identifiers that were accessed before the node was hydrated will return the generated UUID, not the process-unique integer.\n\t *\n\t * If the node's identifier is any other user-provided string, then this will return undefined.\n\t *\n\t * If the node has no identifier (that is, it has no {@link SchemaFactory.identifier | identifier} field), then this returns `undefined`.\n\t *\n\t * If the node has more than one identifier, then this will throw an error.\n\t *\n\t * The returned integer should not be serialized or preserved outside of the current process.\n\t * Its lifetime is that of the current in-memory instance of the FF container for this client, and it is not guaranteed to be unique or stable outside of that context.\n\t * The same node's identifier may, for example, be different across multiple sessions for the same client and document, or different across two clients in the same session.\n\t */\n\tgetShort(node: TreeNode): number | undefined;\n\n\t/**\n\t * Creates and returns a long identifier.\n\t * The long identifier is a compressible, stable identifier generated by the tree's ID compressor.\n\t *\n\t * @param branch - TreeBranch from where you want to get the id compressor to generate the identifier from.\n\t */\n\tcreate(branch: TreeBranch): string;\n}\n\n/**\n * Extensions to {@link (Tree:interface)} and {@link (TreeBeta:interface)} which are not yet stable.\n * @remarks\n * Use via the {@link (TreeAlpha:variable)} singleton.\n *\n * The unhydrated node creation APIs in this interface do not support {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}.\n * This is because unknown optional fields still must have a schema: its just that the schema may come from the document's stored schema.\n * Unhydrated nodes created via this interface are not associated with any document, so there is nowhere for them to get schema for unknown optional fields.\n * Note that {@link (TreeBeta:interface).clone} can create an unhydrated node with unknown optional fields, as it uses the source node's stored schema (if any).\n *\n * Export APIs in this interface include {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}\n * if they are using {@link KeyEncodingOptions.allStoredKeys}.\n *\n * @privateRemarks\n * TODO:\n * There should be a way to provide a source for defaulted identifiers for unhydrated node creation, either via these APIs or some way to add them to its output later.\n * If an option were added to these APIs, it could also be used to enable unknown optional fields.\n *\n * @system @sealed @alpha\n */\nexport interface TreeAlpha {\n\t/**\n\t * Retrieve the {@link TreeBranch | branch}, if any, for the given node.\n\t * @param node - The node to query\n\t * @remarks If the node has already been inserted into the tree, this will return the branch associated with that node's {@link TreeView | view}.\n\t * Otherwise, it will return `undefined` (because the node has not yet been inserted and is therefore not part of a branch or view).\n\t *\n\t * This does not fork a new branch, but rather retrieves the _existing_ branch for the node.\n\t * To create a new branch, use e.g. {@link TreeBranch.fork | `myBranch.fork()`}.\n\t */\n\tbranch(node: TreeNode): TreeBranch | undefined;\n\n\t/**\n\t * Construct tree content that is compatible with the field defined by the provided `schema`.\n\t * @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.\n\t * @param data - The data used to construct the field content.\n\t * @remarks\n\t * When providing a {@link TreeNodeSchemaClass}, this is the same as invoking its constructor except that an unhydrated node can also be provided.\n\t * This function exists as a generalization that can be used in other cases as well,\n\t * such as when `undefined` might be allowed (for an optional field), or when the type should be inferred from the data when more than one type is possible.\n\t */\n\tcreate<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: InsertableField<TSchema>,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t>;\n\n\t/**\n\t * Less type safe version of {@link (TreeAlpha:interface).create}, suitable for importing data.\n\t * @remarks\n\t * Due to {@link ConciseTree} relying on type inference from the data, its use is somewhat limited.\n\t * This does not support {@link ConciseTree|ConciseTrees} with customized handle encodings or using persisted keys.\n\t * Use \"compressed\" or \"verbose\" formats for more flexibility.\n\t *\n\t * When using this function,\n\t * it is recommend to ensure your schema is unambiguous with {@link ITreeConfigurationOptions.preventAmbiguity}.\n\t * If the schema is ambiguous, consider using {@link (TreeAlpha:interface).create} and {@link Unhydrated} nodes where needed,\n\t * or using {@link (TreeAlpha:interface).(importVerbose:1)} and specify all types.\n\t *\n\t * Documented (and thus recoverable) error handling/reporting for this is not yet implemented,\n\t * but for now most invalid inputs will throw a recoverable error.\n\t */\n\timportConcise<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: ConciseTree | undefined,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t>;\n\n\t/**\n\t * Construct tree content compatible with a field defined by the provided `schema`.\n\t * @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.\n\t * @param data - The data used to construct the field content. See {@link (TreeAlpha:interface).(exportVerbose:1)}.\n\t * @remarks\n\t * This currently does not support input containing\n\t * {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields| unknown optional fields} but does support\n\t * {@link SchemaStaticsAlpha.staged | staged} allowed types.\n\t * Non-empty default values for fields are currently not supported (must be provided in the input).\n\t * The content will be validated against the schema and an error will be thrown if out of schema.\n\t */\n\timportVerbose<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tdata: VerboseTree | undefined,\n\t\toptions?: TreeParsingOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a {@link ConciseTree}.\n\t */\n\texportConcise(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): ConciseTree;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a {@link ConciseTree}, allowing undefined.\n\t */\n\texportConcise(\n\t\tnode: TreeNode | TreeLeafValue | undefined,\n\t\toptions?: TreeEncodingOptions,\n\t): ConciseTree | undefined;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a JSON compatible plain old JavaScript Object (except for {@link @fluidframework/core-interfaces#IFluidHandle|IFluidHandles}).\n\t * Uses the {@link VerboseTree} format, with an explicit type on every node.\n\t *\n\t * @remarks\n\t * There are several cases this may be preferred to {@link (TreeAlpha:interface).(exportConcise:1)}:\n\t *\n\t * 1. When not using {@link ITreeConfigurationOptions.preventAmbiguity} (or when using `useStableFieldKeys`), `exportConcise` can produce ambiguous data (the type may be unclear on some nodes).\n\t * `exportVerbose` will always be unambiguous and thus lossless.\n\t *\n\t * 2. When the data might be interpreted without access to the exact same view schema. In such cases, the types may be unknowable if not included.\n\t *\n\t * 3. When easy access to the type is desired.\n\t */\n\texportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree;\n\n\t/**\n\t * Export the content of the provided `tree` in a compressed JSON compatible format.\n\t * @remarks\n\t * If an `idCompressor` is provided, it will be used to compress identifiers and thus will be needed to decompress the data.\n\t *\n\t * Always uses \"stored\" keys.\n\t * See {@link KeyEncodingOptions.allStoredKeys} for details.\n\t * @privateRemarks\n\t * TODO: It is currently not clear how to work with the idCompressors correctly in the package API.\n\t * Better APIs should probably be provided as there is currently no way to associate an un-hydrated tree with an idCompressor,\n\t * Nor get the correct idCompressor from a subtree to use when exporting it.\n\t * Additionally using `createIdCompressor` to make an idCompressor is `@legacy` and thus not intended for use in this API surface.\n\t * It would probably make more sense if we provided a way to get an idCompressor from the context of a node,\n\t * which could be optional (and settable if missing) for un0hydrated nodes and required for hydrated ones.\n\t * Add in a stable public API for creating idCompressors, and a way to get them from a tree (without view schema), and that should address the anticipated use-cases.\n\t */\n\texportCompressed(\n\t\ttree: TreeNode | TreeLeafValue,\n\t\toptions: { idCompressor?: IIdCompressor } & Pick<\n\t\t\tCodecWriteOptions,\n\t\t\t\"oldestCompatibleClient\"\n\t\t>,\n\t): JsonCompatible<IFluidHandle>;\n\n\t/**\n\t * Import data encoded by {@link (TreeAlpha:interface).exportCompressed}.\n\t *\n\t * @param schema - Schema with which the data must be compatible. This compatibility is not verified and must be ensured by the caller.\n\t * @param compressedData - Data compressed by {@link (TreeAlpha:interface).exportCompressed}.\n\t * @param options - If {@link (TreeAlpha:interface).exportCompressed} was given an `idCompressor`, it must be provided here.\n\t *\n\t * @remarks\n\t * If the data could have been encoded with a different schema, consider encoding the schema along side it using {@link extractPersistedSchema} and loading the data using {@link independentView}.\n\t *\n\t * @privateRemarks\n\t * This API could be improved:\n\t *\n\t * 1. It could validate that the schema is compatible, and return or throw an error in the invalid case (maybe add a \"try\" version).\n\t *\n\t * 2. A \"try\" version of this could return an error if the data isn't in a supported format (as determined by version and/or JasonValidator).\n\t *\n\t * 3. Requiring the caller provide a JsonValidator isn't the most friendly API. It might be practical to provide a default.\n\t */\n\timportCompressed<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tcompressedData: JsonCompatible<IFluidHandle>,\n\t\toptions: { idCompressor?: IIdCompressor } & ICodecOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\n\t/**\n\t * APIs for creating, converting, and retrieving identifiers.\n\t */\n\treadonly identifier: TreeIdentifierUtils;\n\n\t/**\n\t * The key of the given node under its parent.\n\t * @remarks\n\t * If `node` is an element in a {@link (TreeArrayNode:interface)}, this returns the index of `node` in the array node (a `number`).\n\t * If `node` is the root node, this returns undefined.\n\t * Otherwise, this returns the key of the field that it is under (a `string`).\n\t */\n\tkey2(node: TreeNode): string | number | undefined;\n\n\t/**\n\t * Gets the child of the given node with the given property key if a child exists under that key.\n\t *\n\t * @remarks {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | Unknown optional fields} of Object nodes will not be returned by this method.\n\t *\n\t * @param node - The parent node whose child is being requested.\n\t * @param key - The property key under the node under which the child is being requested.\n\t * For Object nodes, this is the developer-facing \"property key\", not the \"{@link SimpleObjectFieldSchema.storedKey | stored keys}\".\n\t *\n\t * @returns The child node or leaf value under the given key, or `undefined` if no such child exists.\n\t *\n\t * @see {@link (TreeAlpha:interface).key2}\n\t * @see {@link (TreeNodeApi:interface).parent}\n\t */\n\tchild(node: TreeNode, key: string | number): TreeNode | TreeLeafValue | undefined;\n\n\t/**\n\t * Gets the children of the provided node, paired with their property keys under the node.\n\t *\n\t * @remarks\n\t * No guarantees are made regarding the order of the children in the returned array.\n\t *\n\t * Optional properties of Object nodes with no value are not included in the result.\n\t *\n\t * {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | Unknown optional fields} of Object nodes are not included in the result.\n\t *\n\t * @param node - The node whose children are being requested.\n\t *\n\t * @returns\n\t * An array of pairs of the form `[propertyKey, child]`.\n\t *\n\t * For Array nodes, the `propertyKey` is the index of the child in the array.\n\t *\n\t * For Object nodes, the returned `propertyKey`s are the developer-facing \"property keys\", not the \"{@link SimpleObjectFieldSchema.storedKey | stored keys}\".\n\t *\n\t * @see {@link (TreeAlpha:interface).key2}\n\t * @see {@link (TreeNodeApi:interface).parent}\n\t */\n\tchildren(\n\t\tnode: TreeNode,\n\t): Iterable<[propertyKey: string | number, child: TreeNode | TreeLeafValue]>;\n\n\t/**\n\t * Track observations of any TreeNode content.\n\t * @remarks\n\t * This subscribes to changes to any nodes content observed during `trackDuring`.\n\t *\n\t * Currently this does not support tracking parentage (see {@link (TreeAlpha:interface).trackObservationsOnce} for a version which does):\n\t * if accessing parentage during `trackDuring`, this will throw a usage error.\n\t *\n\t * This also does not track node status changes (e.g. whether a node is attached to a view or not).\n\t * The current behavior of checking status is unspecified: future versions may track it, error, or ignore it.\n\t *\n\t * Even after onInvalidation is called, these subscriptions remain active until `unsubscribe` is called.\n\t * See {@link (TreeAlpha:interface).trackObservationsOnce} for a version which automatically unsubscribes on the first invalidation.\n\t */\n\ttrackObservations<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void };\n\n\t/**\n\t * {@link (TreeAlpha:interface).trackObservations} except automatically unsubscribes when the first invalidation occurs.\n\t * @remarks\n\t * This also supports tracking parentage, unlike {@link (TreeAlpha:interface).trackObservations}, as long as the parent is not undefined.\n\t */\n\ttrackObservationsOnce<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void };\n}\n\nclass NodeSubscription {\n\t/**\n\t * If undefined, subscribes to all keys.\n\t * Otherwise only subscribes to the keys in the set.\n\t */\n\tpublic keys: Set<FieldKey> | undefined;\n\tpublic readonly unsubscribe: () => void;\n\tpublic constructor(\n\t\tpublic readonly onInvalidation: () => void,\n\t\tflexNode: FlexTreeNode,\n\t) {\n\t\t// TODO:Performance: It is possible to optimize this to not use the public TreeNode API.\n\t\tconst node = getOrCreateNodeFromInnerNode(flexNode);\n\t\tassert(node instanceof TreeNode, \"Unexpected leaf value\");\n\n\t\tconst handler = (data: NodeChangedData): void => {\n\t\t\tif (this.keys === undefined || data.changedProperties === undefined) {\n\t\t\t\tthis.onInvalidation();\n\t\t\t} else {\n\t\t\t\tlet keyMap: ReadonlyMap<FieldKey, string> | undefined;\n\t\t\t\tconst schema = treeNodeApi.schema(node);\n\t\t\t\tif (isObjectNodeSchema(schema)) {\n\t\t\t\t\tkeyMap = schema.storedKeyToPropertyKey;\n\t\t\t\t}\n\t\t\t\t// TODO:Performance: Ideally this would use Set.prototype.isDisjointFrom when available.\n\t\t\t\tfor (const flexKey of this.keys) {\n\t\t\t\t\t// TODO:Performance: doing everything at the flex tree layer could avoid this translation\n\t\t\t\t\tconst key = keyMap?.get(flexKey) ?? flexKey;\n\n\t\t\t\t\tif (data.changedProperties.has(key)) {\n\t\t\t\t\t\tthis.onInvalidation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tthis.unsubscribe = TreeBeta.on(node, \"nodeChanged\", handler);\n\t}\n}\n\nfunction trackObservations<TResult>(\n\tonInvalidation: () => void,\n\ttrackDuring: () => TResult,\n\tonlyOnce = false,\n): { result: TResult; unsubscribe: () => void } {\n\tlet observing = true;\n\n\tconst invalidate = (): void => {\n\t\tif (observing) {\n\t\t\tthrow new UsageError(\"Cannot invalidate while tracking observations\");\n\t\t}\n\t\tonInvalidation();\n\t};\n\n\tconst subscriptions = new Map<FlexTreeNode, NodeSubscription>();\n\tconst observer: Observer = {\n\t\tobserveNodeFields(flexNode: FlexTreeNode): void {\n\t\t\tif (flexNode.value !== undefined) {\n\t\t\t\t// Leaf value, nothing to observe.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst subscription = subscriptions.get(flexNode);\n\t\t\tif (subscription !== undefined) {\n\t\t\t\t// Already subscribed to this node.\n\t\t\t\tsubscription.keys = undefined; // Now subscribed to all keys.\n\t\t\t} else {\n\t\t\t\tconst newSubscription = new NodeSubscription(invalidate, flexNode);\n\t\t\t\tsubscriptions.set(flexNode, newSubscription);\n\t\t\t}\n\t\t},\n\t\tobserveNodeField(flexNode: FlexTreeNode, key: FieldKey): void {\n\t\t\tif (flexNode.value !== undefined) {\n\t\t\t\t// Leaf value, nothing to observe.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst subscription = subscriptions.get(flexNode);\n\t\t\tif (subscription !== undefined) {\n\t\t\t\t// Already subscribed to this node: if not subscribed to all keys, subscribe to this one.\n\t\t\t\t// TODO:Performance: due to how JavaScript set ordering works,\n\t\t\t\t// it might be faster to check `has` and only add if not present in case the same field is viewed many times.\n\t\t\t\tsubscription.keys?.add(key);\n\t\t\t} else {\n\t\t\t\tconst newSubscription = new NodeSubscription(invalidate, flexNode);\n\t\t\t\tnewSubscription.keys = new Set([key]);\n\t\t\t\tsubscriptions.set(flexNode, newSubscription);\n\t\t\t}\n\t\t},\n\t\tobserveParentOf(node: FlexTreeNode): void {\n\t\t\t// Supporting parent tracking is more difficult that it might seem at first.\n\t\t\t// There are two main complicating factors:\n\t\t\t// 1. The parent may be undefined (the node is a root).\n\t\t\t// 2. If tracking this by subscribing to the parent's changes, then which events are subscribed to needs to be updated after the parent changes.\n\t\t\t//\n\t\t\t// If not supporting the first case (undefined parents), the second case gets problematic since it would result in edits which take a node who's parent was observed,\n\t\t\t// and un-parent it, could then throw a usage error.\n\n\t\t\tif (!onlyOnce) {\n\t\t\t\t// TODO: better APIS should be provided which make handling this case practical.\n\t\t\t\tthrow new UsageError(\"Observation tracking for parents is currently not supported.\");\n\t\t\t}\n\n\t\t\tconst parent = withObservation(undefined, () => node.parentField.parent);\n\n\t\t\tif (parent.parent === undefined) {\n\t\t\t\t// TODO: better APIS should be provided which make handling this case practical.\n\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\"Observation tracking for parents is currently not supported when parent is undefined.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tobserver.observeNodeField(parent.parent, parent.key);\n\t\t},\n\t};\n\tconst result = withObservation(observer, trackDuring);\n\tobserving = false;\n\n\tlet subscribed = true;\n\n\treturn {\n\t\tresult,\n\t\tunsubscribe: () => {\n\t\t\tif (!subscribed) {\n\t\t\t\tthrow new UsageError(\"Already unsubscribed\");\n\t\t\t}\n\t\t\tsubscribed = false;\n\t\t\tfor (const subscription of subscriptions.values()) {\n\t\t\t\tsubscription.unsubscribe();\n\t\t\t}\n\t\t},\n\t};\n}\n\n/**\n * Extensions to {@link (Tree:variable)} and {@link (TreeBeta:variable)} which are not yet stable.\n * @see {@link (TreeAlpha:interface)}.\n * @alpha\n */\nexport const TreeAlpha: TreeAlpha = {\n\ttrackObservations<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void } {\n\t\treturn trackObservations(onInvalidation, trackDuring);\n\t},\n\n\ttrackObservationsOnce<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void } {\n\t\tconst result = trackObservations(\n\t\t\t() => {\n\t\t\t\tresult.unsubscribe();\n\t\t\t\tonInvalidation();\n\t\t\t},\n\t\t\ttrackDuring,\n\t\t\ttrue,\n\t\t);\n\t\treturn result;\n\t},\n\n\tbranch(node: TreeNode): TreeBranch | undefined {\n\t\tconst kernel = getKernel(node);\n\t\tif (!kernel.isHydrated()) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst view = kernel.anchorNode.anchorSet.slots.get(ViewSlot);\n\t\tassert(\n\t\t\tview instanceof SchematizingSimpleTreeView,\n\t\t\t0xa5c /* Unexpected view implementation */,\n\t\t);\n\t\treturn view;\n\t},\n\n\tcreate<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: InsertableField<TSchema>,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t> {\n\t\tconst mapTree = unhydratedFlexTreeFromInsertable(\n\t\t\tdata as InsertableField<UnsafeUnknownSchema>,\n\t\t\tschema,\n\t\t);\n\t\tconst result = mapTree === undefined ? undefined : getOrCreateNodeFromInnerNode(mapTree);\n\t\treturn result as Unhydrated<\n\t\t\tTSchema extends ImplicitFieldSchema\n\t\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t\t: TreeNode | TreeLeafValue | undefined\n\t\t>;\n\t},\n\n\timportConcise<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: ConciseTree | undefined,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t> {\n\t\t// `importConcise` does not need to support all the formats that `create` does.\n\t\t// Perhaps it should error instead of hydrating nodes for example.\n\t\t// For now however, it is a simple wrapper around `create`.\n\t\treturn this.create(schema, data as InsertableField<TSchema>);\n\t},\n\n\timportVerbose<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tdata: VerboseTree | undefined,\n\t\toptions?: TreeParsingOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>> {\n\t\tconst config: TreeEncodingOptions = { ...options };\n\t\t// Create a config which is standalone, and thus can be used without having to refer back to the schema.\n\t\tconst schemalessConfig = applySchemaToParserOptions(schema, config);\n\t\tif (data === undefined) {\n\t\t\tconst field = normalizeFieldSchema(schema);\n\t\t\tif (field.kind !== FieldKind.Optional) {\n\t\t\t\tthrow new UsageError(\"undefined provided for non-optional field.\");\n\t\t\t}\n\t\t\treturn undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\t\t}\n\t\tconst cursor = cursorFromVerbose(data, schemalessConfig);\n\t\treturn createFromCursor(\n\t\t\tschema,\n\t\t\tcursor,\n\t\t\tconvertField(normalizeFieldSchema(schema), toUnhydratedSchema),\n\t\t);\n\t},\n\n\texportConcise,\n\n\texportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree {\n\t\tif (isTreeValue(node)) {\n\t\t\treturn node;\n\t\t}\n\t\tconst config: TreeEncodingOptions = { ...options };\n\n\t\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\t\tconst kernel = getKernel(node);\n\t\treturn verboseFromCursor(cursor, kernel.context, config);\n\t},\n\n\texportCompressed(\n\t\tnode: TreeNode | TreeLeafValue,\n\t\toptions: { idCompressor?: IIdCompressor } & Pick<\n\t\t\tCodecWriteOptions,\n\t\t\t\"oldestCompatibleClient\"\n\t\t>,\n\t): JsonCompatible<IFluidHandle> {\n\t\tconst schema = tryGetSchema(node) ?? fail(0xacf /* invalid input */);\n\t\tconst format = fluidVersionToFieldBatchCodecWriteVersion(options.oldestCompatibleClient);\n\t\tconst codec = makeFieldBatchCodec({ jsonValidator: noopValidator }, format);\n\t\tconst cursor = borrowFieldCursorFromTreeNodeOrValue(node);\n\t\tconst batch: FieldBatch = [cursor];\n\t\t// If none provided, create a compressor which will not compress anything.\n\t\tconst idCompressor = options.idCompressor ?? createIdCompressor();\n\n\t\t// Grabbing an existing stored schema from the node is important to ensure that unknown optional fields can be preserved.\n\t\t// Note that if the node is unhydrated, this can result in all staged allowed types being included in the schema, which might be undesired.\n\t\tconst storedSchema = isTreeNode(node)\n\t\t\t? getKernel(node).context.flexContext.schema\n\t\t\t: toInitialSchema(schema);\n\n\t\tconst context: FieldBatchEncodingContext = {\n\t\t\tencodeType: TreeCompressionStrategy.Compressed,\n\t\t\tidCompressor,\n\t\t\toriginatorId: idCompressor.localSessionId, // TODO: Why is this needed?\n\t\t\tschema: { schema: storedSchema, policy: defaultSchemaPolicy },\n\t\t};\n\t\tconst result = codec.encode(batch, context);\n\t\treturn result;\n\t},\n\n\timportCompressed<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tcompressedData: JsonCompatible<IFluidHandle>,\n\t\toptions: {\n\t\t\tidCompressor?: IIdCompressor;\n\t\t} & ICodecOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>> {\n\t\tconst config = new TreeViewConfigurationAlpha({ schema });\n\t\tconst content: ViewContent = {\n\t\t\t// Always use a v1 schema codec for consistency.\n\t\t\t// TODO: reevaluate how staged schema should behave in schema import/export APIs before stabilizing this.\n\t\t\tschema: extractPersistedSchema(config.schema, FluidClientVersion.v2_0, () => true),\n\t\t\ttree: compressedData,\n\t\t\tidCompressor: options.idCompressor ?? createIdCompressor(),\n\t\t};\n\t\tconst view = independentInitializedView(config, options, content);\n\t\treturn TreeBeta.clone<TSchema>(view.root);\n\t},\n\n\tidentifier,\n\n\tkey2(node: TreeNode): string | number | undefined {\n\t\t// If the parent is undefined, then this node is under the root field,\n\t\tconst parent = treeNodeApi.parent(node);\n\t\tif (parent === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// The flex-domain strictly operates in terms of \"stored keys\".\n\t\t// To find the associated developer-facing \"property key\", we need to look up the field associated with\n\t\t// the stored key from the flex-domain, and get property key its simple-domain counterpart was created with.\n\t\tconst storedKey = getStoredKey(node);\n\t\tconst parentSchema = treeNodeApi.schema(parent);\n\t\treturn getPropertyKeyFromStoredKey(parentSchema, storedKey);\n\t},\n\n\tchild: (\n\t\tnode: TreeNode,\n\t\tpropertyKey: string | number,\n\t): TreeNode | TreeLeafValue | undefined => {\n\t\tconst flexNode = getOrCreateInnerNode(node);\n\t\tdebugAssert(\n\t\t\t() => !flexNode.context.isDisposed() || \"The provided tree node has been disposed.\",\n\t\t);\n\n\t\tconst schema = treeNodeApi.schema(node);\n\n\t\tswitch (schema.kind) {\n\t\t\tcase NodeKind.Array: {\n\t\t\t\tconst sequence = flexNode.tryGetField(EmptyKey) as FlexTreeSequenceField | undefined;\n\n\t\t\t\t// Empty sequence - cannot have children.\n\t\t\t\tif (sequence === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst index =\n\t\t\t\t\ttypeof propertyKey === \"number\"\n\t\t\t\t\t\t? propertyKey\n\t\t\t\t\t\t: asIndex(propertyKey, Number.POSITIVE_INFINITY);\n\n\t\t\t\t// If the key is not a valid index, then there is no corresponding child.\n\t\t\t\tif (index === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst childFlexTree = sequence.at(index);\n\n\t\t\t\t// No child at the given index.\n\t\t\t\tif (childFlexTree === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn getOrCreateNodeFromInnerUnboxedNode(childFlexTree);\n\t\t\t}\n\t\t\tcase NodeKind.Map:\n\t\t\t\tif (typeof propertyKey !== \"string\") {\n\t\t\t\t\t// Map nodes only support string keys.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t// Fall through\n\t\t\tcase NodeKind.Record:\n\t\t\tcase NodeKind.Object: {\n\t\t\t\tlet storedKey: string | number = propertyKey;\n\t\t\t\tif (isObjectNodeSchema(schema)) {\n\t\t\t\t\tconst fieldSchema = schema.fields.get(String(propertyKey));\n\t\t\t\t\tif (fieldSchema === undefined) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tstoredKey = fieldSchema.storedKey;\n\t\t\t\t}\n\n\t\t\t\tconst field = flexNode.tryGetField(brand(String(storedKey)));\n\t\t\t\tif (field !== undefined) {\n\t\t\t\t\treturn tryGetTreeNodeForField(field);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tcase NodeKind.Leaf: {\n\t\t\t\tfail(0xbc3 /* Leaf schema associated with non-leaf tree node. */);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(schema.kind);\n\t\t\t}\n\t\t}\n\t},\n\n\tchildren(node: TreeNode): [propertyKey: string | number, child: TreeNode | TreeLeafValue][] {\n\t\tconst flexNode = getOrCreateInnerNode(node);\n\t\tdebugAssert(\n\t\t\t() => !flexNode.context.isDisposed() || \"The provided tree node has been disposed.\",\n\t\t);\n\n\t\tconst schema = treeNodeApi.schema(node);\n\n\t\tconst result: [string | number, TreeNode | TreeLeafValue][] = [];\n\t\tswitch (schema.kind) {\n\t\t\tcase NodeKind.Array: {\n\t\t\t\tconst sequence = flexNode.tryGetField(EmptyKey) as FlexTreeSequenceField | undefined;\n\t\t\t\tif (sequence === undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tfor (let index = 0; index < sequence.length; index++) {\n\t\t\t\t\tconst childFlexTree = sequence.at(index);\n\t\t\t\t\tassert(childFlexTree !== undefined, 0xbc4 /* Sequence child was undefined. */);\n\t\t\t\t\tconst childTree = getOrCreateNodeFromInnerUnboxedNode(childFlexTree);\n\t\t\t\t\tresult.push([index, childTree]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Map:\n\t\t\tcase NodeKind.Record: {\n\t\t\t\tfor (const [key, flexField] of flexNode.fields) {\n\t\t\t\t\tconst childTreeNode = tryGetTreeNodeForField(flexField);\n\t\t\t\t\tif (childTreeNode !== undefined) {\n\t\t\t\t\t\tresult.push([key, childTreeNode]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Object: {\n\t\t\t\tassert(isObjectNodeSchema(schema), 0xbc5 /* Expected object schema. */);\n\t\t\t\tfor (const [propertyKey, fieldSchema] of schema.fields) {\n\t\t\t\t\tconst storedKey = fieldSchema.storedKey;\n\t\t\t\t\tconst flexField = flexNode.tryGetField(brand(String(storedKey)));\n\t\t\t\t\tif (flexField !== undefined) {\n\t\t\t\t\t\tconst childTreeNode = tryGetTreeNodeForField(flexField);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildTreeNode !== undefined,\n\t\t\t\t\t\t\t0xbc6 /* Expected child tree node for field. */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.push([propertyKey, childTreeNode]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Leaf: {\n\t\t\t\tfail(0xbc7 /* Leaf schema associated with non-leaf tree node. */);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(schema.kind);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n};\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue,\n\toptions?: TreeEncodingOptions,\n): ConciseTree;\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue | undefined,\n\toptions?: TreeEncodingOptions,\n): ConciseTree | undefined;\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue | undefined,\n\toptions?: TreeEncodingOptions,\n): ConciseTree | undefined {\n\tif (!isTreeNode(node)) {\n\t\treturn node;\n\t}\n\tconst config: TreeEncodingOptions = { ...options };\n\n\tconst kernel = getKernel(node);\n\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\treturn conciseFromCursor(cursor, kernel.context, config);\n}\n\n/**\n * Borrow a cursor from a node.\n * @remarks\n * The cursor must be put back to its original location before the node is used again.\n */\nfunction borrowCursorFromTreeNodeOrValue(\n\tnode: TreeNode | TreeLeafValue,\n): ITreeCursorSynchronous {\n\tif (isTreeValue(node)) {\n\t\treturn cursorFromVerbose(node, {});\n\t}\n\tconst kernel = getKernel(node);\n\tconst cursor = kernel.getOrCreateInnerNode().borrowCursor();\n\treturn cursor;\n}\n\n/**\n * Borrow a cursor from a field.\n * @remarks\n * The cursor must be put back to its original location before the node is used again.\n */\nfunction borrowFieldCursorFromTreeNodeOrValue(\n\tnode: TreeNode | TreeLeafValue | undefined,\n): ITreeCursorSynchronous {\n\tif (node === undefined) {\n\t\treturn cursorForMapTreeField([]);\n\t}\n\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\t// TODO: avoid copy: borrow cursor from field instead.\n\tconst mapTree = mapTreeFromCursor(cursor);\n\treturn cursorForMapTreeField([mapTree]);\n}\n"]}
1
+ {"version":3,"file":"treeAlpha.js","sourceRoot":"","sources":["../../src/shared-tree/treeAlpha.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\tassert,\n\tdebugAssert,\n\tfail,\n\tunreachableCase,\n} from \"@fluidframework/core-utils/internal\";\nimport { createIdCompressor } from \"@fluidframework/id-compressor/internal\";\nimport { UsageError } from \"@fluidframework/telemetry-utils/internal\";\nimport type { IFluidHandle } from \"@fluidframework/core-interfaces\";\nimport type { IIdCompressor } from \"@fluidframework/id-compressor\";\n\nimport {\n\tasIndex,\n\tgetKernel,\n\tTreeNode,\n\ttype Unhydrated,\n\tTreeBeta,\n\ttryGetSchema,\n\tcreateFromCursor,\n\tFieldKind,\n\tnormalizeFieldSchema,\n\ttype ImplicitFieldSchema,\n\ttype InsertableField,\n\ttype TreeFieldFromImplicitField,\n\ttype TreeLeafValue,\n\ttype UnsafeUnknownSchema,\n\tconciseFromCursor,\n\ttype ConciseTree,\n\tapplySchemaToParserOptions,\n\tcursorFromVerbose,\n\tverboseFromCursor,\n\ttype TreeEncodingOptions,\n\ttype VerboseTree,\n\textractPersistedSchema,\n\ttype TreeBranch,\n\tTreeViewConfigurationAlpha,\n\tgetStoredKey,\n\tgetPropertyKeyFromStoredKey,\n\ttreeNodeApi,\n\tgetIdentifierFromNode,\n\tunhydratedFlexTreeFromInsertable,\n\tgetOrCreateNodeFromInnerNode,\n\tgetOrCreateNodeFromInnerUnboxedNode,\n\tgetOrCreateInnerNode,\n\tNodeKind,\n\ttryGetTreeNodeForField,\n\tisObjectNodeSchema,\n\tisTreeNode,\n\ttoInitialSchema,\n\tconvertField,\n\ttoUnhydratedSchema,\n\ttype TreeParsingOptions,\n\ttype NodeChangedData,\n} from \"../simple-tree/index.js\";\nimport { brand, extractFromOpaque, type JsonCompatible } from \"../util/index.js\";\nimport {\n\tFluidClientVersion,\n\tnoopValidator,\n\ttype ICodecOptions,\n\ttype CodecWriteOptions,\n} from \"../codec/index.js\";\nimport { EmptyKey, type FieldKey, type ITreeCursorSynchronous } from \"../core/index.js\";\nimport {\n\tcursorForMapTreeField,\n\tdefaultSchemaPolicy,\n\tisTreeValue,\n\tmakeFieldBatchCodec,\n\tmapTreeFromCursor,\n\tTreeCompressionStrategy,\n\ttype FieldBatch,\n\ttype FieldBatchEncodingContext,\n\tfluidVersionToFieldBatchCodecWriteVersion,\n\ttype LocalNodeIdentifier,\n\ttype FlexTreeSequenceField,\n\ttype FlexTreeNode,\n\ttype Observer,\n\twithObservation,\n} from \"../feature-libraries/index.js\";\nimport { independentInitializedView, type ViewContent } from \"./independentView.js\";\nimport { SchematizingSimpleTreeView, ViewSlot } from \"./schematizingTreeView.js\";\n\nconst identifier: TreeIdentifierUtils = (node: TreeNode): string | undefined => {\n\tconst nodeIdentifier = getIdentifierFromNode(node, \"uncompressed\");\n\tif (typeof nodeIdentifier === \"number\") {\n\t\tthrow new TypeError(\"identifier should be uncompressed.\");\n\t}\n\treturn nodeIdentifier;\n};\n\nidentifier.shorten = (branch: TreeBranch, nodeIdentifier: string): number | undefined => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\tconst localNodeKey = nodeKeyManager.tryLocalizeNodeIdentifier(nodeIdentifier);\n\treturn localNodeKey !== undefined ? extractFromOpaque(localNodeKey) : undefined;\n};\n\nidentifier.lengthen = (branch: TreeBranch, nodeIdentifier: number): string => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\treturn nodeKeyManager.stabilizeNodeIdentifier(\n\t\tnodeIdentifier as unknown as LocalNodeIdentifier,\n\t);\n};\n\nidentifier.getShort = (node: TreeNode): number | undefined => {\n\tconst shortIdentifier = getIdentifierFromNode(node, \"compressed\");\n\treturn typeof shortIdentifier === \"number\" ? shortIdentifier : undefined;\n};\n\nidentifier.create = (branch: TreeBranch): string => {\n\tconst nodeKeyManager = (branch as SchematizingSimpleTreeView<ImplicitFieldSchema>)\n\t\t.nodeKeyManager;\n\treturn nodeKeyManager.stabilizeNodeIdentifier(nodeKeyManager.generateLocalNodeIdentifier());\n};\n\nObject.freeze(identifier);\n\n/**\n * A utility interface for retrieving or converting node identifiers.\n *\n * @remarks\n * This provides methods to:\n *\n * - Retrieve long or short identifiers from nodes\n *\n * - Convert between long identifiers and short identifiers\n *\n * - Generates long identifiers\n *\n * @alpha @sealed\n */\nexport interface TreeIdentifierUtils {\n\t/**\n\t * Returns the contents of a node's {@link SchemaFactory.identifier} field as a stable identifier.\n\t * If the identifier field does not exist, returns undefined.\n\t *\n\t * @param node - The TreeNode you want to get the identifier from,\n\t */\n\t(node: TreeNode): string | undefined;\n\n\t/**\n\t * Returns the shortened identifier as a number given long identifier known by the id compressor on the branch if possible.\n\t * Otherwise, it will return the original string identifier provided.\n\t * If the id does not exist, or is unknown by the id compressor, it returns undefined.\n\t *\n\t * This method is the inverse of {@link TreeIdentifierUtils.lengthen}. If you shorten an identifier\n\t * and then immediately pass it to {@link TreeIdentifierUtils.lengthen}, you will get the original string back.\n\t *\n\t * @param branch - TreeBranch from where you get the idCompressor to do the decompression.\n\t * @param nodeIdentifier - the stable identifier that needs to be shortened.\n\t */\n\tshorten(branch: TreeBranch, nodeIdentifier: string): number | undefined;\n\n\t/**\n\t * Returns the stable id as a string if the identifier is decompressible and known by the id compressor. Otherwise, it will throw an error.\n\t *\n\t * This method is the inverse of {@link TreeIdentifierUtils.shorten}. If you lengthen an identifier\n\t * and then immediately pass it to {@link TreeIdentifierUtils.shorten}, you will get the original short identifier back.\n\t *\n\t * @param branch - TreeBranch from where you want to get the id compressor to do the decompression.\n\t * @param nodeIdentifier - The local identifier that needs to be expanded.\n\t */\n\tlengthen(branch: TreeBranch, nodeIdentifier: number): string;\n\n\t/**\n\t * Returns the {@link SchemaFactory.identifier | identifier} of the given node in the most compressed form possible.\n\t * @remarks\n\t * If the node is {@link Unhydrated | hydrated} and its identifier is a valid UUID that was automatically generated by the SharedTree it is part of (or something else using the same {@link @fluidframework/id-compressor#IIdCompressor}), then this will return a process-unique integer corresponding to that identifier.\n\t * This is useful for performance-sensitive scenarios involving many nodes with identifiers that need to be compactly retained in memory or used for efficient lookup.\n\t * Note that automatically generated identifiers that were accessed before the node was hydrated will return the generated UUID, not the process-unique integer.\n\t *\n\t * If the node's identifier is any other user-provided string, then this will return undefined.\n\t *\n\t * If the node has no identifier (that is, it has no {@link SchemaFactory.identifier | identifier} field), then this returns `undefined`.\n\t *\n\t * If the node has more than one identifier, then this will throw an error.\n\t *\n\t * The returned integer should not be serialized or preserved outside of the current process.\n\t * Its lifetime is that of the current in-memory instance of the FF container for this client, and it is not guaranteed to be unique or stable outside of that context.\n\t * The same node's identifier may, for example, be different across multiple sessions for the same client and document, or different across two clients in the same session.\n\t */\n\tgetShort(node: TreeNode): number | undefined;\n\n\t/**\n\t * Creates and returns a long identifier.\n\t * The long identifier is a compressible, stable identifier generated by the tree's ID compressor.\n\t *\n\t * @param branch - TreeBranch from where you want to get the id compressor to generate the identifier from.\n\t */\n\tcreate(branch: TreeBranch): string;\n}\n\n/**\n * Extensions to {@link (Tree:interface)} and {@link (TreeBeta:interface)} which are not yet stable.\n * @remarks\n * Use via the {@link (TreeAlpha:variable)} singleton.\n *\n * The unhydrated node creation APIs in this interface do not support {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}.\n * This is because unknown optional fields still must have a schema: its just that the schema may come from the document's stored schema.\n * Unhydrated nodes created via this interface are not associated with any document, so there is nowhere for them to get schema for unknown optional fields.\n * Note that {@link (TreeBeta:interface).clone} can create an unhydrated node with unknown optional fields, as it uses the source node's stored schema (if any).\n *\n * Export APIs in this interface include {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | unknown optional fields}\n * if they are using {@link KeyEncodingOptions.allStoredKeys}.\n *\n * @privateRemarks\n * TODO:\n * There should be a way to provide a source for defaulted identifiers for unhydrated node creation, either via these APIs or some way to add them to its output later.\n * If an option were added to these APIs, it could also be used to enable unknown optional fields.\n *\n * @system @sealed @alpha\n */\nexport interface TreeAlpha {\n\t/**\n\t * Retrieve the {@link TreeBranch | branch}, if any, for the given node.\n\t * @param node - The node to query\n\t * @remarks If the node has already been inserted into the tree, this will return the branch associated with that node's {@link TreeView | view}.\n\t * Otherwise, it will return `undefined` (because the node has not yet been inserted and is therefore not part of a branch or view).\n\t *\n\t * This does not fork a new branch, but rather retrieves the _existing_ branch for the node.\n\t * To create a new branch, use e.g. {@link TreeBranch.fork | `myBranch.fork()`}.\n\t */\n\tbranch(node: TreeNode): TreeBranch | undefined;\n\n\t/**\n\t * Construct tree content that is compatible with the field defined by the provided `schema`.\n\t * @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.\n\t * @param data - The data used to construct the field content.\n\t * @remarks\n\t * When providing a {@link TreeNodeSchemaClass}, this is the same as invoking its constructor except that an unhydrated node can also be provided.\n\t * This function exists as a generalization that can be used in other cases as well,\n\t * such as when `undefined` might be allowed (for an optional field), or when the type should be inferred from the data when more than one type is possible.\n\t */\n\tcreate<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: InsertableField<TSchema>,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t>;\n\n\t/**\n\t * Less type safe version of {@link (TreeAlpha:interface).create}, suitable for importing data.\n\t * @remarks\n\t * Due to {@link ConciseTree} relying on type inference from the data, its use is somewhat limited.\n\t * This does not support {@link ConciseTree|ConciseTrees} with customized handle encodings or using persisted keys.\n\t * Use \"compressed\" or \"verbose\" formats for more flexibility.\n\t *\n\t * When using this function,\n\t * it is recommend to ensure your schema is unambiguous with {@link ITreeConfigurationOptions.preventAmbiguity}.\n\t * If the schema is ambiguous, consider using {@link (TreeAlpha:interface).create} and {@link Unhydrated} nodes where needed,\n\t * or using {@link (TreeAlpha:interface).(importVerbose:1)} and specify all types.\n\t *\n\t * Documented (and thus recoverable) error handling/reporting for this is not yet implemented,\n\t * but for now most invalid inputs will throw a recoverable error.\n\t */\n\timportConcise<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: ConciseTree | undefined,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t>;\n\n\t/**\n\t * Construct tree content compatible with a field defined by the provided `schema`.\n\t * @param schema - The schema for what to construct. As this is an {@link ImplicitFieldSchema}, a {@link FieldSchema}, {@link TreeNodeSchema} or {@link AllowedTypes} array can be provided.\n\t * @param data - The data used to construct the field content. See {@link (TreeAlpha:interface).(exportVerbose:1)}.\n\t * @remarks\n\t * This currently does not support input containing\n\t * {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields| unknown optional fields} but does support\n\t * {@link SchemaStaticsAlpha.staged | staged} allowed types.\n\t * Non-empty default values for fields are currently not supported (must be provided in the input).\n\t * The content will be validated against the schema and an error will be thrown if out of schema.\n\t */\n\timportVerbose<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tdata: VerboseTree | undefined,\n\t\toptions?: TreeParsingOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a {@link ConciseTree}.\n\t */\n\texportConcise(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): ConciseTree;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a {@link ConciseTree}, allowing undefined.\n\t */\n\texportConcise(\n\t\tnode: TreeNode | TreeLeafValue | undefined,\n\t\toptions?: TreeEncodingOptions,\n\t): ConciseTree | undefined;\n\n\t/**\n\t * Copy a snapshot of the current version of a TreeNode into a JSON compatible plain old JavaScript Object (except for {@link @fluidframework/core-interfaces#IFluidHandle|IFluidHandles}).\n\t * Uses the {@link VerboseTree} format, with an explicit type on every node.\n\t *\n\t * @remarks\n\t * There are several cases this may be preferred to {@link (TreeAlpha:interface).(exportConcise:1)}:\n\t *\n\t * 1. When not using {@link ITreeConfigurationOptions.preventAmbiguity} (or when using `useStableFieldKeys`), `exportConcise` can produce ambiguous data (the type may be unclear on some nodes).\n\t * `exportVerbose` will always be unambiguous and thus lossless.\n\t *\n\t * 2. When the data might be interpreted without access to the exact same view schema. In such cases, the types may be unknowable if not included.\n\t *\n\t * 3. When easy access to the type is desired.\n\t */\n\texportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree;\n\n\t/**\n\t * Export the content of the provided `tree` in a compressed JSON compatible format.\n\t * @remarks\n\t * If an `idCompressor` is provided, it will be used to compress identifiers and thus will be needed to decompress the data.\n\t *\n\t * Always uses \"stored\" keys.\n\t * See {@link KeyEncodingOptions.allStoredKeys} for details.\n\t * @privateRemarks\n\t * TODO: It is currently not clear how to work with the idCompressors correctly in the package API.\n\t * Better APIs should probably be provided as there is currently no way to associate an un-hydrated tree with an idCompressor,\n\t * Nor get the correct idCompressor from a subtree to use when exporting it.\n\t * Additionally using `createIdCompressor` to make an idCompressor is `@legacy` and thus not intended for use in this API surface.\n\t * It would probably make more sense if we provided a way to get an idCompressor from the context of a node,\n\t * which could be optional (and settable if missing) for un0hydrated nodes and required for hydrated ones.\n\t * Add in a stable public API for creating idCompressors, and a way to get them from a tree (without view schema), and that should address the anticipated use-cases.\n\t */\n\texportCompressed(\n\t\ttree: TreeNode | TreeLeafValue,\n\t\toptions: { idCompressor?: IIdCompressor } & Pick<\n\t\t\tCodecWriteOptions,\n\t\t\t\"oldestCompatibleClient\"\n\t\t>,\n\t): JsonCompatible<IFluidHandle>;\n\n\t/**\n\t * Import data encoded by {@link (TreeAlpha:interface).exportCompressed}.\n\t *\n\t * @param schema - Schema with which the data must be compatible. This compatibility is not verified and must be ensured by the caller.\n\t * @param compressedData - Data compressed by {@link (TreeAlpha:interface).exportCompressed}.\n\t * @param options - If {@link (TreeAlpha:interface).exportCompressed} was given an `idCompressor`, it must be provided here.\n\t *\n\t * @remarks\n\t * If the data could have been encoded with a different schema, consider encoding the schema along side it using {@link extractPersistedSchema} and loading the data using {@link independentView}.\n\t *\n\t * @privateRemarks\n\t * This API could be improved:\n\t *\n\t * 1. It could validate that the schema is compatible, and return or throw an error in the invalid case (maybe add a \"try\" version).\n\t *\n\t * 2. A \"try\" version of this could return an error if the data isn't in a supported format (as determined by version and/or JasonValidator).\n\t *\n\t * 3. Requiring the caller provide a JsonValidator isn't the most friendly API. It might be practical to provide a default.\n\t */\n\timportCompressed<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tcompressedData: JsonCompatible<IFluidHandle>,\n\t\toptions: { idCompressor?: IIdCompressor } & ICodecOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\n\t/**\n\t * APIs for creating, converting, and retrieving identifiers.\n\t */\n\treadonly identifier: TreeIdentifierUtils;\n\n\t/**\n\t * The key of the given node under its parent.\n\t * @remarks\n\t * If `node` is an element in a {@link (TreeArrayNode:interface)}, this returns the index of `node` in the array node (a `number`).\n\t * If `node` is the root node, this returns undefined.\n\t * Otherwise, this returns the key of the field that it is under (a `string`).\n\t */\n\tkey2(node: TreeNode): string | number | undefined;\n\n\t/**\n\t * Gets the child of the given node with the given property key if a child exists under that key.\n\t *\n\t * @remarks {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | Unknown optional fields} of Object nodes will not be returned by this method.\n\t *\n\t * @param node - The parent node whose child is being requested.\n\t * @param key - The property key under the node under which the child is being requested.\n\t * For Object nodes, this is the developer-facing \"property key\", not the \"{@link SimpleObjectFieldSchema.storedKey | stored keys}\".\n\t *\n\t * @returns The child node or leaf value under the given key, or `undefined` if no such child exists.\n\t *\n\t * @see {@link (TreeAlpha:interface).key2}\n\t * @see {@link (TreeNodeApi:interface).parent}\n\t */\n\tchild(node: TreeNode, key: string | number): TreeNode | TreeLeafValue | undefined;\n\n\t/**\n\t * Gets the children of the provided node, paired with their property keys under the node.\n\t *\n\t * @remarks\n\t * No guarantees are made regarding the order of the children in the returned array.\n\t *\n\t * Optional properties of Object nodes with no value are not included in the result.\n\t *\n\t * {@link SchemaFactoryObjectOptions.allowUnknownOptionalFields | Unknown optional fields} of Object nodes are not included in the result.\n\t *\n\t * @param node - The node whose children are being requested.\n\t *\n\t * @returns\n\t * An array of pairs of the form `[propertyKey, child]`.\n\t *\n\t * For Array nodes, the `propertyKey` is the index of the child in the array.\n\t *\n\t * For Object nodes, the returned `propertyKey`s are the developer-facing \"property keys\", not the \"{@link SimpleObjectFieldSchema.storedKey | stored keys}\".\n\t *\n\t * @see {@link (TreeAlpha:interface).key2}\n\t * @see {@link (TreeNodeApi:interface).parent}\n\t */\n\tchildren(\n\t\tnode: TreeNode,\n\t): Iterable<[propertyKey: string | number, child: TreeNode | TreeLeafValue]>;\n\n\t/**\n\t * Track observations of any TreeNode content.\n\t * @remarks\n\t * This subscribes to changes to any nodes content observed during `trackDuring`.\n\t *\n\t * Currently this does not support tracking parentage (see {@link (TreeAlpha:interface).trackObservationsOnce} for a version which does):\n\t * if accessing parentage during `trackDuring`, this will throw a usage error.\n\t *\n\t * This also does not track node status changes (e.g. whether a node is attached to a view or not).\n\t * The current behavior of checking status is unspecified: future versions may track it, error, or ignore it.\n\t *\n\t * Even after onInvalidation is called, these subscriptions remain active until `unsubscribe` is called.\n\t * See {@link (TreeAlpha:interface).trackObservationsOnce} for a version which automatically unsubscribes on the first invalidation.\n\t */\n\ttrackObservations<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void };\n\n\t/**\n\t * {@link (TreeAlpha:interface).trackObservations} except automatically unsubscribes when the first invalidation occurs.\n\t * @remarks\n\t * This also supports tracking parentage, unlike {@link (TreeAlpha:interface).trackObservations}, as long as the parent is not undefined.\n\t */\n\ttrackObservationsOnce<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void };\n}\n\n/**\n * Subscription to changes on a single node.\n * @remarks\n * Either tracks some set of fields, or all fields and can be updated to track more fields.\n */\nclass NodeSubscription {\n\t/**\n\t * If undefined, subscribes to all keys.\n\t * Otherwise only subscribes to the keys in the set.\n\t */\n\tprivate keys: Set<FieldKey> | undefined;\n\tprivate readonly unsubscribe: () => void;\n\tprivate constructor(\n\t\tprivate readonly onInvalidation: () => void,\n\t\tflexNode: FlexTreeNode,\n\t) {\n\t\t// TODO:Performance: It is possible to optimize this to not use the public TreeNode API.\n\t\tconst node = getOrCreateNodeFromInnerNode(flexNode);\n\t\tassert(node instanceof TreeNode, \"Unexpected leaf value\");\n\n\t\tconst handler = (data: NodeChangedData): void => {\n\t\t\tif (this.keys === undefined || data.changedProperties === undefined) {\n\t\t\t\tthis.onInvalidation();\n\t\t\t} else {\n\t\t\t\tlet keyMap: ReadonlyMap<FieldKey, string> | undefined;\n\t\t\t\tconst schema = treeNodeApi.schema(node);\n\t\t\t\tif (isObjectNodeSchema(schema)) {\n\t\t\t\t\tkeyMap = schema.storedKeyToPropertyKey;\n\t\t\t\t}\n\t\t\t\t// TODO:Performance: Ideally this would use Set.prototype.isDisjointFrom when available.\n\t\t\t\tfor (const flexKey of this.keys) {\n\t\t\t\t\t// TODO:Performance: doing everything at the flex tree layer could avoid this translation\n\t\t\t\t\tconst key = keyMap?.get(flexKey) ?? flexKey;\n\n\t\t\t\t\tif (data.changedProperties.has(key)) {\n\t\t\t\t\t\tthis.onInvalidation();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tthis.unsubscribe = TreeBeta.on(node, \"nodeChanged\", handler);\n\t}\n\n\t/**\n\t * Create an {@link Observer} which subscribes to what was observed in {@link NodeSubscription}s.\n\t */\n\tpublic static createObserver(\n\t\tinvalidate: () => void,\n\t\tonlyOnce = false,\n\t): { observer: Observer; unsubscribe: () => void } {\n\t\tconst subscriptions = new Map<FlexTreeNode, NodeSubscription>();\n\t\tconst observer: Observer = {\n\t\t\tobserveNodeFields(flexNode: FlexTreeNode): void {\n\t\t\t\tif (flexNode.value !== undefined) {\n\t\t\t\t\t// Leaf value, nothing to observe.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst subscription = subscriptions.get(flexNode);\n\t\t\t\tif (subscription !== undefined) {\n\t\t\t\t\t// Already subscribed to this node.\n\t\t\t\t\tsubscription.keys = undefined; // Now subscribed to all keys.\n\t\t\t\t} else {\n\t\t\t\t\tconst newSubscription = new NodeSubscription(invalidate, flexNode);\n\t\t\t\t\tsubscriptions.set(flexNode, newSubscription);\n\t\t\t\t}\n\t\t\t},\n\t\t\tobserveNodeField(flexNode: FlexTreeNode, key: FieldKey): void {\n\t\t\t\tif (flexNode.value !== undefined) {\n\t\t\t\t\t// Leaf value, nothing to observe.\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst subscription = subscriptions.get(flexNode);\n\t\t\t\tif (subscription !== undefined) {\n\t\t\t\t\t// Already subscribed to this node: if not subscribed to all keys, subscribe to this one.\n\t\t\t\t\t// TODO:Performance: due to how JavaScript set ordering works,\n\t\t\t\t\t// it might be faster to check `has` and only add if not present in case the same field is viewed many times.\n\t\t\t\t\tsubscription.keys?.add(key);\n\t\t\t\t} else {\n\t\t\t\t\tconst newSubscription = new NodeSubscription(invalidate, flexNode);\n\t\t\t\t\tnewSubscription.keys = new Set([key]);\n\t\t\t\t\tsubscriptions.set(flexNode, newSubscription);\n\t\t\t\t}\n\t\t\t},\n\t\t\tobserveParentOf(node: FlexTreeNode): void {\n\t\t\t\t// Supporting parent tracking is more difficult that it might seem at first.\n\t\t\t\t// There are two main complicating factors:\n\t\t\t\t// 1. The parent may be undefined (the node is a root).\n\t\t\t\t// 2. If tracking this by subscribing to the parent's changes, then which events are subscribed to needs to be updated after the parent changes.\n\t\t\t\t//\n\t\t\t\t// If not supporting the first case (undefined parents), the second case gets problematic since it would result in edits which take a node who's parent was observed,\n\t\t\t\t// and un-parent it, could then throw a usage error.\n\n\t\t\t\tif (!onlyOnce) {\n\t\t\t\t\t// TODO: better APIS should be provided which make handling this case practical.\n\t\t\t\t\tthrow new UsageError(\"Observation tracking for parents is currently not supported.\");\n\t\t\t\t}\n\n\t\t\t\tconst parent = withObservation(undefined, () => node.parentField.parent);\n\n\t\t\t\tif (parent.parent === undefined) {\n\t\t\t\t\t// TODO: better APIS should be provided which make handling this case practical.\n\t\t\t\t\tthrow new UsageError(\n\t\t\t\t\t\t\"Observation tracking for parents is currently not supported when parent is undefined.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tobserver.observeNodeField(parent.parent, parent.key);\n\t\t\t},\n\t\t};\n\n\t\tlet subscribed = true;\n\n\t\treturn {\n\t\t\tobserver,\n\t\t\tunsubscribe: () => {\n\t\t\t\tif (!subscribed) {\n\t\t\t\t\tthrow new UsageError(\"Already unsubscribed\");\n\t\t\t\t}\n\t\t\t\tsubscribed = false;\n\t\t\t\tfor (const subscription of subscriptions.values()) {\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n}\n\n/**\n * Handles both {@link (TreeAlpha:interface).trackObservations} and {@link (TreeAlpha:interface).trackObservationsOnce}.\n */\nfunction trackObservations<TResult>(\n\tonInvalidation: () => void,\n\ttrackDuring: () => TResult,\n\tonlyOnce = false,\n): { result: TResult; unsubscribe: () => void } {\n\tlet observing = true;\n\n\tconst invalidate = (): void => {\n\t\tif (observing) {\n\t\t\tthrow new UsageError(\"Cannot invalidate while tracking observations\");\n\t\t}\n\t\tonInvalidation();\n\t};\n\n\tconst { observer, unsubscribe } = NodeSubscription.createObserver(invalidate, onlyOnce);\n\tconst result = withObservation(observer, trackDuring);\n\tobserving = false;\n\n\treturn {\n\t\tresult,\n\t\tunsubscribe,\n\t};\n}\n\n/**\n * Extensions to {@link (Tree:variable)} and {@link (TreeBeta:variable)} which are not yet stable.\n * @see {@link (TreeAlpha:interface)}.\n * @alpha\n */\nexport const TreeAlpha: TreeAlpha = {\n\ttrackObservations<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void } {\n\t\treturn trackObservations(onInvalidation, trackDuring);\n\t},\n\n\ttrackObservationsOnce<TResult>(\n\t\tonInvalidation: () => void,\n\t\ttrackDuring: () => TResult,\n\t): { result: TResult; unsubscribe: () => void } {\n\t\tconst result = trackObservations(\n\t\t\t() => {\n\t\t\t\t// trackObservations ensures no invalidation occurs while its running,\n\t\t\t\t// so this callback can only run after trackObservations has returns and thus result is defined.\n\t\t\t\tresult.unsubscribe();\n\t\t\t\tonInvalidation();\n\t\t\t},\n\t\t\ttrackDuring,\n\t\t\ttrue,\n\t\t);\n\t\treturn result;\n\t},\n\n\tbranch(node: TreeNode): TreeBranch | undefined {\n\t\tconst kernel = getKernel(node);\n\t\tif (!kernel.isHydrated()) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst view = kernel.anchorNode.anchorSet.slots.get(ViewSlot);\n\t\tassert(\n\t\t\tview instanceof SchematizingSimpleTreeView,\n\t\t\t0xa5c /* Unexpected view implementation */,\n\t\t);\n\t\treturn view;\n\t},\n\n\tcreate<const TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: InsertableField<TSchema>,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t> {\n\t\tconst mapTree = unhydratedFlexTreeFromInsertable(\n\t\t\tdata as InsertableField<UnsafeUnknownSchema>,\n\t\t\tschema,\n\t\t);\n\t\tconst result = mapTree === undefined ? undefined : getOrCreateNodeFromInnerNode(mapTree);\n\t\treturn result as Unhydrated<\n\t\t\tTSchema extends ImplicitFieldSchema\n\t\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t\t: TreeNode | TreeLeafValue | undefined\n\t\t>;\n\t},\n\n\timportConcise<TSchema extends ImplicitFieldSchema | UnsafeUnknownSchema>(\n\t\tschema: UnsafeUnknownSchema extends TSchema\n\t\t\t? ImplicitFieldSchema\n\t\t\t: TSchema & ImplicitFieldSchema,\n\t\tdata: ConciseTree | undefined,\n\t): Unhydrated<\n\t\tTSchema extends ImplicitFieldSchema\n\t\t\t? TreeFieldFromImplicitField<TSchema>\n\t\t\t: TreeNode | TreeLeafValue | undefined\n\t> {\n\t\t// `importConcise` does not need to support all the formats that `create` does.\n\t\t// Perhaps it should error instead of hydrating nodes for example.\n\t\t// For now however, it is a simple wrapper around `create`.\n\t\treturn this.create(schema, data as InsertableField<TSchema>);\n\t},\n\n\timportVerbose<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tdata: VerboseTree | undefined,\n\t\toptions?: TreeParsingOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>> {\n\t\tconst config: TreeEncodingOptions = { ...options };\n\t\t// Create a config which is standalone, and thus can be used without having to refer back to the schema.\n\t\tconst schemalessConfig = applySchemaToParserOptions(schema, config);\n\t\tif (data === undefined) {\n\t\t\tconst field = normalizeFieldSchema(schema);\n\t\t\tif (field.kind !== FieldKind.Optional) {\n\t\t\t\tthrow new UsageError(\"undefined provided for non-optional field.\");\n\t\t\t}\n\t\t\treturn undefined as Unhydrated<TreeFieldFromImplicitField<TSchema>>;\n\t\t}\n\t\tconst cursor = cursorFromVerbose(data, schemalessConfig);\n\t\treturn createFromCursor(\n\t\t\tschema,\n\t\t\tcursor,\n\t\t\tconvertField(normalizeFieldSchema(schema), toUnhydratedSchema),\n\t\t);\n\t},\n\n\texportConcise,\n\n\texportVerbose(node: TreeNode | TreeLeafValue, options?: TreeEncodingOptions): VerboseTree {\n\t\tif (isTreeValue(node)) {\n\t\t\treturn node;\n\t\t}\n\t\tconst config: TreeEncodingOptions = { ...options };\n\n\t\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\t\tconst kernel = getKernel(node);\n\t\treturn verboseFromCursor(cursor, kernel.context, config);\n\t},\n\n\texportCompressed(\n\t\tnode: TreeNode | TreeLeafValue,\n\t\toptions: { idCompressor?: IIdCompressor } & Pick<\n\t\t\tCodecWriteOptions,\n\t\t\t\"oldestCompatibleClient\"\n\t\t>,\n\t): JsonCompatible<IFluidHandle> {\n\t\tconst schema = tryGetSchema(node) ?? fail(0xacf /* invalid input */);\n\t\tconst format = fluidVersionToFieldBatchCodecWriteVersion(options.oldestCompatibleClient);\n\t\tconst codec = makeFieldBatchCodec({ jsonValidator: noopValidator }, format);\n\t\tconst cursor = borrowFieldCursorFromTreeNodeOrValue(node);\n\t\tconst batch: FieldBatch = [cursor];\n\t\t// If none provided, create a compressor which will not compress anything.\n\t\tconst idCompressor = options.idCompressor ?? createIdCompressor();\n\n\t\t// Grabbing an existing stored schema from the node is important to ensure that unknown optional fields can be preserved.\n\t\t// Note that if the node is unhydrated, this can result in all staged allowed types being included in the schema, which might be undesired.\n\t\tconst storedSchema = isTreeNode(node)\n\t\t\t? getKernel(node).context.flexContext.schema\n\t\t\t: toInitialSchema(schema);\n\n\t\tconst context: FieldBatchEncodingContext = {\n\t\t\tencodeType: TreeCompressionStrategy.Compressed,\n\t\t\tidCompressor,\n\t\t\toriginatorId: idCompressor.localSessionId, // TODO: Why is this needed?\n\t\t\tschema: { schema: storedSchema, policy: defaultSchemaPolicy },\n\t\t};\n\t\tconst result = codec.encode(batch, context);\n\t\treturn result;\n\t},\n\n\timportCompressed<const TSchema extends ImplicitFieldSchema>(\n\t\tschema: TSchema,\n\t\tcompressedData: JsonCompatible<IFluidHandle>,\n\t\toptions: {\n\t\t\tidCompressor?: IIdCompressor;\n\t\t} & ICodecOptions,\n\t): Unhydrated<TreeFieldFromImplicitField<TSchema>> {\n\t\tconst config = new TreeViewConfigurationAlpha({ schema });\n\t\tconst content: ViewContent = {\n\t\t\t// Always use a v1 schema codec for consistency.\n\t\t\t// TODO: reevaluate how staged schema should behave in schema import/export APIs before stabilizing this.\n\t\t\tschema: extractPersistedSchema(config.schema, FluidClientVersion.v2_0, () => true),\n\t\t\ttree: compressedData,\n\t\t\tidCompressor: options.idCompressor ?? createIdCompressor(),\n\t\t};\n\t\tconst view = independentInitializedView(config, options, content);\n\t\treturn TreeBeta.clone<TSchema>(view.root);\n\t},\n\n\tidentifier,\n\n\tkey2(node: TreeNode): string | number | undefined {\n\t\t// If the parent is undefined, then this node is under the root field,\n\t\tconst parent = treeNodeApi.parent(node);\n\t\tif (parent === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// The flex-domain strictly operates in terms of \"stored keys\".\n\t\t// To find the associated developer-facing \"property key\", we need to look up the field associated with\n\t\t// the stored key from the flex-domain, and get property key its simple-domain counterpart was created with.\n\t\tconst storedKey = getStoredKey(node);\n\t\tconst parentSchema = treeNodeApi.schema(parent);\n\t\treturn getPropertyKeyFromStoredKey(parentSchema, storedKey);\n\t},\n\n\tchild: (\n\t\tnode: TreeNode,\n\t\tpropertyKey: string | number,\n\t): TreeNode | TreeLeafValue | undefined => {\n\t\tconst flexNode = getOrCreateInnerNode(node);\n\t\tdebugAssert(\n\t\t\t() => !flexNode.context.isDisposed() || \"The provided tree node has been disposed.\",\n\t\t);\n\n\t\tconst schema = treeNodeApi.schema(node);\n\n\t\tswitch (schema.kind) {\n\t\t\tcase NodeKind.Array: {\n\t\t\t\tconst sequence = flexNode.tryGetField(EmptyKey) as FlexTreeSequenceField | undefined;\n\n\t\t\t\t// Empty sequence - cannot have children.\n\t\t\t\tif (sequence === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst index =\n\t\t\t\t\ttypeof propertyKey === \"number\"\n\t\t\t\t\t\t? propertyKey\n\t\t\t\t\t\t: asIndex(propertyKey, Number.POSITIVE_INFINITY);\n\n\t\t\t\t// If the key is not a valid index, then there is no corresponding child.\n\t\t\t\tif (index === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\tconst childFlexTree = sequence.at(index);\n\n\t\t\t\t// No child at the given index.\n\t\t\t\tif (childFlexTree === undefined) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\n\t\t\t\treturn getOrCreateNodeFromInnerUnboxedNode(childFlexTree);\n\t\t\t}\n\t\t\tcase NodeKind.Map:\n\t\t\t\tif (typeof propertyKey !== \"string\") {\n\t\t\t\t\t// Map nodes only support string keys.\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t// Fall through\n\t\t\tcase NodeKind.Record:\n\t\t\tcase NodeKind.Object: {\n\t\t\t\tlet storedKey: string | number = propertyKey;\n\t\t\t\tif (isObjectNodeSchema(schema)) {\n\t\t\t\t\tconst fieldSchema = schema.fields.get(String(propertyKey));\n\t\t\t\t\tif (fieldSchema === undefined) {\n\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tstoredKey = fieldSchema.storedKey;\n\t\t\t\t}\n\n\t\t\t\tconst field = flexNode.tryGetField(brand(String(storedKey)));\n\t\t\t\tif (field !== undefined) {\n\t\t\t\t\treturn tryGetTreeNodeForField(field);\n\t\t\t\t}\n\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tcase NodeKind.Leaf: {\n\t\t\t\tfail(0xbc3 /* Leaf schema associated with non-leaf tree node. */);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(schema.kind);\n\t\t\t}\n\t\t}\n\t},\n\n\tchildren(node: TreeNode): [propertyKey: string | number, child: TreeNode | TreeLeafValue][] {\n\t\tconst flexNode = getOrCreateInnerNode(node);\n\t\tdebugAssert(\n\t\t\t() => !flexNode.context.isDisposed() || \"The provided tree node has been disposed.\",\n\t\t);\n\n\t\tconst schema = treeNodeApi.schema(node);\n\n\t\tconst result: [string | number, TreeNode | TreeLeafValue][] = [];\n\t\tswitch (schema.kind) {\n\t\t\tcase NodeKind.Array: {\n\t\t\t\tconst sequence = flexNode.tryGetField(EmptyKey) as FlexTreeSequenceField | undefined;\n\t\t\t\tif (sequence === undefined) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tfor (let index = 0; index < sequence.length; index++) {\n\t\t\t\t\tconst childFlexTree = sequence.at(index);\n\t\t\t\t\tassert(childFlexTree !== undefined, 0xbc4 /* Sequence child was undefined. */);\n\t\t\t\t\tconst childTree = getOrCreateNodeFromInnerUnboxedNode(childFlexTree);\n\t\t\t\t\tresult.push([index, childTree]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Map:\n\t\t\tcase NodeKind.Record: {\n\t\t\t\tfor (const [key, flexField] of flexNode.fields) {\n\t\t\t\t\tconst childTreeNode = tryGetTreeNodeForField(flexField);\n\t\t\t\t\tif (childTreeNode !== undefined) {\n\t\t\t\t\t\tresult.push([key, childTreeNode]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Object: {\n\t\t\t\tassert(isObjectNodeSchema(schema), 0xbc5 /* Expected object schema. */);\n\t\t\t\tfor (const [propertyKey, fieldSchema] of schema.fields) {\n\t\t\t\t\tconst storedKey = fieldSchema.storedKey;\n\t\t\t\t\tconst flexField = flexNode.tryGetField(brand(String(storedKey)));\n\t\t\t\t\tif (flexField !== undefined) {\n\t\t\t\t\t\tconst childTreeNode = tryGetTreeNodeForField(flexField);\n\t\t\t\t\t\tassert(\n\t\t\t\t\t\t\tchildTreeNode !== undefined,\n\t\t\t\t\t\t\t0xbc6 /* Expected child tree node for field. */,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tresult.push([propertyKey, childTreeNode]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase NodeKind.Leaf: {\n\t\t\t\tfail(0xbc7 /* Leaf schema associated with non-leaf tree node. */);\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tunreachableCase(schema.kind);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n};\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue,\n\toptions?: TreeEncodingOptions,\n): ConciseTree;\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue | undefined,\n\toptions?: TreeEncodingOptions,\n): ConciseTree | undefined;\n\nfunction exportConcise(\n\tnode: TreeNode | TreeLeafValue | undefined,\n\toptions?: TreeEncodingOptions,\n): ConciseTree | undefined {\n\tif (!isTreeNode(node)) {\n\t\treturn node;\n\t}\n\tconst config: TreeEncodingOptions = { ...options };\n\n\tconst kernel = getKernel(node);\n\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\treturn conciseFromCursor(cursor, kernel.context, config);\n}\n\n/**\n * Borrow a cursor from a node.\n * @remarks\n * The cursor must be put back to its original location before the node is used again.\n */\nfunction borrowCursorFromTreeNodeOrValue(\n\tnode: TreeNode | TreeLeafValue,\n): ITreeCursorSynchronous {\n\tif (isTreeValue(node)) {\n\t\treturn cursorFromVerbose(node, {});\n\t}\n\tconst kernel = getKernel(node);\n\tconst cursor = kernel.getOrCreateInnerNode().borrowCursor();\n\treturn cursor;\n}\n\n/**\n * Borrow a cursor from a field.\n * @remarks\n * The cursor must be put back to its original location before the node is used again.\n */\nfunction borrowFieldCursorFromTreeNodeOrValue(\n\tnode: TreeNode | TreeLeafValue | undefined,\n): ITreeCursorSynchronous {\n\tif (node === undefined) {\n\t\treturn cursorForMapTreeField([]);\n\t}\n\tconst cursor = borrowCursorFromTreeNodeOrValue(node);\n\t// TODO: avoid copy: borrow cursor from field instead.\n\tconst mapTree = mapTreeFromCursor(cursor);\n\treturn cursorForMapTreeField([mapTree]);\n}\n"]}
@@ -113,6 +113,8 @@ export declare enum TreeStatus {
113
113
  *
114
114
  * @remarks
115
115
  * All editing is actually done via {@link FlexTreeField}s: the nodes are immutable other than that they contain mutable fields.
116
+ *
117
+ * All implementations should track read access in {@link currentObserver}'s observation methods as appropriate.
116
118
  */
117
119
  export interface FlexTreeNode extends FlexTreeEntity, MapTreeNodeViewGeneric<FlexTreeNode> {
118
120
  readonly [flexTreeMarker]: FlexTreeEntityKind.Node;
@@ -1 +1 @@
1
- {"version":3,"file":"flexTreeTypes.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/flexTreeTypes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flexTreeTypes.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/flexTreeTypes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"flexTreeTypes.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/flexTreeTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAON,UAAU,GACV,MAAM,qBAAqB,CAAC;AAiB7B;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,EAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEvD,SAAS,gBAAgB,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,cAAc,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAU;IACxC,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,kBAAkB,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC7B,2DAAI,CAAA;IACJ,6DAAK,CAAA;AACN,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B;AAqCD;;;GAGG;AACH,MAAM,CAAN,IAAY,UA+CX;AA/CD,WAAY,UAAU;IACrB;;OAEG;IACH,uDAAc,CAAA;IAEd;;OAEG;IACH,iDAAW,CAAA;IAEX;;;;;;;;;;;;;;OAcG;IACH,iDAAW,CAAA;IAEX;;;;;;;;;;;;;;;;;OAiBG;IACH,yCAAO,CAAA;AACR,CAAC,EA/CW,UAAU,KAAV,UAAU,QA+CrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\ttype AnchorNode,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NormalizedFieldUpPath,\n\ttype TreeValue,\n\tanchorSlot,\n} from \"../../core/index.js\";\nimport type {\n\tFieldKinds,\n\tSequenceFieldEditBuilder,\n\tValueFieldEditBuilder,\n\tOptionalFieldEditBuilder,\n} from \"../default-schema/index.js\";\nimport type {\n\tMapTreeFieldViewGeneric,\n\tMapTreeNodeViewGeneric,\n\tMinimalFieldMap,\n\tMinimalMapTreeNodeView,\n} from \"../mapTreeCursor.js\";\nimport type { FlexFieldKind } from \"../modular-schema/index.js\";\n\nimport type { FlexTreeContext, FlexTreeHydratedContext } from \"./context.js\";\n\n/**\n * An anchor slot which records the {@link FlexTreeNode} associated with that anchor, if there is one.\n * @remarks This always points to a \"real\" {@link FlexTreeNode} (i.e. a `LazyTreeNode`), never to a \"raw\" node.\n */\nexport const flexTreeSlot = anchorSlot<HydratedFlexTreeNode>();\n\n/**\n * Indicates that an object is a flex tree.\n */\nexport const flexTreeMarker = Symbol(\"flexTreeMarker\");\n\nfunction isFlexTreeEntity(t: unknown): t is FlexTreeEntity {\n\treturn typeof t === \"object\" && t !== null && flexTreeMarker in t;\n}\n\nexport function isFlexTreeNode(t: unknown): t is FlexTreeNode {\n\treturn isFlexTreeEntity(t) && t[flexTreeMarker] === FlexTreeEntityKind.Node;\n}\n\nexport enum FlexTreeEntityKind {\n\tNode,\n\tField,\n}\n\n/**\n * Part of a tree.\n * Iterates over children.\n *\n * @privateRemarks\n * This exists mainly as a place to share common members between nodes and fields.\n * It is not expected to be useful or common to write code which handles this type directly.\n * If this assumption turns out to be false, and generically processing `UntypedEntity`s is useful,\n * then this interface should probably be extended with some down casting functionality (like `is`).\n *\n * TODO:\n * Design and document iterator invalidation rules and ordering rules.\n * Providing a custom iterator type with place anchor semantics would be a good approach.\n */\nexport interface FlexTreeEntity {\n\t/**\n\t * Indicates that an object is a specific kind of flex tree FlexTreeEntity.\n\t * This makes it possible to both down cast FlexTreeEntities safely as well as validate if an object is or is not a FlexTreeEntity.\n\t */\n\treadonly [flexTreeMarker]: FlexTreeEntityKind;\n\n\t/**\n\t * A common context of FlexTrees.\n\t */\n\treadonly context: FlexTreeContext;\n\n\t/**\n\t * Get a cursor for the underlying data.\n\t * @remarks\n\t * This cursor might be one the node uses in its implementation, and thus must be returned to its original location before using any other APIs to interact with the tree.\n\t * Must not be held onto across edits or any other tree API use.\n\t */\n\tborrowCursor(): ITreeCursorSynchronous;\n}\n\n/**\n * Status of the tree that a particular node belongs to.\n * @public\n */\nexport enum TreeStatus {\n\t/**\n\t * Is parented under the root field.\n\t */\n\tInDocument = 0,\n\n\t/**\n\t * Is not parented under the root field, but can be added back to the original document tree.\n\t */\n\tRemoved = 1,\n\n\t/**\n\t * Is removed and cannot be added back to the original document tree.\n\t * @remarks\n\t * Nodes can enter this state for multiple reasons:\n\t * - The node was removed and nothing (e.g. undo/redo history) kept it from being cleaned up.\n\t * - The {@link TreeView} was disposed or had a schema change which made the tree incompatible.\n\t *\n\t * Deleted nodes' contents should not be observed or edited. This includes functionality exposed via {@link (Tree:variable)},\n\t * with the exception of {@link TreeNodeApi.status}.\n\t *\n\t * @privateRemarks\n\t * There was planned work (AB#17948) to make the first reason a node could become \"Deleted\" impossible,\n\t * at least as an opt in feature,\n\t * by lifetime extending all nodes which are still possible to reach automatically.\n\t */\n\tDeleted = 2,\n\n\t/**\n\t * Is created but has not yet been inserted into the tree.\n\t * @remarks\n\t * See also {@link Unhydrated}.\n\t *\n\t * Nodes in the new state have some limitations:\n\t *\n\t * - Events are not currently triggered for changes. Fixes for this are planned.\n\t *\n\t * - Reading identifiers from nodes which were left unspecified (defaulted) when creating the tree will error.\n\t * This is because allocating unique identifiers in a compressible manner requires knowing which tree the nodes will be inserted into.\n\t *\n\t * - Transactions do not work: transactions apply to a single {@link TreeView}, and `New` nodes are not part of one.\n\t *\n\t * - Automatically generated {@link SchemaFactory.identifier | identifiers} will be less compressible if read.\n\t *\n\t * - {@link TreeIdentifierUtils.getShort} and {@link TreeNodeApi.shortId | Tree.shortId} cannot return their short identifiers.\n\t */\n\tNew = 3,\n}\n\n/**\n * Generic tree node API.\n *\n * Nodes are (shallowly) immutable and have a logical identity, a type and either a value or fields under string keys.\n *\n * This \"logical identity\" is exposed as the object identity: if a node is moved within a document,\n * the same {@link FlexTreeNode} instance will be used in the new location.\n * Similarly, edits applied to a node's sub-tree concurrently with the move of the node will still be applied to its subtree in its new location.\n *\n * @remarks\n * All editing is actually done via {@link FlexTreeField}s: the nodes are immutable other than that they contain mutable fields.\n */\nexport interface FlexTreeNode extends FlexTreeEntity, MapTreeNodeViewGeneric<FlexTreeNode> {\n\treadonly [flexTreeMarker]: FlexTreeEntityKind.Node;\n\n\t/**\n\t * Gets a field of this node, if it is not empty.\n\t */\n\ttryGetField(key: FieldKey): undefined | FlexTreeField;\n\n\t/**\n\t * Get the field for `key`.\n\t * @param key - which entry to look up.\n\t *\n\t * @remarks\n\t * All fields implicitly exist, so `getBoxed` can be called with any key and will always return a field.\n\t * Even if the field is empty, it will still be returned, and can be edited to insert content if allowed by the field kind.\n\t * See {@link FlexTreeNode.tryGetField} for a variant that does not allocate a field in the empty case.\n\t */\n\tgetBoxed(key: FieldKey): FlexTreeField;\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks\n\t * The behavior of this at the root (especially removed and unhydrated roots) is currently not very consistent.\n\t * Since very little relies on this, limit what it exposes to reduce the potential impact of inconsistent root handling.\n\t */\n\treadonly parentField: {\n\t\treadonly parent: Pick<FlexTreeField, \"parent\" | \"schema\" | \"key\">;\n\t\treadonly index: number;\n\t};\n\n\t/**\n\t * The non-empty fields on this node.\n\t */\n\treadonly fields: MinimalFieldMap<FlexTreeField>;\n\n\t/**\n\t * The non-empty fields on this node.\n\t */\n\t[Symbol.iterator](): IterableIterator<FlexTreeField>;\n\n\t/**\n\t * Returns an iterable of keys for non-empty fields.\n\t *\n\t * @remarks\n\t * All fields under a map implicitly exist, but `keys` will yield only the keys of fields which contain one or more nodes.\n\t *\n\t * No guarantees are made regarding the order of the keys returned.\n\t */\n\tkeys(): IterableIterator<FieldKey>;\n\n\t/**\n\t * If true, this node is a {@link HydratedFlexTreeNode}.\n\t *\n\t * If false, this node is unhydrated.\n\t */\n\tisHydrated(): this is HydratedFlexTreeNode;\n}\n\n/**\n * A FlexTreeNode that is hydrated, meaning it is associated with a {@link FlexTreeHydratedContext}.\n */\nexport interface HydratedFlexTreeNode extends FlexTreeNode {\n\t/**\n\t * {@inheritDoc FlexTreeNode.context}\n\t */\n\treadonly context: FlexTreeHydratedContext;\n\n\t/**\n\t * The anchor node associated with this node\n\t *\n\t * @remarks\n\t * The ref count keeping this alive is owned by the FlexTreeNode:\n\t * if holding onto this anchor for longer than the FlexTreeNode might be alive,\n\t * a separate Anchor (and thus ref count) must be allocated to keep it alive.\n\t */\n\treadonly anchorNode: AnchorNode;\n}\n\n/**\n * A collaboratively editable collection of nodes within a {@link FlexTreeEntity}.\n *\n * Fields are inherently part of their parent, and thus cannot be moved.\n * Instead their content can be moved, deleted or created.\n *\n * Editing operations are only valid on trees with the {@link TreeStatus#InDocument} `TreeStatus`.\n *\n * @remarks\n * Fields are used wherever an editable collection of nodes is required.\n * This is required in two places:\n * 1. To hold the children of non-leaf {@link FlexTreeNode}s.\n * 2. As the root of a {@link FlexTreeEntity}.\n *\n * Down-casting (via {@link FlexTreeField.is}) is required to access Schema-Aware APIs, including editing.\n * All content in the tree is accessible without down-casting, but if the schema is known,\n * the schema aware API may be more ergonomic.\n */\nexport interface FlexTreeField extends FlexTreeEntity, MapTreeFieldViewGeneric<FlexTreeNode> {\n\treadonly [flexTreeMarker]: FlexTreeEntityKind.Field;\n\n\t/**\n\t * The number of nodes in this field\n\t */\n\treadonly length: number;\n\n\t/**\n\t * The `FieldKey` this field is under.\n\t * Defines what part of its parent this field makes up.\n\t */\n\treadonly key: FieldKey;\n\n\t/**\n\t * The node which has this field on it under `fieldKey`.\n\t * `undefined` iff this field is a detached field.\n\t */\n\treadonly parent?: FlexTreeNode;\n\n\t/**\n\t * Type guard for narrowing / down-casting to a specific schema.\n\t */\n\tis<TKind extends FlexFieldKind>(kind: TKind): this is FlexTreeTypedField<TKind>;\n\n\t/**\n\t * Gets a node of this field by its index without unboxing.\n\t * @param index - Zero-based index of the item to retrieve. Negative values are interpreted from the end of the sequence.\n\t *\n\t * @returns The element in the sequence matching the given index. Always returns undefined if index \\< -sequence.length\n\t * or index \\>= sequence.length.\n\t *\n\t * @remarks\n\t * Semantics match {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at | Array.at}.\n\t */\n\tboxedAt(index: number): FlexTreeNode | undefined;\n\n\t/**\n\t * Gets the FieldUpPath of a field.\n\t */\n\tgetFieldPath(): NormalizedFieldUpPath;\n\n\t/**\n\t * Schema for this entity.\n\t * If well-formed, it must follow this schema.\n\t */\n\treadonly schema: FieldKindIdentifier;\n}\n\n// #region Field Kinds\n\n/**\n * Typed tree for inserting as the content of a field.\n */\nexport type FlexibleFieldContent = readonly FlexibleNodeContent[];\n\n/**\n * Tree for inserting as a node.\n */\nexport type FlexibleNodeContent = MinimalMapTreeNodeView;\n\n/**\n * {@link FlexTreeField} that stores a sequence of children.\n *\n * Sequence fields can contain an ordered sequence any number of {@link FlexTreeNode}s which must be of the {@link FlexAllowedTypes} from the {@link FlexFieldSchema}).\n *\n * @remarks\n * Allows for concurrent editing based on index, adjusting the locations of indexes as needed so they apply to the same logical place in the sequence when rebased and merged.\n *\n * Edits to sequence fields are anchored relative to their surroundings, so concurrent edits can result in the indexes of nodes and edits getting shifted.\n * To hold onto locations in sequence across an edit, use anchors.\n *\n * @privateRemarks\n * TODO:\n * Add anchor API that can actually hold onto locations in a sequence.\n * Currently only nodes can be held onto with anchors, and this does not replicate the behavior implemented for editing.\n */\nexport interface FlexTreeSequenceField extends FlexTreeField {\n\t/**\n\t * Gets a node of this field by its index with unboxing.\n\t * @param index - Zero-based index of the item to retrieve. Negative values are interpreted from the end of the sequence.\n\t *\n\t * @returns The element in the sequence matching the given index. Always returns undefined if index \\< -sequence.length\n\t * or index \\>= array.length.\n\t *\n\t * @remarks\n\t * Semantics match {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at | Array.at}.\n\t */\n\tat(index: number): FlexTreeUnknownUnboxed | undefined;\n\n\t/**\n\t * {@inheritdoc FlexTreeField.boxedAt}\n\t */\n\tboxedAt(index: number): FlexTreeNode | undefined;\n\n\t/**\n\t * Calls the provided callback function on each child of this sequence, and returns an array that contains the results.\n\t * @param callbackfn - A function that accepts the child and its index.\n\t */\n\tmap<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[];\n\n\t/**\n\t * Get an editor for this sequence.\n\t */\n\treadonly editor: SequenceFieldEditBuilder<FlexibleFieldContent>;\n}\n\n/**\n * Field that stores exactly one child.\n *\n * @remarks\n * Unboxes its content, so in schema aware APIs which do unboxing, the RequiredField itself will be skipped over and its content will be returned directly.\n */\nexport interface FlexTreeRequiredField extends FlexTreeField {\n\tget content(): FlexTreeUnknownUnboxed;\n\n\treadonly editor: ValueFieldEditBuilder<FlexibleNodeContent>;\n}\n\n/**\n * Field that stores zero or one child.\n *\n * @remarks\n * Unboxes its content, so in schema aware APIs which do unboxing, the OptionalField itself will be skipped over and its content will be returned directly.\n *\n * @privateRemarks\n * TODO: Document merge semitics\n * TODO: Allow Optional fields to be used with last write wins OR first write wins merge resolution.\n * TODO:\n * Better centralize the documentation about what kinds of merge semantics are available for field kinds.\n * Maybe link editor?\n */\nexport interface FlexTreeOptionalField extends FlexTreeField {\n\tget content(): FlexTreeUnknownUnboxed | undefined;\n\n\treadonly editor: OptionalFieldEditBuilder<FlexibleNodeContent>;\n}\n\n// #endregion\n\n// #region Typed\n\n/**\n * Schema aware specialization of {@link FlexTreeField}.\n */\nexport type FlexTreeTypedField<Kind extends FlexFieldKind> =\n\tKind extends typeof FieldKinds.sequence\n\t\t? FlexTreeSequenceField\n\t\t: Kind extends typeof FieldKinds.required\n\t\t\t? FlexTreeRequiredField\n\t\t\t: Kind extends typeof FieldKinds.optional\n\t\t\t\t? FlexTreeOptionalField\n\t\t\t\t: FlexTreeField;\n\n// #endregion\n\n/**\n * Unboxed tree type for unknown schema cases.\n */\nexport type FlexTreeUnknownUnboxed = TreeValue | FlexTreeNode;\n"]}
1
+ {"version":3,"file":"flexTreeTypes.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/flexTreeTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAON,UAAU,GACV,MAAM,qBAAqB,CAAC;AAiB7B;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,UAAU,EAAwB,CAAC;AAE/D;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEvD,SAAS,gBAAgB,CAAC,CAAU;IACnC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,cAAc,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAU;IACxC,OAAO,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,KAAK,kBAAkB,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,MAAM,CAAN,IAAY,kBAGX;AAHD,WAAY,kBAAkB;IAC7B,2DAAI,CAAA;IACJ,6DAAK,CAAA;AACN,CAAC,EAHW,kBAAkB,KAAlB,kBAAkB,QAG7B;AAqCD;;;GAGG;AACH,MAAM,CAAN,IAAY,UA+CX;AA/CD,WAAY,UAAU;IACrB;;OAEG;IACH,uDAAc,CAAA;IAEd;;OAEG;IACH,iDAAW,CAAA;IAEX;;;;;;;;;;;;;;OAcG;IACH,iDAAW,CAAA;IAEX;;;;;;;;;;;;;;;;;OAiBG;IACH,yCAAO,CAAA;AACR,CAAC,EA/CW,UAAU,KAAV,UAAU,QA+CrB","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n\ttype AnchorNode,\n\ttype FieldKey,\n\ttype FieldKindIdentifier,\n\ttype ITreeCursorSynchronous,\n\ttype NormalizedFieldUpPath,\n\ttype TreeValue,\n\tanchorSlot,\n} from \"../../core/index.js\";\nimport type {\n\tFieldKinds,\n\tSequenceFieldEditBuilder,\n\tValueFieldEditBuilder,\n\tOptionalFieldEditBuilder,\n} from \"../default-schema/index.js\";\nimport type {\n\tMapTreeFieldViewGeneric,\n\tMapTreeNodeViewGeneric,\n\tMinimalFieldMap,\n\tMinimalMapTreeNodeView,\n} from \"../mapTreeCursor.js\";\nimport type { FlexFieldKind } from \"../modular-schema/index.js\";\n\nimport type { FlexTreeContext, FlexTreeHydratedContext } from \"./context.js\";\n\n/**\n * An anchor slot which records the {@link FlexTreeNode} associated with that anchor, if there is one.\n * @remarks This always points to a \"real\" {@link FlexTreeNode} (i.e. a `LazyTreeNode`), never to a \"raw\" node.\n */\nexport const flexTreeSlot = anchorSlot<HydratedFlexTreeNode>();\n\n/**\n * Indicates that an object is a flex tree.\n */\nexport const flexTreeMarker = Symbol(\"flexTreeMarker\");\n\nfunction isFlexTreeEntity(t: unknown): t is FlexTreeEntity {\n\treturn typeof t === \"object\" && t !== null && flexTreeMarker in t;\n}\n\nexport function isFlexTreeNode(t: unknown): t is FlexTreeNode {\n\treturn isFlexTreeEntity(t) && t[flexTreeMarker] === FlexTreeEntityKind.Node;\n}\n\nexport enum FlexTreeEntityKind {\n\tNode,\n\tField,\n}\n\n/**\n * Part of a tree.\n * Iterates over children.\n *\n * @privateRemarks\n * This exists mainly as a place to share common members between nodes and fields.\n * It is not expected to be useful or common to write code which handles this type directly.\n * If this assumption turns out to be false, and generically processing `UntypedEntity`s is useful,\n * then this interface should probably be extended with some down casting functionality (like `is`).\n *\n * TODO:\n * Design and document iterator invalidation rules and ordering rules.\n * Providing a custom iterator type with place anchor semantics would be a good approach.\n */\nexport interface FlexTreeEntity {\n\t/**\n\t * Indicates that an object is a specific kind of flex tree FlexTreeEntity.\n\t * This makes it possible to both down cast FlexTreeEntities safely as well as validate if an object is or is not a FlexTreeEntity.\n\t */\n\treadonly [flexTreeMarker]: FlexTreeEntityKind;\n\n\t/**\n\t * A common context of FlexTrees.\n\t */\n\treadonly context: FlexTreeContext;\n\n\t/**\n\t * Get a cursor for the underlying data.\n\t * @remarks\n\t * This cursor might be one the node uses in its implementation, and thus must be returned to its original location before using any other APIs to interact with the tree.\n\t * Must not be held onto across edits or any other tree API use.\n\t */\n\tborrowCursor(): ITreeCursorSynchronous;\n}\n\n/**\n * Status of the tree that a particular node belongs to.\n * @public\n */\nexport enum TreeStatus {\n\t/**\n\t * Is parented under the root field.\n\t */\n\tInDocument = 0,\n\n\t/**\n\t * Is not parented under the root field, but can be added back to the original document tree.\n\t */\n\tRemoved = 1,\n\n\t/**\n\t * Is removed and cannot be added back to the original document tree.\n\t * @remarks\n\t * Nodes can enter this state for multiple reasons:\n\t * - The node was removed and nothing (e.g. undo/redo history) kept it from being cleaned up.\n\t * - The {@link TreeView} was disposed or had a schema change which made the tree incompatible.\n\t *\n\t * Deleted nodes' contents should not be observed or edited. This includes functionality exposed via {@link (Tree:variable)},\n\t * with the exception of {@link TreeNodeApi.status}.\n\t *\n\t * @privateRemarks\n\t * There was planned work (AB#17948) to make the first reason a node could become \"Deleted\" impossible,\n\t * at least as an opt in feature,\n\t * by lifetime extending all nodes which are still possible to reach automatically.\n\t */\n\tDeleted = 2,\n\n\t/**\n\t * Is created but has not yet been inserted into the tree.\n\t * @remarks\n\t * See also {@link Unhydrated}.\n\t *\n\t * Nodes in the new state have some limitations:\n\t *\n\t * - Events are not currently triggered for changes. Fixes for this are planned.\n\t *\n\t * - Reading identifiers from nodes which were left unspecified (defaulted) when creating the tree will error.\n\t * This is because allocating unique identifiers in a compressible manner requires knowing which tree the nodes will be inserted into.\n\t *\n\t * - Transactions do not work: transactions apply to a single {@link TreeView}, and `New` nodes are not part of one.\n\t *\n\t * - Automatically generated {@link SchemaFactory.identifier | identifiers} will be less compressible if read.\n\t *\n\t * - {@link TreeIdentifierUtils.getShort} and {@link TreeNodeApi.shortId | Tree.shortId} cannot return their short identifiers.\n\t */\n\tNew = 3,\n}\n\n/**\n * Generic tree node API.\n *\n * Nodes are (shallowly) immutable and have a logical identity, a type and either a value or fields under string keys.\n *\n * This \"logical identity\" is exposed as the object identity: if a node is moved within a document,\n * the same {@link FlexTreeNode} instance will be used in the new location.\n * Similarly, edits applied to a node's sub-tree concurrently with the move of the node will still be applied to its subtree in its new location.\n *\n * @remarks\n * All editing is actually done via {@link FlexTreeField}s: the nodes are immutable other than that they contain mutable fields.\n *\n * All implementations should track read access in {@link currentObserver}'s observation methods as appropriate.\n */\nexport interface FlexTreeNode extends FlexTreeEntity, MapTreeNodeViewGeneric<FlexTreeNode> {\n\treadonly [flexTreeMarker]: FlexTreeEntityKind.Node;\n\n\t/**\n\t * Gets a field of this node, if it is not empty.\n\t */\n\ttryGetField(key: FieldKey): undefined | FlexTreeField;\n\n\t/**\n\t * Get the field for `key`.\n\t * @param key - which entry to look up.\n\t *\n\t * @remarks\n\t * All fields implicitly exist, so `getBoxed` can be called with any key and will always return a field.\n\t * Even if the field is empty, it will still be returned, and can be edited to insert content if allowed by the field kind.\n\t * See {@link FlexTreeNode.tryGetField} for a variant that does not allocate a field in the empty case.\n\t */\n\tgetBoxed(key: FieldKey): FlexTreeField;\n\n\t/**\n\t * The field this tree is in, and the index within that field.\n\t * @remarks\n\t * The behavior of this at the root (especially removed and unhydrated roots) is currently not very consistent.\n\t * Since very little relies on this, limit what it exposes to reduce the potential impact of inconsistent root handling.\n\t */\n\treadonly parentField: {\n\t\treadonly parent: Pick<FlexTreeField, \"parent\" | \"schema\" | \"key\">;\n\t\treadonly index: number;\n\t};\n\n\t/**\n\t * The non-empty fields on this node.\n\t */\n\treadonly fields: MinimalFieldMap<FlexTreeField>;\n\n\t/**\n\t * The non-empty fields on this node.\n\t */\n\t[Symbol.iterator](): IterableIterator<FlexTreeField>;\n\n\t/**\n\t * Returns an iterable of keys for non-empty fields.\n\t *\n\t * @remarks\n\t * All fields under a map implicitly exist, but `keys` will yield only the keys of fields which contain one or more nodes.\n\t *\n\t * No guarantees are made regarding the order of the keys returned.\n\t */\n\tkeys(): IterableIterator<FieldKey>;\n\n\t/**\n\t * If true, this node is a {@link HydratedFlexTreeNode}.\n\t *\n\t * If false, this node is unhydrated.\n\t */\n\tisHydrated(): this is HydratedFlexTreeNode;\n}\n\n/**\n * A FlexTreeNode that is hydrated, meaning it is associated with a {@link FlexTreeHydratedContext}.\n */\nexport interface HydratedFlexTreeNode extends FlexTreeNode {\n\t/**\n\t * {@inheritDoc FlexTreeNode.context}\n\t */\n\treadonly context: FlexTreeHydratedContext;\n\n\t/**\n\t * The anchor node associated with this node\n\t *\n\t * @remarks\n\t * The ref count keeping this alive is owned by the FlexTreeNode:\n\t * if holding onto this anchor for longer than the FlexTreeNode might be alive,\n\t * a separate Anchor (and thus ref count) must be allocated to keep it alive.\n\t */\n\treadonly anchorNode: AnchorNode;\n}\n\n/**\n * A collaboratively editable collection of nodes within a {@link FlexTreeEntity}.\n *\n * Fields are inherently part of their parent, and thus cannot be moved.\n * Instead their content can be moved, deleted or created.\n *\n * Editing operations are only valid on trees with the {@link TreeStatus#InDocument} `TreeStatus`.\n *\n * @remarks\n * Fields are used wherever an editable collection of nodes is required.\n * This is required in two places:\n * 1. To hold the children of non-leaf {@link FlexTreeNode}s.\n * 2. As the root of a {@link FlexTreeEntity}.\n *\n * Down-casting (via {@link FlexTreeField.is}) is required to access Schema-Aware APIs, including editing.\n * All content in the tree is accessible without down-casting, but if the schema is known,\n * the schema aware API may be more ergonomic.\n */\nexport interface FlexTreeField extends FlexTreeEntity, MapTreeFieldViewGeneric<FlexTreeNode> {\n\treadonly [flexTreeMarker]: FlexTreeEntityKind.Field;\n\n\t/**\n\t * The number of nodes in this field\n\t */\n\treadonly length: number;\n\n\t/**\n\t * The `FieldKey` this field is under.\n\t * Defines what part of its parent this field makes up.\n\t */\n\treadonly key: FieldKey;\n\n\t/**\n\t * The node which has this field on it under `fieldKey`.\n\t * `undefined` iff this field is a detached field.\n\t */\n\treadonly parent?: FlexTreeNode;\n\n\t/**\n\t * Type guard for narrowing / down-casting to a specific schema.\n\t */\n\tis<TKind extends FlexFieldKind>(kind: TKind): this is FlexTreeTypedField<TKind>;\n\n\t/**\n\t * Gets a node of this field by its index without unboxing.\n\t * @param index - Zero-based index of the item to retrieve. Negative values are interpreted from the end of the sequence.\n\t *\n\t * @returns The element in the sequence matching the given index. Always returns undefined if index \\< -sequence.length\n\t * or index \\>= sequence.length.\n\t *\n\t * @remarks\n\t * Semantics match {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at | Array.at}.\n\t */\n\tboxedAt(index: number): FlexTreeNode | undefined;\n\n\t/**\n\t * Gets the FieldUpPath of a field.\n\t */\n\tgetFieldPath(): NormalizedFieldUpPath;\n\n\t/**\n\t * Schema for this entity.\n\t * If well-formed, it must follow this schema.\n\t */\n\treadonly schema: FieldKindIdentifier;\n}\n\n// #region Field Kinds\n\n/**\n * Typed tree for inserting as the content of a field.\n */\nexport type FlexibleFieldContent = readonly FlexibleNodeContent[];\n\n/**\n * Tree for inserting as a node.\n */\nexport type FlexibleNodeContent = MinimalMapTreeNodeView;\n\n/**\n * {@link FlexTreeField} that stores a sequence of children.\n *\n * Sequence fields can contain an ordered sequence any number of {@link FlexTreeNode}s which must be of the {@link FlexAllowedTypes} from the {@link FlexFieldSchema}).\n *\n * @remarks\n * Allows for concurrent editing based on index, adjusting the locations of indexes as needed so they apply to the same logical place in the sequence when rebased and merged.\n *\n * Edits to sequence fields are anchored relative to their surroundings, so concurrent edits can result in the indexes of nodes and edits getting shifted.\n * To hold onto locations in sequence across an edit, use anchors.\n *\n * @privateRemarks\n * TODO:\n * Add anchor API that can actually hold onto locations in a sequence.\n * Currently only nodes can be held onto with anchors, and this does not replicate the behavior implemented for editing.\n */\nexport interface FlexTreeSequenceField extends FlexTreeField {\n\t/**\n\t * Gets a node of this field by its index with unboxing.\n\t * @param index - Zero-based index of the item to retrieve. Negative values are interpreted from the end of the sequence.\n\t *\n\t * @returns The element in the sequence matching the given index. Always returns undefined if index \\< -sequence.length\n\t * or index \\>= array.length.\n\t *\n\t * @remarks\n\t * Semantics match {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at | Array.at}.\n\t */\n\tat(index: number): FlexTreeUnknownUnboxed | undefined;\n\n\t/**\n\t * {@inheritdoc FlexTreeField.boxedAt}\n\t */\n\tboxedAt(index: number): FlexTreeNode | undefined;\n\n\t/**\n\t * Calls the provided callback function on each child of this sequence, and returns an array that contains the results.\n\t * @param callbackfn - A function that accepts the child and its index.\n\t */\n\tmap<U>(callbackfn: (value: FlexTreeUnknownUnboxed, index: number) => U): U[];\n\n\t/**\n\t * Get an editor for this sequence.\n\t */\n\treadonly editor: SequenceFieldEditBuilder<FlexibleFieldContent>;\n}\n\n/**\n * Field that stores exactly one child.\n *\n * @remarks\n * Unboxes its content, so in schema aware APIs which do unboxing, the RequiredField itself will be skipped over and its content will be returned directly.\n */\nexport interface FlexTreeRequiredField extends FlexTreeField {\n\tget content(): FlexTreeUnknownUnboxed;\n\n\treadonly editor: ValueFieldEditBuilder<FlexibleNodeContent>;\n}\n\n/**\n * Field that stores zero or one child.\n *\n * @remarks\n * Unboxes its content, so in schema aware APIs which do unboxing, the OptionalField itself will be skipped over and its content will be returned directly.\n *\n * @privateRemarks\n * TODO: Document merge semitics\n * TODO: Allow Optional fields to be used with last write wins OR first write wins merge resolution.\n * TODO:\n * Better centralize the documentation about what kinds of merge semantics are available for field kinds.\n * Maybe link editor?\n */\nexport interface FlexTreeOptionalField extends FlexTreeField {\n\tget content(): FlexTreeUnknownUnboxed | undefined;\n\n\treadonly editor: OptionalFieldEditBuilder<FlexibleNodeContent>;\n}\n\n// #endregion\n\n// #region Typed\n\n/**\n * Schema aware specialization of {@link FlexTreeField}.\n */\nexport type FlexTreeTypedField<Kind extends FlexFieldKind> =\n\tKind extends typeof FieldKinds.sequence\n\t\t? FlexTreeSequenceField\n\t\t: Kind extends typeof FieldKinds.required\n\t\t\t? FlexTreeRequiredField\n\t\t\t: Kind extends typeof FieldKinds.optional\n\t\t\t\t? FlexTreeOptionalField\n\t\t\t\t: FlexTreeField;\n\n// #endregion\n\n/**\n * Unboxed tree type for unknown schema cases.\n */\nexport type FlexTreeUnknownUnboxed = TreeValue | FlexTreeNode;\n"]}
@@ -4,6 +4,11 @@
4
4
  */
5
5
  import type { FlexTreeNode } from "./flexTreeTypes.js";
6
6
  import type { FieldKey } from "../../core/index.js";
7
+ /**
8
+ * An object informed about observation made to trees.
9
+ * @remarks
10
+ * See {@link withObservation} and {@link currentObserver}.
11
+ */
7
12
  export interface Observer {
8
13
  observeNodeFields(node: FlexTreeNode): void;
9
14
  observeNodeField(node: FlexTreeNode, key: FieldKey): void;
@@ -15,5 +20,8 @@ export interface Observer {
15
20
  * Set via {@link setObserver} as used by {@link withObservation}.
16
21
  */
17
22
  export declare let currentObserver: Observer | undefined;
23
+ /**
24
+ * For the duration of `f`, pushes `newObserver` onto the observer stack, making it the {@link currentObserver}.
25
+ */
18
26
  export declare function withObservation<T>(newObserver: Observer | undefined, f: () => T): T;
19
27
  //# sourceMappingURL=observer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACxB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1D,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C;AACD;;;;GAIG;AAEH,eAAO,IAAI,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC;AAajD,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAOnF"}
1
+ {"version":3,"file":"observer.d.ts","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AASpD;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACxB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1D,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C;AACD;;;;GAIG;AACH,eAAO,IAAI,eAAe,EAAE,QAAQ,GAAG,SAAS,CAAC;AAgBjD;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAOnF"}
@@ -20,6 +20,9 @@ function clearObserver() {
20
20
  debugAssert(() => popped === currentObserver || "Mismatched observer stack");
21
21
  currentObserver = observerStack[observerStack.length - 1];
22
22
  }
23
+ /**
24
+ * For the duration of `f`, pushes `newObserver` onto the observer stack, making it the {@link currentObserver}.
25
+ */
23
26
  export function withObservation(newObserver, f) {
24
27
  setObserver(newObserver);
25
28
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AASlE;;;;GAIG;AAEH,MAAM,CAAC,IAAI,eAAqC,CAAC;AACjD,MAAM,aAAa,GAA6B,EAAE,CAAC;AACnD,SAAS,WAAW,CAAC,WAAiC;IACrD,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,eAAe,GAAG,WAAW,CAAC;AAC/B,CAAC;AACD,SAAS,aAAa;IACrB,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IACnC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,eAAe,IAAI,2BAA2B,CAAC,CAAC;IAC7E,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAI,WAAiC,EAAE,CAAU;IAC/E,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC;QACJ,OAAO,CAAC,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACV,aAAa,EAAE,CAAC;IACjB,CAAC;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { debugAssert } from \"@fluidframework/core-utils/internal\";\nimport type { FlexTreeNode } from \"./flexTreeTypes.js\";\nimport type { FieldKey } from \"../../core/index.js\";\n\nexport interface Observer {\n\tobserveNodeFields(node: FlexTreeNode): void;\n\tobserveNodeField(node: FlexTreeNode, key: FieldKey): void;\n\tobserveParentOf(node: FlexTreeNode): void;\n}\n/**\n * The current observer, if any.\n * @remarks\n * Set via {@link setObserver} as used by {@link withObservation}.\n */\n\nexport let currentObserver: Observer | undefined;\nconst observerStack: (Observer | undefined)[] = [];\nfunction setObserver(newObserver: Observer | undefined): void {\n\tobserverStack.push(newObserver);\n\tcurrentObserver = newObserver;\n}\nfunction clearObserver(): void {\n\tdebugAssert(() => observerStack.length > 0 || \"Empty Observer stack on clear\");\n\tconst popped = observerStack.pop();\n\tdebugAssert(() => popped === currentObserver || \"Mismatched observer stack\");\n\tcurrentObserver = observerStack[observerStack.length - 1];\n}\n\nexport function withObservation<T>(newObserver: Observer | undefined, f: () => T): T {\n\tsetObserver(newObserver);\n\ttry {\n\t\treturn f();\n\t} finally {\n\t\tclearObserver();\n\t}\n}\n"]}
1
+ {"version":3,"file":"observer.js","sourceRoot":"","sources":["../../../src/feature-libraries/flex-tree/observer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAqBlE;;;;GAIG;AACH,MAAM,CAAC,IAAI,eAAqC,CAAC;AAEjD,MAAM,aAAa,GAA6B,EAAE,CAAC;AAEnD,SAAS,WAAW,CAAC,WAAiC;IACrD,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAChC,eAAe,GAAG,WAAW,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa;IACrB,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,+BAA+B,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC;IACnC,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,KAAK,eAAe,IAAI,2BAA2B,CAAC,CAAC;IAC7E,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAI,WAAiC,EAAE,CAAU;IAC/E,WAAW,CAAC,WAAW,CAAC,CAAC;IACzB,IAAI,CAAC;QACJ,OAAO,CAAC,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACV,aAAa,EAAE,CAAC;IACjB,CAAC;AACF,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { debugAssert } from \"@fluidframework/core-utils/internal\";\nimport type { FlexTreeNode } from \"./flexTreeTypes.js\";\nimport type { FieldKey } from \"../../core/index.js\";\n\n/*\n * This file sets up a static observation tracking system.\n *\n * This library used to contain a more general variant of this which was deleted in https://github.com/microsoft/FluidFramework/pull/18659.\n * This pattern somewhat resembles the approach in https://github.com/tc39/proposal-signals.\n */\n\n/**\n * An object informed about observation made to trees.\n * @remarks\n * See {@link withObservation} and {@link currentObserver}.\n */\nexport interface Observer {\n\tobserveNodeFields(node: FlexTreeNode): void;\n\tobserveNodeField(node: FlexTreeNode, key: FieldKey): void;\n\tobserveParentOf(node: FlexTreeNode): void;\n}\n/**\n * The current observer, if any.\n * @remarks\n * Set via {@link setObserver} as used by {@link withObservation}.\n */\nexport let currentObserver: Observer | undefined;\n\nconst observerStack: (Observer | undefined)[] = [];\n\nfunction setObserver(newObserver: Observer | undefined): void {\n\tobserverStack.push(newObserver);\n\tcurrentObserver = newObserver;\n}\n\nfunction clearObserver(): void {\n\tdebugAssert(() => observerStack.length > 0 || \"Empty Observer stack on clear\");\n\tconst popped = observerStack.pop();\n\tdebugAssert(() => popped === currentObserver || \"Mismatched observer stack\");\n\tcurrentObserver = observerStack[observerStack.length - 1];\n}\n\n/**\n * For the duration of `f`, pushes `newObserver` onto the observer stack, making it the {@link currentObserver}.\n */\nexport function withObservation<T>(newObserver: Observer | undefined, f: () => T): T {\n\tsetObserver(newObserver);\n\ttry {\n\t\treturn f();\n\t} finally {\n\t\tclearObserver();\n\t}\n}\n"]}
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export declare const pkgName = "@fluidframework/tree";
8
- export declare const pkgVersion = "2.61.0-355990";
8
+ export declare const pkgVersion = "2.61.0-356132";
9
9
  //# sourceMappingURL=packageVersion.d.ts.map
@@ -5,5 +5,5 @@
5
5
  * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
6
6
  */
7
7
  export const pkgName = "@fluidframework/tree";
8
- export const pkgVersion = "2.61.0-355990";
8
+ export const pkgVersion = "2.61.0-356132";
9
9
  //# sourceMappingURL=packageVersion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/tree\";\nexport const pkgVersion = \"2.61.0-355990\";\n"]}
1
+ {"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,sBAAsB,CAAC;AAC9C,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/tree\";\nexport const pkgVersion = \"2.61.0-356132\";\n"]}
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import type { IFluidHandle } from "@fluidframework/core-interfaces";
6
6
  import type { IIdCompressor } from "@fluidframework/id-compressor";
7
- import { type Unhydrated, TreeNode, type ImplicitFieldSchema, type InsertableField, type TreeFieldFromImplicitField, type TreeLeafValue, type UnsafeUnknownSchema, type ConciseTree, type TreeEncodingOptions, type VerboseTree, type TreeBranch, type TreeParsingOptions } from "../simple-tree/index.js";
7
+ import { TreeNode, type Unhydrated, type ImplicitFieldSchema, type InsertableField, type TreeFieldFromImplicitField, type TreeLeafValue, type UnsafeUnknownSchema, type ConciseTree, type TreeEncodingOptions, type VerboseTree, type TreeBranch, type TreeParsingOptions } from "../simple-tree/index.js";
8
8
  import { type JsonCompatible } from "../util/index.js";
9
9
  import { type ICodecOptions, type CodecWriteOptions } from "../codec/index.js";
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"treeAlpha.d.ts","sourceRoot":"","sources":["../../src/shared-tree/treeAlpha.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"treeAlpha.d.ts","sourceRoot":"","sources":["../../src/shared-tree/treeAlpha.ts"],"names":[],"mappings":"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"}