UNPKG

reconcile-text

Version:

Intelligent 3-way text merging with automated conflict resolution

175 lines (174 loc) 8.19 kB
declare const BUILTIN_TOKENIZERS: readonly ["Character", "Line", "Word"]; declare const HISTORY_VALUES: readonly ["Unchanged", "AddedFromLeft", "AddedFromRight", "RemovedFromLeft", "RemovedFromRight"]; /** * Tokenisation strategies for text merging. * * These correspond to the built-in tokenizers available in the underlying WASM module. */ export type BuiltinTokenizer = (typeof BUILTIN_TOKENIZERS)[number]; /** * History classification for text spans in merge results. * * Indicates the origin of each text span in the merged document. */ export type History = (typeof HISTORY_VALUES)[number]; /** * Represents a text document with associated cursor positions. * * This interface is used both as input to reconcile functions (to specify where * cursors are positioned in the original documents) and as output (with cursors * automatically repositioned after merging). */ export interface TextWithCursors { /** The document's entire content as a string */ text: string; /** * Array of cursor positions within the text. Can be empty if there are no cursors to track. * Each cursor has a unique ID and position. */ cursors: CursorPosition[]; } /** * Represents a text document with associated cursor positions. * * This interface is used both as input to reconcile functions (to specify where * cursors are positioned in the original documents) and as output (with cursors * automatically repositioned after merging). */ export interface TextWithOptionalCursors { /** The document's entire content as a string */ text: string; /** * Array of cursor positions within the text. Can be null, undefined, or empty * if there are no cursors to track. Each cursor has a unique ID and position. */ cursors: null | undefined | CursorPosition[]; } /** * Represents a cursor position within a text document. * * Cursors are automatically repositioned during text merging to maintain their * relative positions as text is inserted, deleted, or modified around them. */ export interface CursorPosition { /** Unique identifier for the cursor (can be any number, must be unique within the document) */ id: number; /** Character position in the text, 0-based index from the beginning of the document */ position: number; } /** * Represents a merged text document with cursor positions and detailed change history. * * This is the return type of `reconcileWithHistory()` and provides complete information * about how the merge was performed, including which parts of the final text came from * which source documents. */ export interface TextWithCursorsAndHistory { /** The merged document's entire content */ text: string; /** * Array of cursor positions within the merged text. Can empty if there are no cursors to track. * All cursors are automatically repositioned from the left and right documents. */ cursors: CursorPosition[]; /** * Detailed provenance information showing the origin of each text span in the result. * Each span indicates whether it was unchanged, added from left, added from right, etc. */ history: SpanWithHistory[]; } /** * Represents a span of text in the merged result with its change history. * * This shows exactly which source document contributed each piece of text to the * final merged result. Useful for understanding merge decisions and creating * visualisations of how documents were combined. */ export interface SpanWithHistory { /** The text content of this span */ text: string; /** The origin of this text span in the merge result */ history: History; } /** * Merges three versions of text using intelligent conflict resolution. * * This is the primary function for 3-way text merging. Unlike traditional merge tools * that produce conflict markers, this function automatically resolves conflicts by * applying both sets of changes where possible. * * @param original - The original/base version of the text that both sides diverged from * @param left - The left version of the text (either string or TextWithCursors with cursor positions) * @param right - The right version of the text (either string or TextWithCursors with cursor positions) * @param tokenizer - The tokenisation strategy: "Word" (default, recommended for prose), * "Character" (fine-grained), or "Line" (similar to git merge) * @returns The reconciled text with automatically repositioned cursor positions * * @example * ```typescript * const original = "Hello world"; * const left = "Hello beautiful world"; // Added "beautiful" * const right = "Hi world"; // Changed "Hello" to "Hi" * * const result = reconcile(original, left, right); * console.log(result.text); // "Hi beautiful world" * ``` */ export declare function reconcile(original: string, left: string | TextWithOptionalCursors, right: string | TextWithOptionalCursors, tokenizer?: BuiltinTokenizer): TextWithCursors; /** * Generates a compact diff representation between an original and changed text. * * These can be parsed and unpacked using the `undiff` function or the Rust crate's EditedText::from_diff. * Cursor positions are omitted from the diff result. * * This function computes the differences between two versions of text and returns * a compact representation of those changes. * * @param original - The original/base version of the text * @param changed - The modified version of the text (either string or TextWithCursors with cursor positions) * @param tokenizer - The tokenisation strategy, which is the same as used in `reconcile`. * @returns An array representing the compact diff, with inserts as strings and deletes as negative integers. */ export declare function diff(original: string, changed: string | TextWithOptionalCursors, tokenizer?: BuiltinTokenizer): Array<number | string>; /** * Applies a compact diff to an original text to reconstruct the changed version. * * This function takes an original text and a compact diff representation (as produced * by the `diff` function) and reconstructs the modified text. * * @param original - The original/base version of the text * @param diff - The compact diff array representing changes (inserts as strings, deletes as negative integers) * @param tokenizer - The tokenisation strategy, which is the same as used in `reconcile`. * @returns The reconstructed changed text as a string. */ export declare function undiff(original: string, diff: Array<number | bigint | string>, tokenizer?: BuiltinTokenizer): string; /** * Merges three versions of text and returns detailed provenance information. * * This function behaves identically to `reconcile()` but additionally provides * detailed historical information about the origin of each text span in the result. * This is valuable for understanding how the merge was performed and which changes * came from which source. * * Note: Computing the history is computationally more expensive than the basic merge. * * @param original - The original/base version of the text that both sides diverged from * @param left - The left version of the text (either string or TextWithCursors with cursor positions) * @param right - The right version of the text (either string or TextWithCursors with cursor positions) * @param tokenizer - The tokenisation strategy: "Word" (default, recommended for prose), * "Character" (fine-grained), or "Line" (similar to git merge) * @returns The reconciled text with cursor positions and detailed change history * * @example * ```typescript * const original = "Hello world"; * const left = "Hello beautiful world"; * const right = "Hi world"; * * const result = reconcileWithHistory(original, left, right); * console.log(result.text); // "Hi beautiful world" * console.log(result.history); // Array of SpanWithHistory objects showing change origins * ``` */ export declare function reconcileWithHistory(original: string, left: string | TextWithOptionalCursors, right: string | TextWithOptionalCursors, tokenizer?: BuiltinTokenizer): TextWithCursorsAndHistory; export {};