prosemirror-changeset 2.1.0 → 2.2.0-beta.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/diff.js","../src/change.js","../src/simplify.js","../src/changeset.js"],"sourcesContent":["// Convert the given range of a fragment to tokens, where node open\n// tokens are encoded as strings holding the node name, characters as\n// their character code, and node close tokens as -1.\nfunction tokens(frag, start, end, target) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n for (let j = from; j < to; j++) target.push(child.text.charCodeAt(j - off))\n } else if (child.isLeaf) {\n target.push(child.type.name)\n } else {\n if (from == off) target.push(child.type.name)\n tokens(child.content, Math.max(off + 1, from) - off - 1, Math.min(endOff - 1, to) - off - 1, target)\n if (to == endOff) target.push(-1)\n }\n }\n off = endOff\n }\n return target\n}\n\n// The code below will refuse to compute a diff with more than 5000\n// insertions or deletions, which takes about 300ms to reach on my\n// machine. This is a safeguard against runaway computations.\nconst MAX_DIFF_SIZE = 5000\n\n// This obscure mess of constants computes the minimum length of an\n// unchanged range (not at the start/end of the compared content). The\n// idea is to make it higher in bigger replacements, so that you don't\n// get a diff soup of coincidentally identical letters when replacing\n// a paragraph.\nfunction minUnchanged(sizeA, sizeB) {\n return Math.min(15, Math.max(2, Math.floor(Math.max(sizeA, sizeB) / 10)))\n}\n\n// : (Fragment, Fragment, Change) → [Change]\nexport function computeDiff(fragA, fragB, range) {\n let tokA = tokens(fragA, range.fromA, range.toA, [])\n let tokB = tokens(fragB, range.fromB, range.toB, [])\n\n // Scan from both sides to cheaply eliminate work\n let start = 0, endA = tokA.length, endB = tokB.length\n while (start < tokA.length && start < tokB.length && tokA[start] === tokB[start]) start++\n if (start == tokA.length && start == tokB.length) return []\n while (endA > start && endB > start && tokA[endA - 1] === tokB[endB - 1]) endA--, endB--\n // If the result is simple _or_ too big to cheaply compute, return\n // the remaining region as the diff\n if (endA == start || endB == start || (endA == endB && endA == start + 1))\n return [range.slice(start, endA, start, endB)]\n\n // This is an implementation of Myers' diff algorithm\n // See https://neil.fraser.name/writing/diff/myers.pdf and\n // https://blog.jcoglan.com/2017/02/12/the-myers-diff-algorithm-part-1/\n\n let lenA = endA - start, lenB = endB - start\n let max = Math.min(MAX_DIFF_SIZE, lenA + lenB), off = max + 1\n let history = []\n let frontier = []\n for (let len = off * 2, i = 0; i < len; i++) frontier[i] = -1\n\n for (let size = 0; size <= max; size++) {\n for (let diag = -size; diag <= size; diag += 2) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n let x = next < prev ? prev : next + 1, y = x + diag\n while (x < lenA && y < lenB && tokA[start + x] === tokB[start + y]) x++, y++\n frontier[diag + max] = x\n // Found a match\n if (x >= lenA && y >= lenB) {\n // Trace back through the history to build up a set of changed ranges.\n let diff = [], minSpan = minUnchanged(endA - start, endB - start)\n // Used to add steps to a diff one at a time, back to front, merging\n // ones that are less than minSpan tokens apart\n let fromA = -1, toA = -1, fromB = -1, toB = -1\n let add = (fA, tA, fB, tB) => {\n if (fromA > -1 && fromA < tA + minSpan) {\n fromA = fA; fromB = fB\n } else {\n if (fromA > -1)\n diff.push(range.slice(fromA, toA, fromB, toB))\n fromA = fA; toA = tA\n fromB = fB; toB = tB\n }\n }\n\n for (let i = size - 1; i >= 0; i--) {\n let next = frontier[diag + 1 + max], prev = frontier[diag - 1 + max]\n if (next < prev) { // Deletion\n diag--\n x = prev + start; y = x + diag\n add(x, x, y, y + 1)\n } else { // Insertion\n diag++\n x = next + start; y = x + diag\n add(x, x + 1, y, y)\n }\n frontier = history[i >> 1]\n }\n if (fromA > -1) diff.push(range.slice(fromA, toA, fromB, toB))\n return diff.reverse()\n }\n }\n // Since only either odd or even diagonals are read from each\n // frontier, we only copy them every other iteration.\n if (size % 2 == 0) history.push(frontier.slice())\n }\n // The loop exited, meaning the maximum amount of work was done.\n // Just return a change spanning the entire range.\n return [range.slice(start, endA, start, endB)]\n}\n","// ::- Stores metadata for a part of a change.\nexport class Span {\n constructor(length, data) {\n // :: number\n this.length = length\n // :: any\n this.data = data\n }\n\n cut(length) {\n return length == this.length ? this : new Span(length, this.data)\n }\n\n static slice(spans, from, to) {\n if (from == to) return Span.none\n if (from == 0 && to == Span.len(spans)) return spans\n let result = []\n for (let i = 0, off = 0; off < to; i++) {\n let span = spans[i], end = off + span.length\n let overlap = Math.min(to, end) - Math.max(from, off)\n if (overlap > 0) result.push(span.cut(overlap))\n off = end\n }\n return result\n }\n\n static join(a, b, combine) {\n if (a.length == 0) return b\n if (b.length == 0) return a\n let combined = combine(a[a.length - 1].data, b[0].data)\n if (combined == null) return a.concat(b)\n let result = a.slice(0, a.length - 1)\n result.push(new Span(a[a.length - 1].length + b[0].length, combined))\n for (let i = 1; i < b.length; i++) result.push(b[i])\n return result\n }\n\n static len(spans) {\n let len = 0\n for (let i = 0; i < spans.length; i++) len += spans[i].length\n return len\n }\n}\n\nSpan.none = []\n\n// ::- A replaced range with metadata associated with it.\nexport class Change {\n constructor(fromA, toA, fromB, toB, deleted, inserted) {\n // :: number The start of the range deleted/replaced in the old\n // document.\n this.fromA = fromA\n // :: number The end of the range in the old document.\n this.toA = toA\n // :: number The start of the range inserted in the new document.\n this.fromB = fromB\n // :: number The end of the range in the new document.\n this.toB = toB\n // :: [Span] Data associated with the deleted content. The length\n // of these spans adds up to `this.toA - this.fromA`.\n this.deleted = deleted\n // :: [Span] Data associated with the inserted content. Length\n // adds up to `this.toB - this.toA`.\n this.inserted = inserted\n }\n\n get lenA() { return this.toA - this.fromA }\n get lenB() { return this.toB - this.fromB }\n\n slice(startA, endA, startB, endB) {\n if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&\n endB == this.toB - this.fromB) return this\n return new Change(this.fromA + startA, this.fromA + endA,\n this.fromB + startB, this.fromB + endB,\n Span.slice(this.deleted, startA, endA),\n Span.slice(this.inserted, startB, endB))\n }\n\n // : ([Change], [Change], (any, any) → any) → [Change]\n // This merges two changesets (the end document of x should be the\n // start document of y) into a single one spanning the start of x to\n // the end of y.\n static merge(x, y, combine) {\n if (x.length == 0) return y\n if (y.length == 0) return x\n\n let result = []\n // Iterate over both sets in parallel, using the middle coordinate\n // system (B in x, A in y) to synchronize.\n for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {\n if (!curX && !curY) {\n return result\n } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY\n let off = iY ? y[iY - 1].toB - y[iY - 1].toA : 0\n result.push(off == 0 ? curX :\n new Change(curX.fromA, curX.toA, curX.fromB + off, curX.toB + off,\n curX.deleted, curX.inserted))\n curX = iX++ == x.length ? null : x[iX]\n } else if (curY && (!curX || curY.toA < curX.fromB)) { // curY entirely in front of curX\n let off = iX ? x[iX - 1].toB - x[iX - 1].toA : 0\n result.push(off == 0 ? curY :\n new Change(curY.fromA - off, curY.toA - off, curY.fromB, curY.toB,\n curY.deleted, curY.inserted))\n curY = iY++ == y.length ? null : y[iY]\n } else { // Touch, need to merge\n // The rules for merging ranges are that deletions from the\n // old set and insertions from the new are kept. Areas of the\n // middle document covered by a but not by b are insertions\n // from a that need to be added, and areas covered by b but\n // not a are deletions from b that need to be added.\n let pos = Math.min(curX.fromB, curY.fromA)\n let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA\n let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB\n let deleted = Span.none, inserted = Span.none\n\n // Used to prevent appending ins/del range for the same Change twice\n let enteredX = false, enteredY = false\n\n // Need to have an inner loop since any number of further\n // ranges might be touching this group\n for (;;) {\n let nextX = !curX ? 2e8 : pos >= curX.fromB ? curX.toB : curX.fromB\n let nextY = !curY ? 2e8 : pos >= curY.fromA ? curY.toA : curY.fromA\n let next = Math.min(nextX, nextY)\n let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA\n if (!inX && !inY) break\n if (inX && pos == curX.fromB && !enteredX) {\n deleted = Span.join(deleted, curX.deleted, combine)\n toA += curX.lenA\n enteredX = true\n }\n if (inX && !inY) {\n inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)\n toB += next - pos\n }\n if (inY && pos == curY.fromA && !enteredY) {\n inserted = Span.join(inserted, curY.inserted, combine)\n toB += curY.lenB\n enteredY = true\n }\n if (inY && !inX) {\n deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)\n toA += next - pos\n }\n\n if (inX && next == curX.toB) {\n curX = iX++ == x.length ? null : x[iX]\n enteredX = false\n }\n if (inY && next == curY.toA) {\n curY = iY++ == y.length ? null : y[iY]\n enteredY = false\n }\n pos = next\n }\n if (fromA < toA || fromB < toB)\n result.push(new Change(fromA, toA, fromB, toB, deleted, inserted))\n }\n }\n }\n}\n","import {Span, Change} from \"./change\"\n\nlet letter\n// If the runtime support unicode properties in regexps, that's a good\n// source of info on whether something is a letter.\ntry { letter = new RegExp(\"[\\\\p{Alphabetic}_]\", \"u\") } catch(_) {}\n\n// Otherwise, we see if the character changes when upper/lowercased,\n// or if it is part of these common single-case scripts.\nconst nonASCIISingleCaseWordChar = /[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/\n\nfunction isLetter(code) {\n if (code < 128)\n return code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 79 && code <= 122\n let ch = String.fromCharCode(code)\n if (letter) return letter.test(ch)\n return ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)\n}\n\n// Convert a range of document into a string, so that we can easily\n// access characters at a given position. Treat non-text tokens as\n// spaces so that they aren't considered part of a word.\nfunction getText(frag, start, end) {\n let out = \"\"\n function convert(frag, start, end) {\n for (let i = 0, off = 0; i < frag.childCount; i++) {\n let child = frag.child(i), endOff = off + child.nodeSize\n let from = Math.max(off, start), to = Math.min(endOff, end)\n if (from < to) {\n if (child.isText) {\n out += child.text.slice(Math.max(0, start - off), Math.min(child.text.length, end - off))\n } else if (child.isLeaf) {\n out += \" \"\n } else {\n if (from == off) out += \" \"\n convert(child.content, Math.max(0, from - off - 1), Math.min(child.content.size, end - off))\n if (to == endOff) out += \" \"\n }\n }\n off = endOff\n }\n }\n convert(frag, start, end)\n return out\n}\n\n// The distance changes have to be apart for us to not consider them\n// candidates for merging.\nconst MAX_SIMPLIFY_DISTANCE = 30\n\n// :: ([Change], Node) → [Change]\n// Simplifies a set of changes for presentation. This makes the\n// assumption that having both insertions and deletions within a word\n// is confusing, and, when such changes occur without a word boundary\n// between them, they should be expanded to cover the entire set of\n// words (in the new document) they touch. An exception is made for\n// single-character replacements.\nexport function simplifyChanges(changes, doc) {\n let result = []\n for (let i = 0; i < changes.length; i++) {\n let end = changes[i].toB, start = i\n while (i < changes.length - 1 && changes[i + 1].fromB <= end + MAX_SIMPLIFY_DISTANCE)\n end = changes[++i].toB\n simplifyAdjacentChanges(changes, start, i + 1, doc, result)\n }\n return result\n}\n\nfunction simplifyAdjacentChanges(changes, from, to, doc, target) {\n let start = Math.max(0, changes[from].fromB - MAX_SIMPLIFY_DISTANCE)\n let end = Math.min(doc.content.size, changes[to - 1].toB + MAX_SIMPLIFY_DISTANCE)\n let text = getText(doc.content, start, end)\n\n for (let i = from; i < to; i++) {\n let startI = i, last = changes[i], deleted = last.lenA, inserted = last.lenB\n while (i < to - 1) {\n let next = changes[i + 1], boundary = false\n let prevLetter = last.toB == end ? false : isLetter(text.charCodeAt(last.toB - 1 - start))\n for (let pos = last.toB; !boundary && pos < next.fromB; pos++) {\n let nextLetter = pos == end ? false : isLetter(text.charCodeAt(pos - start))\n if ((!prevLetter || !nextLetter) && pos != changes[startI].fromB) boundary = true\n prevLetter = nextLetter\n }\n if (boundary) break\n deleted += next.lenA; inserted += next.lenB\n last = next\n i++\n }\n\n if (inserted > 0 && deleted > 0 && !(inserted == 1 && deleted == 1)) {\n let from = changes[startI].fromB, to = changes[i].toB\n if (from < end && isLetter(text.charCodeAt(from - start)))\n while (from > start && isLetter(text.charCodeAt(from - 1 - start))) from--\n if (to > start && isLetter(text.charCodeAt(to - 1 - start)))\n while (to < end && isLetter(text.charCodeAt(to - start))) to++\n let joined = fillChange(changes.slice(startI, i + 1), from, to)\n let last = target.length ? target[target.length - 1] : null\n if (last && last.toA == joined.fromA)\n target[target.length - 1] = new Change(last.fromA, joined.toA, last.fromB, joined.toB,\n last.deleted.concat(joined.deleted), last.inserted.concat(joined.inserted))\n else\n target.push(joined)\n } else {\n for (let j = startI; j <= i; j++) target.push(changes[j])\n }\n }\n return changes\n}\n\nfunction combine(a, b) { return a === b ? a : null }\n\nfunction fillChange(changes, fromB, toB) {\n let fromA = changes[0].fromA - (changes[0].fromB - fromB)\n let last = changes[changes.length - 1]\n let toA = last.toA + (toB - last.toB)\n let deleted = Span.none, inserted = Span.none\n let delData = (changes[0].deleted.length ? changes[0].deleted : changes[0].inserted)[0].data\n let insData = (changes[0].inserted.length ? changes[0].inserted : changes[0].deleted)[0].data\n for (let posA = fromA, posB = fromB, i = 0;; i++) {\n let next = i == changes.length ? null : changes[i]\n let endA = next ? next.fromA : toA, endB = next ? next.fromB : toB\n if (endA > posA) deleted = Span.join(deleted, [new Span(endA - posA, delData)], combine)\n if (endB > posB) inserted = Span.join(inserted, [new Span(endB - posB, insData)], combine)\n if (!next) break\n deleted = Span.join(deleted, next.deleted, combine)\n inserted = Span.join(inserted, next.inserted, combine)\n if (deleted.length) delData = deleted[deleted.length - 1].data\n if (inserted.length) insData = inserted[inserted.length - 1].data\n posA = next.toA; posB = next.toB\n }\n return new Change(fromA, toA, fromB, toB, deleted, inserted)\n}\n","import {computeDiff} from \"./diff\"\nimport {Change, Span} from \"./change\"\nexport {Change, Span}\nexport {simplifyChanges} from \"./simplify\"\n\n// ::- A change set tracks the changes to a document from a given\n// point in the past. It condenses a number of step maps down to a\n// flat sequence of replacements, and simplifies replacments that\n// partially undo themselves by comparing their content.\nexport class ChangeSet {\n constructor(config, changes) {\n this.config = config\n // :: [Change] Replaced regions.\n this.changes = changes\n }\n\n // :: (Node, [StepMap], union<[any], any>) → ChangeSet\n // Computes a new changeset by adding the given step maps and\n // metadata (either as an array, per-map, or as a single value to be\n // associated with all maps) to the current set. Will not mutate the\n // old set.\n //\n // Note that due to simplification that happens after each add,\n // incrementally adding steps might create a different final set\n // than adding all those changes at once, since different document\n // tokens might be matched during simplification depending on the\n // boundaries of the current changed ranges.\n addSteps(newDoc, maps, data) {\n // This works by inspecting the position maps for the changes,\n // which indicate what parts of the document were replaced by new\n // content, and the size of that new content. It uses these to\n // build up Change objects.\n //\n // These change objects are put in sets and merged together using\n // Change.merge, giving us the changes created by the new steps.\n // Those changes can then be merged with the existing set of\n // changes.\n //\n // For each change that was touched by the new steps, we recompute\n // a diff to try to minimize the change by dropping matching\n // pieces of the old and new document from the change.\n\n let stepChanges = []\n // Add spans for new steps.\n for (let i = 0; i < maps.length; i++) {\n let d = Array.isArray(data) ? data[i] : data\n let off = 0\n maps[i].forEach((fromA, toA, fromB, toB) => {\n\n stepChanges.push(new Change(fromA + off, toA + off, fromB, toB,\n fromA == toA ? Span.none : [new Span(toA - fromA, d)],\n fromB == toB ? Span.none : [new Span(toB - fromB, d)]))\n\n off = (toB - fromB) - (toA - fromA)\n })\n }\n if (stepChanges.length == 0) return this\n\n let newChanges = mergeAll(stepChanges, this.config.combine)\n let changes = Change.merge(this.changes, newChanges, this.config.combine)\n\n // Minimize changes when possible\n for (let i = 0; i < changes.length; i++) {\n let change = changes[i]\n if (change.fromA == change.toA || change.fromB == change.toB ||\n // Only look at changes that touch newly added changed ranges\n !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue\n let diff = computeDiff(this.config.doc.content, newDoc.content, change)\n\n // Fast path: If they are completely different, don't do anything\n if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)\n continue\n\n if (diff.length == 1) {\n changes[i] = diff[0]\n } else {\n changes.splice(i, 1, ...diff)\n i += diff.length - 1\n }\n }\n\n return new ChangeSet(this.config, changes)\n }\n\n // :: Node\n // The starting document of the change set.\n get startDoc() { return this.config.doc }\n\n // :: (f: (range: Change) → any) → ChangeSet\n // Map the span's data values in the given set through a function\n // and construct a new set with the resulting data.\n map(f) {\n return new ChangeSet(this.config, this.changes.map(change => {\n let data = f(change)\n return data === change.data ? change :\n new Change(change.fromA, change.toA, change.fromB, change.toB, data)\n }))\n }\n\n // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}\n // Compare two changesets and return the range in which they are\n // changed, if any. If the document changed between the maps, pass\n // the maps for the steps that changed it as second argument, and\n // make sure the method is called on the old set and passed the new\n // set. The returned positions will be in new document coordinates.\n changedRange(b, maps) {\n if (b == this) return null\n let touched = maps && touchedRange(maps)\n let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0\n function map(p) {\n return !touched || p <= touched.fromA ? p : p + moved\n }\n\n let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8\n function add(start, end = start) {\n from = Math.min(start, from); to = Math.max(end, to)\n }\n\n let rA = this.changes, rB = b.changes\n for (let iA = 0, iB = 0; iA < rA.length && iB < rB.length;) {\n let rangeA = rA[iA], rangeB = rB[iB]\n if (rangeA && rangeB && sameRanges(rangeA, rangeB, map)) { iA++; iB++ }\n else if (rangeB && (!rangeA || map(rangeA.fromB) >= rangeB.fromB)) { add(rangeB.fromB, rangeB.toB); iB++ }\n else { add(map(rangeA.fromB), map(rangeA.toB)); iA++ }\n }\n\n return from <= to ? {from, to} : null\n }\n\n // :: (Node, ?(a: any, b: any) → any) → ChangeSet\n // Create a changeset with the given base object and configuration.\n // The `combine` function is used to compare and combine metadata—it\n // should return null when metadata isn't compatible, and a combined\n // version for a merged range when it is.\n static create(doc, combine = (a, b) => a === b ? a : null) {\n return new ChangeSet({combine, doc}, [], [])\n }\n}\n\n// Exported for testing\nChangeSet.computeDiff = computeDiff\n\n// : ([[Change]], (any, any) → any, number, number) → [Change]\n// Divide-and-conquer approach to merging a series of ranges.\nfunction mergeAll(ranges, combine, start = 0, end = ranges.length) {\n if (end == start + 1) return [ranges[start]]\n let mid = (start + end) >> 1\n return Change.merge(mergeAll(ranges, combine, start, mid),\n mergeAll(ranges, combine, mid, end), combine)\n}\n\nfunction endRange(maps) {\n let from = 2e8, to = -2e8\n for (let i = 0; i < maps.length; i++) {\n let map = maps[i]\n if (from != 2e8) {\n from = map.map(from, -1)\n to = map.map(to, 1)\n }\n map.forEach((_s, _e, start, end) => {\n from = Math.min(from, start)\n to = Math.max(to, end)\n })\n }\n return from == 2e8 ? null : {from, to}\n}\n\nfunction touchedRange(maps) {\n let b = endRange(maps)\n if (!b) return null\n let a = endRange(maps.map(m => m.invert()).reverse())\n return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}\n}\n\nfunction sameRanges(a, b, map) {\n return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&\n sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)\n}\n\nfunction sameSpans(a, b) {\n if (a.length != b.length) return false\n for (let i = 0; i < a.length; i++)\n if (a[i].length != b[i].length || a[i].data !== b[i].data) return false\n return true\n}\n"],"names":["let","const","i","next","prev","prototypeAccessors","off","from","to","last","this"],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,16 @@
1
1
  {
2
2
  "name": "prosemirror-changeset",
3
- "version": "2.1.0",
3
+ "version": "2.2.0-beta.1",
4
4
  "description": "Distills a series of editing steps into deleted and added ranges",
5
- "main": "dist/changeset.js",
6
- "module": "src/changeset.js",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs"
12
+ },
13
+ "sideEffects": false,
7
14
  "license": "MIT",
8
15
  "maintainers": [
9
16
  {
@@ -16,24 +23,17 @@
16
23
  "type": "git",
17
24
  "url": "git://github.com/prosemirror/prosemirror-changeset.git"
18
25
  },
19
- "devDependencies": {
20
- "builddocs": "^0.3.0",
21
- "mocha": "^3.5.3",
22
- "ist": "^1.0.0",
23
- "@rollup/plugin-buble": "^0.20.0",
24
- "rollup": "^1.26.3",
25
- "prosemirror-model": "^1.0.0",
26
- "prosemirror-test-builder": "^1.0.0",
27
- "reify": "^0.12.3"
28
- },
29
26
  "dependencies": {
30
27
  "prosemirror-transform": "^1.0.0"
31
28
  },
29
+ "devDependencies": {
30
+ "@prosemirror/buildhelper": "^0.1.5",
31
+ "prosemirror-model": "^1.0.0",
32
+ "prosemirror-test-builder": "^1.0.0"
33
+ },
32
34
  "scripts": {
33
- "test": "mocha test/test-*.js",
34
- "build": "rollup -c",
35
- "watch": "rollup -c -w",
36
- "prepare": "npm run build",
37
- "build-readme": "builddocs --name changeset --main src/README.md --format markdown src/*.js > README.md"
35
+ "test": "pm-runtests",
36
+ "prepare": "pm-buildhelper src/changeset.ts",
37
+ "build-readme": "FIXME"
38
38
  }
39
39
  }
@@ -1,17 +1,20 @@
1
- // ::- Stores metadata for a part of a change.
2
- export class Span {
3
- constructor(length, data) {
4
- // :: number
5
- this.length = length
6
- // :: any
7
- this.data = data
8
- }
1
+ /// Stores metadata for a part of a change.
2
+ export class Span<Data = any> {
3
+ /// @internal
4
+ constructor(
5
+ /// The length of this span.
6
+ readonly length: number,
7
+ /// The data associated with this span.
8
+ readonly data: Data
9
+ ) {}
9
10
 
10
- cut(length) {
11
+ /// @internal
12
+ cut(length: number) {
11
13
  return length == this.length ? this : new Span(length, this.data)
12
14
  }
13
15
 
14
- static slice(spans, from, to) {
16
+ /// @internal
17
+ static slice(spans: readonly Span[], from: number, to: number) {
15
18
  if (from == to) return Span.none
16
19
  if (from == 0 && to == Span.len(spans)) return spans
17
20
  let result = []
@@ -24,7 +27,8 @@ export class Span {
24
27
  return result
25
28
  }
26
29
 
27
- static join(a, b, combine) {
30
+ /// @internal
31
+ static join<Data>(a: readonly Span<Data>[], b: readonly Span<Data>[], combine: (dataA: Data, dataB: Data) => Data) {
28
32
  if (a.length == 0) return b
29
33
  if (b.length == 0) return a
30
34
  let combined = combine(a[a.length - 1].data, b[0].data)
@@ -35,39 +39,44 @@ export class Span {
35
39
  return result
36
40
  }
37
41
 
38
- static len(spans) {
42
+ /// @internal
43
+ static len(spans: readonly Span[]) {
39
44
  let len = 0
40
45
  for (let i = 0; i < spans.length; i++) len += spans[i].length
41
46
  return len
42
47
  }
43
- }
44
48
 
45
- Span.none = []
49
+ /// @internal
50
+ static none: readonly Span[] = []
51
+ }
46
52
 
47
- // ::- A replaced range with metadata associated with it.
48
- export class Change {
49
- constructor(fromA, toA, fromB, toB, deleted, inserted) {
50
- // :: number The start of the range deleted/replaced in the old
51
- // document.
52
- this.fromA = fromA
53
- // :: number The end of the range in the old document.
54
- this.toA = toA
55
- // :: number The start of the range inserted in the new document.
56
- this.fromB = fromB
57
- // :: number The end of the range in the new document.
58
- this.toB = toB
59
- // :: [Span] Data associated with the deleted content. The length
60
- // of these spans adds up to `this.toA - this.fromA`.
61
- this.deleted = deleted
62
- // :: [Span] Data associated with the inserted content. Length
63
- // adds up to `this.toB - this.toA`.
64
- this.inserted = inserted
65
- }
53
+ /// A replaced range with metadata associated with it.
54
+ export class Change<Data = any> {
55
+ /// @internal
56
+ constructor(
57
+ /// The start of the range deleted/replaced in the old document.
58
+ readonly fromA: number,
59
+ /// The end of the range in the old document.
60
+ readonly toA: number,
61
+ /// The start of the range inserted in the new document.
62
+ readonly fromB: number,
63
+ /// The end of the range in the new document.
64
+ readonly toB: number,
65
+ /// Data associated with the deleted content. The length of these
66
+ /// spans adds up to `this.toA - this.fromA`.
67
+ readonly deleted: readonly Span<Data>[],
68
+ /// Data associated with the inserted content. Length adds up to
69
+ /// `this.toB - this.toA`.
70
+ readonly inserted: readonly Span<Data>[]
71
+ ) {}
66
72
 
73
+ /// @internal
67
74
  get lenA() { return this.toA - this.fromA }
75
+ /// @internal
68
76
  get lenB() { return this.toB - this.fromB }
69
77
 
70
- slice(startA, endA, startB, endB) {
78
+ /// @internal
79
+ slice(startA: number, endA: number, startB: number, endB: number): Change<Data> {
71
80
  if (startA == 0 && startB == 0 && endA == this.toA - this.fromA &&
72
81
  endB == this.toB - this.fromB) return this
73
82
  return new Change(this.fromA + startA, this.fromA + endA,
@@ -76,18 +85,19 @@ export class Change {
76
85
  Span.slice(this.inserted, startB, endB))
77
86
  }
78
87
 
79
- // : ([Change], [Change], (any, any) → any) → [Change]
80
- // This merges two changesets (the end document of x should be the
81
- // start document of y) into a single one spanning the start of x to
82
- // the end of y.
83
- static merge(x, y, combine) {
88
+ /// This merges two changesets (the end document of x should be the
89
+ /// start document of y) into a single one spanning the start of x to
90
+ /// the end of y.
91
+ static merge<Data>(x: readonly Change<Data>[],
92
+ y: readonly Change<Data>[],
93
+ combine: (dataA: Data, dataB: Data) => Data): readonly Change<Data>[] {
84
94
  if (x.length == 0) return y
85
95
  if (y.length == 0) return x
86
96
 
87
97
  let result = []
88
98
  // Iterate over both sets in parallel, using the middle coordinate
89
99
  // system (B in x, A in y) to synchronize.
90
- for (let iX = 0, iY = 0, curX = x[0], curY = y[0];;) {
100
+ for (let iX = 0, iY = 0, curX: Change<Data> | null = x[0], curY: Change<Data> | null = y[0];;) {
91
101
  if (!curX && !curY) {
92
102
  return result
93
103
  } else if (curX && (!curY || curX.toB < curY.fromA)) { // curX entirely in front of curY
@@ -108,9 +118,9 @@ export class Change {
108
118
  // middle document covered by a but not by b are insertions
109
119
  // from a that need to be added, and areas covered by b but
110
120
  // not a are deletions from b that need to be added.
111
- let pos = Math.min(curX.fromB, curY.fromA)
112
- let fromA = Math.min(curX.fromA, curY.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA
113
- let fromB = Math.min(curY.fromB, curX.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB
121
+ let pos = Math.min(curX!.fromB, curY!.fromA)
122
+ let fromA = Math.min(curX!.fromA, curY!.fromA - (iX ? x[iX - 1].toB - x[iX - 1].toA : 0)), toA = fromA
123
+ let fromB = Math.min(curY!.fromB, curX!.fromB + (iY ? y[iY - 1].toB - y[iY - 1].toA : 0)), toB = fromB
114
124
  let deleted = Span.none, inserted = Span.none
115
125
 
116
126
  // Used to prevent appending ins/del range for the same Change twice
@@ -124,30 +134,30 @@ export class Change {
124
134
  let next = Math.min(nextX, nextY)
125
135
  let inX = curX && pos >= curX.fromB, inY = curY && pos >= curY.fromA
126
136
  if (!inX && !inY) break
127
- if (inX && pos == curX.fromB && !enteredX) {
128
- deleted = Span.join(deleted, curX.deleted, combine)
129
- toA += curX.lenA
137
+ if (inX && pos == curX!.fromB && !enteredX) {
138
+ deleted = Span.join(deleted, curX!.deleted, combine)
139
+ toA += curX!.lenA
130
140
  enteredX = true
131
141
  }
132
142
  if (inX && !inY) {
133
- inserted = Span.join(inserted, Span.slice(curX.inserted, pos - curX.fromB, next - curX.fromB), combine)
143
+ inserted = Span.join(inserted, Span.slice(curX!.inserted, pos - curX!.fromB, next - curX!.fromB), combine)
134
144
  toB += next - pos
135
145
  }
136
- if (inY && pos == curY.fromA && !enteredY) {
137
- inserted = Span.join(inserted, curY.inserted, combine)
138
- toB += curY.lenB
146
+ if (inY && pos == curY!.fromA && !enteredY) {
147
+ inserted = Span.join(inserted, curY!.inserted, combine)
148
+ toB += curY!.lenB
139
149
  enteredY = true
140
150
  }
141
151
  if (inY && !inX) {
142
- deleted = Span.join(deleted, Span.slice(curY.deleted, pos - curY.fromA, next - curY.fromA), combine)
152
+ deleted = Span.join(deleted, Span.slice(curY!.deleted, pos - curY!.fromA, next - curY!.fromA), combine)
143
153
  toA += next - pos
144
154
  }
145
155
 
146
- if (inX && next == curX.toB) {
156
+ if (inX && next == curX!.toB) {
147
157
  curX = iX++ == x.length ? null : x[iX]
148
158
  enteredX = false
149
159
  }
150
- if (inY && next == curY.toA) {
160
+ if (inY && next == curY!.toA) {
151
161
  curY = iY++ == y.length ? null : y[iY]
152
162
  enteredY = false
153
163
  }
@@ -1,31 +1,34 @@
1
+ import {Node} from "prosemirror-model"
2
+ import {StepMap} from "prosemirror-transform"
1
3
  import {computeDiff} from "./diff"
2
4
  import {Change, Span} from "./change"
3
5
  export {Change, Span}
4
6
  export {simplifyChanges} from "./simplify"
5
7
 
6
- // ::- A change set tracks the changes to a document from a given
7
- // point in the past. It condenses a number of step maps down to a
8
- // flat sequence of replacements, and simplifies replacments that
9
- // partially undo themselves by comparing their content.
10
- export class ChangeSet {
11
- constructor(config, changes) {
12
- this.config = config
13
- // :: [Change] Replaced regions.
14
- this.changes = changes
15
- }
16
-
17
- // :: (Node, [StepMap], union<[any], any>) → ChangeSet
18
- // Computes a new changeset by adding the given step maps and
19
- // metadata (either as an array, per-map, or as a single value to be
20
- // associated with all maps) to the current set. Will not mutate the
21
- // old set.
22
- //
23
- // Note that due to simplification that happens after each add,
24
- // incrementally adding steps might create a different final set
25
- // than adding all those changes at once, since different document
26
- // tokens might be matched during simplification depending on the
27
- // boundaries of the current changed ranges.
28
- addSteps(newDoc, maps, data) {
8
+ /// A change set tracks the changes to a document from a given point
9
+ /// in the past. It condenses a number of step maps down to a flat
10
+ /// sequence of replacements, and simplifies replacments that
11
+ /// partially undo themselves by comparing their content.
12
+ export class ChangeSet<Data = any> {
13
+ /// @internal
14
+ constructor(
15
+ /// @internal
16
+ readonly config: {doc: Node, combine: (dataA: Data, dataB: Data) => Data},
17
+ /// Replaced regions.
18
+ readonly changes: readonly Change<Data>[]
19
+ ) {}
20
+
21
+ /// Computes a new changeset by adding the given step maps and
22
+ /// metadata (either as an array, per-map, or as a single value to be
23
+ /// associated with all maps) to the current set. Will not mutate the
24
+ /// old set.
25
+ ///
26
+ /// Note that due to simplification that happens after each add,
27
+ /// incrementally adding steps might create a different final set
28
+ /// than adding all those changes at once, since different document
29
+ /// tokens might be matched during simplification depending on the
30
+ /// boundaries of the current changed ranges.
31
+ addSteps(newDoc: Node, maps: readonly StepMap[], data: Data | readonly Data[]): ChangeSet<Data> {
29
32
  // This works by inspecting the position maps for the changes,
30
33
  // which indicate what parts of the document were replaced by new
31
34
  // content, and the size of that new content. It uses these to
@@ -40,7 +43,7 @@ export class ChangeSet {
40
43
  // a diff to try to minimize the change by dropping matching
41
44
  // pieces of the old and new document from the change.
42
45
 
43
- let stepChanges = []
46
+ let stepChanges: Change<Data>[] = []
44
47
  // Add spans for new steps.
45
48
  for (let i = 0; i < maps.length; i++) {
46
49
  let d = Array.isArray(data) ? data[i] : data
@@ -58,10 +61,11 @@ export class ChangeSet {
58
61
 
59
62
  let newChanges = mergeAll(stepChanges, this.config.combine)
60
63
  let changes = Change.merge(this.changes, newChanges, this.config.combine)
64
+ let updated: Change<Data>[] = changes as Change<Data>[]
61
65
 
62
66
  // Minimize changes when possible
63
- for (let i = 0; i < changes.length; i++) {
64
- let change = changes[i]
67
+ for (let i = 0; i < updated.length; i++) {
68
+ let change = updated[i]
65
69
  if (change.fromA == change.toA || change.fromB == change.toB ||
66
70
  // Only look at changes that touch newly added changed ranges
67
71
  !newChanges.some(r => r.toB > change.fromB && r.fromB < change.toB)) continue
@@ -71,48 +75,48 @@ export class ChangeSet {
71
75
  if (diff.length == 1 && diff[0].fromB == 0 && diff[0].toB == change.toB - change.fromB)
72
76
  continue
73
77
 
78
+ if (updated == changes) updated = changes.slice()
74
79
  if (diff.length == 1) {
75
- changes[i] = diff[0]
80
+ updated[i] = diff[0]
76
81
  } else {
77
- changes.splice(i, 1, ...diff)
82
+ updated.splice(i, 1, ...diff)
78
83
  i += diff.length - 1
79
84
  }
80
85
  }
81
86
 
82
- return new ChangeSet(this.config, changes)
87
+ return new ChangeSet(this.config, updated)
83
88
  }
84
89
 
85
- // :: Node
86
- // The starting document of the change set.
87
- get startDoc() { return this.config.doc }
88
-
89
- // :: (f: (range: Change) → any) → ChangeSet
90
- // Map the span's data values in the given set through a function
91
- // and construct a new set with the resulting data.
92
- map(f) {
93
- return new ChangeSet(this.config, this.changes.map(change => {
94
- let data = f(change)
95
- return data === change.data ? change :
96
- new Change(change.fromA, change.toA, change.fromB, change.toB, data)
90
+ /// The starting document of the change set.
91
+ get startDoc(): Node { return this.config.doc }
92
+
93
+ /// Map the span's data values in the given set through a function
94
+ /// and construct a new set with the resulting data.
95
+ map(f: (range: Span<Data>) => Data): ChangeSet<Data> {
96
+ let mapSpan = (span: Span<Data>) => {
97
+ let newData = f(span)
98
+ return newData === span.data ? span : new Span(span.length, newData)
99
+ }
100
+ return new ChangeSet(this.config, this.changes.map((ch: Change<Data>) => {
101
+ return new Change(ch.fromA, ch.toA, ch.fromB, ch.toB, ch.deleted.map(mapSpan), ch.inserted.map(mapSpan))
97
102
  }))
98
103
  }
99
104
 
100
- // :: (ChangeSet, ?[StepMap]) → ?{from: number, to: number}
101
- // Compare two changesets and return the range in which they are
102
- // changed, if any. If the document changed between the maps, pass
103
- // the maps for the steps that changed it as second argument, and
104
- // make sure the method is called on the old set and passed the new
105
- // set. The returned positions will be in new document coordinates.
106
- changedRange(b, maps) {
105
+ /// Compare two changesets and return the range in which they are
106
+ /// changed, if any. If the document changed between the maps, pass
107
+ /// the maps for the steps that changed it as second argument, and
108
+ /// make sure the method is called on the old set and passed the new
109
+ /// set. The returned positions will be in new document coordinates.
110
+ changedRange(b: ChangeSet, maps?: readonly StepMap[]): {from: number, to: number} | null {
107
111
  if (b == this) return null
108
112
  let touched = maps && touchedRange(maps)
109
113
  let moved = touched ? (touched.toB - touched.fromB) - (touched.toA - touched.fromA) : 0
110
- function map(p) {
114
+ function map(p: number) {
111
115
  return !touched || p <= touched.fromA ? p : p + moved
112
116
  }
113
117
 
114
118
  let from = touched ? touched.fromB : 2e8, to = touched ? touched.toB : -2e8
115
- function add(start, end = start) {
119
+ function add(start: number, end = start) {
116
120
  from = Math.min(start, from); to = Math.max(end, to)
117
121
  }
118
122
 
@@ -127,29 +131,31 @@ export class ChangeSet {
127
131
  return from <= to ? {from, to} : null
128
132
  }
129
133
 
130
- // :: (Node, ?(a: any, b: any) → any) → ChangeSet
131
- // Create a changeset with the given base object and configuration.
132
- // The `combine` function is used to compare and combine metadata—it
133
- // should return null when metadata isn't compatible, and a combined
134
- // version for a merged range when it is.
135
- static create(doc, combine = (a, b) => a === b ? a : null) {
136
- return new ChangeSet({combine, doc}, [], [])
134
+ /// Create a changeset with the given base object and configuration.
135
+ /// The `combine` function is used to compare and combine metadata—it
136
+ /// should return null when metadata isn't compatible, and a combined
137
+ /// version for a merged range when it is.
138
+ static create<Data = any>(doc: Node, combine: (dataA: Data, dataB: Data) => Data = (a, b) => a === b ? a : null as any) {
139
+ return new ChangeSet({combine, doc}, [])
137
140
  }
138
- }
139
141
 
140
- // Exported for testing
141
- ChangeSet.computeDiff = computeDiff
142
+ /// Exported for testing @internal
143
+ static computeDiff = computeDiff
144
+ }
142
145
 
143
- // : ([[Change]], (any, any) → any, number, number) → [Change]
144
146
  // Divide-and-conquer approach to merging a series of ranges.
145
- function mergeAll(ranges, combine, start = 0, end = ranges.length) {
147
+ function mergeAll<Data>(
148
+ ranges: readonly Change<Data>[],
149
+ combine: (dA: Data, dB: Data) => Data,
150
+ start = 0, end = ranges.length
151
+ ): readonly Change<Data>[] {
146
152
  if (end == start + 1) return [ranges[start]]
147
153
  let mid = (start + end) >> 1
148
154
  return Change.merge(mergeAll(ranges, combine, start, mid),
149
155
  mergeAll(ranges, combine, mid, end), combine)
150
156
  }
151
157
 
152
- function endRange(maps) {
158
+ function endRange(maps: readonly StepMap[]) {
153
159
  let from = 2e8, to = -2e8
154
160
  for (let i = 0; i < maps.length; i++) {
155
161
  let map = maps[i]
@@ -165,19 +171,19 @@ function endRange(maps) {
165
171
  return from == 2e8 ? null : {from, to}
166
172
  }
167
173
 
168
- function touchedRange(maps) {
174
+ function touchedRange(maps: readonly StepMap[]) {
169
175
  let b = endRange(maps)
170
176
  if (!b) return null
171
- let a = endRange(maps.map(m => m.invert()).reverse())
177
+ let a = endRange(maps.map(m => m.invert()).reverse())!
172
178
  return {fromA: a.from, toA: a.to, fromB: b.from, toB: b.to}
173
179
  }
174
180
 
175
- function sameRanges(a, b, map) {
181
+ function sameRanges<Data>(a: Change<Data>, b: Change<Data>, map: (pos: number) => number) {
176
182
  return map(a.fromB) == b.fromB && map(a.toB) == b.toB &&
177
183
  sameSpans(a.deleted, b.deleted) && sameSpans(a.inserted, b.inserted)
178
184
  }
179
185
 
180
- function sameSpans(a, b) {
186
+ function sameSpans<Data>(a: readonly Span<Data>[], b: readonly Span<Data>[]) {
181
187
  if (a.length != b.length) return false
182
188
  for (let i = 0; i < a.length; i++)
183
189
  if (a[i].length != b[i].length || a[i].data !== b[i].data) return false