release v1.0.0

We are very excited to announce the release of Loro v1.0, which is a major milestone. It has stable encoding format, faster document import and export speed, better version control capabilities and history gc feature. For more information, please check the blog.

The following are the specific API changes:

New

LoroDoc

  • getChange(id: ID): get ChangeMeta by ID.
  • setDetachedEditing(flag: boolean): Enables editing in detached mode, which is disabled by default.
  • isDetachedEditingEnabled(): Whether the editing is enabled in detached mode.
  • setNextCommitMessage(msg: string): Set the commit message of the next commit.
  • shallowSinceVV(): The doc only contains the history since this version.
  • shallowSinceFrontiers(): The doc only contains the history since this version.
  • export(mode: ExportMode): Export the document based on the specified ExportMode. see more details here.
  • getDeepValueWithID(): Get deep value of the document with container id.
  • subscribeLocalUpdates(callback:(bytes: Uint8Array) => void): Subscribe to updates from local edits.
  • getPathToContainer(id: ContainerID): Get the path from the root to the container.
  • JSONPath(jsonPath: string): Evaluate JSONPath against a LoroDoc.
  • forkAt(frontiers: Frontiers): LoroDoc: Creates a new LoroDoc at a specified version (Frontiers)
  • getPendingTxnLength():number: Get the number of operations in the pending transaction.
  • travelChangeAncestors(ids: ID[], callback: (meta: ChangeMeta)->bool): Iterate over all changes including the input id in order, and stop iterating if the callback returns false.

LoroText

  • updateByLine(text: string): Update the current text based on the provided text line by line like git.

LoroList

  • toArray(): ValueOrContainer[]: Get elements of the list. If the value is a child container, the corresponding Container will be returned.
  • clear(): Delete all elements in the list.

LoroMovableList

  • toArray(): ValueOrContainer[]: Get elements of the list. If the value is a child container, the corresponding Container will be returned.
  • clear(): Delete all elements in the list.

LoroMap

  • clear(): Delete all key-value pairs in the map.

LoroTree

  • enableFractionalIndex(jitter: number): Set whether to generate fractional index for Tree Position.
  • disableFractionalIndex(): Disable the fractional index generation for Tree Position when you don't need the Tree's siblings to be sorted. The fractional index will be always default.
  • isFractionalIndexEnabled(): Whether the tree enables the fractional index generation.
  • isNodeDeleted(id: TreeID): Return undefined if the node is not exist, otherwise return true if the node is deleted.
  • getNodes(prop: getNodesProp): LoroTreeNode[]: Get the flat array of the forest. If with_deleted is true, the deleted nodes will be included.

UndoManager

  • clear(): Clear the Undo and Redo stack of UndoManager

Changes

LoroDoc

  • Move setFractionalIndexJitter() to LoroTree, you can set whether to enable or disable it for each Tree Container.
  • import(), importWith() and importJsonUpdates will return ImportStatus for indicating which ops have been successfully applied and which ops are pending.
  • New Subscription for event.
  • In Loro 1.0, doc.version() doc.frontiers() doc.oplogVersion() and doc.oplogFrontiers() even if ops has not been committed, it indicates the latest version of all operations.
  • rename Loro to LoroDoc.

LoroTree

  • contains(id: TreeID): Return true even if the node exists in the internal state and has been deleted.
  • nodes(): deleted nodes will be included now, you can use isDeleted() to filter.
  • toJSON(): Now use the hierarchical approach to express the tree structure.

Deprecation

LoroDoc

  • exportFrom(version) and exportSnapshot() are deprecated, use export(mode: ExportMode) instead.