@vscode/markdown-editor 0.0.2-39 → 0.0.2-40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +67 -1
- package/dist/index.js +1151 -1041
- package/dist/index.js.map +1 -1
- package/dist/{stringEdit-DzLs4E1d.js → stringEdit-CVDbCUBY.js} +85 -47
- package/dist/stringEdit-CVDbCUBY.js.map +1 -0
- package/dist/web-editors.d.ts +5 -0
- package/dist/web-editors.js +1 -1
- package/package.json +1 -1
- package/dist/stringEdit-DzLs4E1d.js.map +0 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
class
|
|
1
|
+
class s {
|
|
2
2
|
constructor(e, t) {
|
|
3
3
|
if (this.start = e, this.endExclusive = t, e > t)
|
|
4
4
|
throw new Error(`Invalid range: [${e}, ${t})`);
|
|
5
5
|
}
|
|
6
6
|
static fromTo(e, t) {
|
|
7
|
-
return new
|
|
7
|
+
return new s(e, t);
|
|
8
8
|
}
|
|
9
9
|
static ofLength(e) {
|
|
10
|
-
return new
|
|
10
|
+
return new s(0, e);
|
|
11
11
|
}
|
|
12
12
|
static ofStartAndLength(e, t) {
|
|
13
|
-
return new
|
|
13
|
+
return new s(e, e + t);
|
|
14
14
|
}
|
|
15
15
|
static emptyAt(e) {
|
|
16
|
-
return new
|
|
16
|
+
return new s(e, e);
|
|
17
17
|
}
|
|
18
18
|
get isEmpty() {
|
|
19
19
|
return this.start === this.endExclusive;
|
|
@@ -22,13 +22,13 @@ class r {
|
|
|
22
22
|
return this.endExclusive - this.start;
|
|
23
23
|
}
|
|
24
24
|
delta(e) {
|
|
25
|
-
return new
|
|
25
|
+
return new s(this.start + e, this.endExclusive + e);
|
|
26
26
|
}
|
|
27
27
|
deltaStart(e) {
|
|
28
|
-
return new
|
|
28
|
+
return new s(this.start + e, this.endExclusive);
|
|
29
29
|
}
|
|
30
30
|
deltaEnd(e) {
|
|
31
|
-
return new
|
|
31
|
+
return new s(this.start, this.endExclusive + e);
|
|
32
32
|
}
|
|
33
33
|
contains(e) {
|
|
34
34
|
return this.start <= e && e < this.endExclusive;
|
|
@@ -43,12 +43,12 @@ class r {
|
|
|
43
43
|
return Math.max(this.start, e.start) <= Math.min(this.endExclusive, e.endExclusive);
|
|
44
44
|
}
|
|
45
45
|
intersect(e) {
|
|
46
|
-
const t = Math.max(this.start, e.start),
|
|
47
|
-
if (t <=
|
|
48
|
-
return new
|
|
46
|
+
const t = Math.max(this.start, e.start), n = Math.min(this.endExclusive, e.endExclusive);
|
|
47
|
+
if (t <= n)
|
|
48
|
+
return new s(t, n);
|
|
49
49
|
}
|
|
50
50
|
join(e) {
|
|
51
|
-
return new
|
|
51
|
+
return new s(
|
|
52
52
|
Math.min(this.start, e.start),
|
|
53
53
|
Math.max(this.endExclusive, e.endExclusive)
|
|
54
54
|
);
|
|
@@ -72,18 +72,18 @@ class r {
|
|
|
72
72
|
return `[${this.start}, ${this.endExclusive})`;
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
|
-
class
|
|
75
|
+
class a {
|
|
76
76
|
constructor(e, t) {
|
|
77
77
|
this.replaceRange = e, this.newText = t;
|
|
78
78
|
}
|
|
79
79
|
static insert(e, t) {
|
|
80
|
-
return new
|
|
80
|
+
return new a(s.emptyAt(e), t);
|
|
81
81
|
}
|
|
82
82
|
static replace(e, t) {
|
|
83
|
-
return new
|
|
83
|
+
return new a(e, t);
|
|
84
84
|
}
|
|
85
85
|
static delete(e) {
|
|
86
|
-
return new
|
|
86
|
+
return new a(e, "");
|
|
87
87
|
}
|
|
88
88
|
get isEmpty() {
|
|
89
89
|
return this.replaceRange.isEmpty && this.newText.length === 0;
|
|
@@ -91,33 +91,65 @@ class i {
|
|
|
91
91
|
equals(e) {
|
|
92
92
|
return this.replaceRange.equals(e.replaceRange) && this.newText === e.newText;
|
|
93
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Narrows this replacement to the span that actually changes, by trimming
|
|
96
|
+
* the prefix and suffix it shares with the text it replaces in `source`.
|
|
97
|
+
*/
|
|
98
|
+
removeCommonSuffixPrefix(e) {
|
|
99
|
+
const t = this.replaceRange.substring(e), n = h(t, this.newText), r = Math.min(
|
|
100
|
+
t.length - n,
|
|
101
|
+
this.newText.length - n,
|
|
102
|
+
u(t, this.newText)
|
|
103
|
+
);
|
|
104
|
+
return new a(
|
|
105
|
+
new s(
|
|
106
|
+
this.replaceRange.start + n,
|
|
107
|
+
this.replaceRange.endExclusive - r
|
|
108
|
+
),
|
|
109
|
+
this.newText.substring(n, this.newText.length - r)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
94
112
|
toString() {
|
|
95
113
|
return `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;
|
|
96
114
|
}
|
|
97
115
|
}
|
|
98
|
-
|
|
99
|
-
|
|
116
|
+
function h(i, e) {
|
|
117
|
+
const t = Math.min(i.length, e.length);
|
|
118
|
+
let n = 0;
|
|
119
|
+
for (; n < t && i.charCodeAt(n) === e.charCodeAt(n); )
|
|
120
|
+
n++;
|
|
121
|
+
return n;
|
|
122
|
+
}
|
|
123
|
+
function u(i, e) {
|
|
124
|
+
const t = Math.min(i.length, e.length);
|
|
125
|
+
let n = 0;
|
|
126
|
+
for (; n < t && i.charCodeAt(i.length - n - 1) === e.charCodeAt(e.length - n - 1); )
|
|
127
|
+
n++;
|
|
128
|
+
return n;
|
|
129
|
+
}
|
|
130
|
+
class l {
|
|
131
|
+
static empty = new l([]);
|
|
100
132
|
static single(e) {
|
|
101
|
-
return new
|
|
133
|
+
return new l([e]);
|
|
102
134
|
}
|
|
103
135
|
static replace(e, t) {
|
|
104
|
-
return new
|
|
136
|
+
return new l([a.replace(e, t)]);
|
|
105
137
|
}
|
|
106
138
|
static insert(e, t) {
|
|
107
|
-
return new
|
|
139
|
+
return new l([a.insert(e, t)]);
|
|
108
140
|
}
|
|
109
141
|
static delete(e) {
|
|
110
|
-
return new
|
|
142
|
+
return new l([a.delete(e)]);
|
|
111
143
|
}
|
|
112
144
|
replacements;
|
|
113
145
|
constructor(e) {
|
|
114
146
|
let t = -1;
|
|
115
|
-
for (const
|
|
116
|
-
if (
|
|
147
|
+
for (const n of e) {
|
|
148
|
+
if (n.replaceRange.start < t)
|
|
117
149
|
throw new Error(
|
|
118
|
-
`Edits must be disjoint and sorted. Found ${
|
|
150
|
+
`Edits must be disjoint and sorted. Found ${n} after ${t}`
|
|
119
151
|
);
|
|
120
|
-
t =
|
|
152
|
+
t = n.replaceRange.endExclusive;
|
|
121
153
|
}
|
|
122
154
|
this.replacements = e;
|
|
123
155
|
}
|
|
@@ -126,24 +158,24 @@ class a {
|
|
|
126
158
|
}
|
|
127
159
|
apply(e) {
|
|
128
160
|
const t = [];
|
|
129
|
-
let
|
|
130
|
-
for (const
|
|
131
|
-
t.push(e.substring(
|
|
132
|
-
return t.push(e.substring(
|
|
161
|
+
let n = 0;
|
|
162
|
+
for (const r of this.replacements)
|
|
163
|
+
t.push(e.substring(n, r.replaceRange.start)), t.push(r.newText), n = r.replaceRange.endExclusive;
|
|
164
|
+
return t.push(e.substring(n)), t.join("");
|
|
133
165
|
}
|
|
134
166
|
inverse(e) {
|
|
135
167
|
const t = [];
|
|
136
|
-
let
|
|
137
|
-
for (const
|
|
138
|
-
const
|
|
168
|
+
let n = 0;
|
|
169
|
+
for (const r of this.replacements) {
|
|
170
|
+
const c = e.substring(r.replaceRange.start, r.replaceRange.endExclusive);
|
|
139
171
|
t.push(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
172
|
+
a.replace(
|
|
173
|
+
s.ofStartAndLength(r.replaceRange.start + n, r.newText.length),
|
|
174
|
+
c
|
|
143
175
|
)
|
|
144
|
-
),
|
|
176
|
+
), n += r.newText.length - r.replaceRange.length;
|
|
145
177
|
}
|
|
146
|
-
return new
|
|
178
|
+
return new l(t);
|
|
147
179
|
}
|
|
148
180
|
equals(e) {
|
|
149
181
|
if (this.replacements.length !== e.replacements.length)
|
|
@@ -155,13 +187,13 @@ class a {
|
|
|
155
187
|
}
|
|
156
188
|
mapOffset(e) {
|
|
157
189
|
let t = 0;
|
|
158
|
-
for (const
|
|
159
|
-
if (
|
|
190
|
+
for (const n of this.replacements) {
|
|
191
|
+
if (n.replaceRange.start > e)
|
|
160
192
|
break;
|
|
161
|
-
if (
|
|
162
|
-
t +=
|
|
193
|
+
if (n.replaceRange.endExclusive <= e)
|
|
194
|
+
t += n.newText.length - n.replaceRange.length;
|
|
163
195
|
else
|
|
164
|
-
return
|
|
196
|
+
return n.replaceRange.start + t + n.newText.length;
|
|
165
197
|
}
|
|
166
198
|
return e + t;
|
|
167
199
|
}
|
|
@@ -169,9 +201,15 @@ class a {
|
|
|
169
201
|
return `[${this.replacements.map((e) => e.toString()).join(", ")}]`;
|
|
170
202
|
}
|
|
171
203
|
}
|
|
204
|
+
function o(i, e) {
|
|
205
|
+
return i === e ? l.empty : l.single(
|
|
206
|
+
a.replace(new s(0, i.length), e).removeCommonSuffixPrefix(i)
|
|
207
|
+
);
|
|
208
|
+
}
|
|
172
209
|
export {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
210
|
+
s as O,
|
|
211
|
+
l as S,
|
|
212
|
+
a,
|
|
213
|
+
o as c
|
|
176
214
|
};
|
|
177
|
-
//# sourceMappingURL=stringEdit-
|
|
215
|
+
//# sourceMappingURL=stringEdit-CVDbCUBY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stringEdit-CVDbCUBY.js","sources":["../src/core/offsetRange.ts","../src/core/stringEdit.ts"],"sourcesContent":["export class OffsetRange {\n\tpublic static fromTo(start: number, endExclusive: number): OffsetRange {\n\t\treturn new OffsetRange(start, endExclusive);\n\t}\n\n\tpublic static ofLength(length: number): OffsetRange {\n\t\treturn new OffsetRange(0, length);\n\t}\n\n\tpublic static ofStartAndLength(start: number, length: number): OffsetRange {\n\t\treturn new OffsetRange(start, start + length);\n\t}\n\n\tpublic static emptyAt(offset: number): OffsetRange {\n\t\treturn new OffsetRange(offset, offset);\n\t}\n\n\tconstructor(\n\t\tpublic readonly start: number,\n\t\tpublic readonly endExclusive: number,\n\t) {\n\t\tif (start > endExclusive) {\n\t\t\tthrow new Error(`Invalid range: [${start}, ${endExclusive})`);\n\t\t}\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.start === this.endExclusive;\n\t}\n\n\tget length(): number {\n\t\treturn this.endExclusive - this.start;\n\t}\n\n\tpublic delta(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive + offset);\n\t}\n\n\tpublic deltaStart(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive);\n\t}\n\n\tpublic deltaEnd(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start, this.endExclusive + offset);\n\t}\n\n\tpublic contains(offset: number): boolean {\n\t\treturn this.start <= offset && offset < this.endExclusive;\n\t}\n\n\tpublic containsRange(other: OffsetRange): boolean {\n\t\treturn this.start <= other.start && other.endExclusive <= this.endExclusive;\n\t}\n\n\tpublic intersects(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) < Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersectsOrTouches(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) <= Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersect(other: OffsetRange): OffsetRange | undefined {\n\t\tconst start = Math.max(this.start, other.start);\n\t\tconst end = Math.min(this.endExclusive, other.endExclusive);\n\t\tif (start <= end) {\n\t\t\treturn new OffsetRange(start, end);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic join(other: OffsetRange): OffsetRange {\n\t\treturn new OffsetRange(\n\t\t\tMath.min(this.start, other.start),\n\t\t\tMath.max(this.endExclusive, other.endExclusive),\n\t\t);\n\t}\n\n\tpublic isBefore(other: OffsetRange): boolean {\n\t\treturn this.endExclusive <= other.start;\n\t}\n\n\tpublic isAfter(other: OffsetRange): boolean {\n\t\treturn this.start >= other.endExclusive;\n\t}\n\n\tpublic substring(str: string): string {\n\t\treturn str.substring(this.start, this.endExclusive);\n\t}\n\n\tpublic slice<T>(arr: readonly T[]): T[] {\n\t\treturn arr.slice(this.start, this.endExclusive);\n\t}\n\n\tpublic equals(other: OffsetRange): boolean {\n\t\treturn this.start === other.start && this.endExclusive === other.endExclusive;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.start}, ${this.endExclusive})`;\n\t}\n}\n","import { OffsetRange } from './offsetRange.js';\n\nexport class StringReplacement {\n\tpublic static insert(offset: number, text: string): StringReplacement {\n\t\treturn new StringReplacement(OffsetRange.emptyAt(offset), text);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringReplacement {\n\t\treturn new StringReplacement(range, text);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringReplacement {\n\t\treturn new StringReplacement(range, '');\n\t}\n\n\tconstructor(\n\t\tpublic readonly replaceRange: OffsetRange,\n\t\tpublic readonly newText: string,\n\t) {}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replaceRange.isEmpty && this.newText.length === 0;\n\t}\n\n\tpublic equals(other: StringReplacement): boolean {\n\t\treturn this.replaceRange.equals(other.replaceRange) && this.newText === other.newText;\n\t}\n\n\t/**\n\t * Narrows this replacement to the span that actually changes, by trimming\n\t * the prefix and suffix it shares with the text it replaces in `source`.\n\t */\n\tpublic removeCommonSuffixPrefix(source: string): StringReplacement {\n\t\tconst oldText = this.replaceRange.substring(source);\n\n\t\tconst prefixLength = commonPrefixLength(oldText, this.newText);\n\t\tconst suffixLength = Math.min(\n\t\t\toldText.length - prefixLength,\n\t\t\tthis.newText.length - prefixLength,\n\t\t\tcommonSuffixLength(oldText, this.newText),\n\t\t);\n\n\t\treturn new StringReplacement(\n\t\t\tnew OffsetRange(\n\t\t\t\tthis.replaceRange.start + prefixLength,\n\t\t\t\tthis.replaceRange.endExclusive - suffixLength,\n\t\t\t),\n\t\t\tthis.newText.substring(prefixLength, this.newText.length - suffixLength),\n\t\t);\n\t}\n\n\tpublic toString(): string {\n\t\treturn `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;\n\t}\n}\n\n/** The length of the common prefix of `a` and `b`. */\nfunction commonPrefixLength(a: string, b: string): number {\n\tconst maxLength = Math.min(a.length, b.length);\n\tlet length = 0;\n\twhile (length < maxLength && a.charCodeAt(length) === b.charCodeAt(length)) {\n\t\tlength++;\n\t}\n\treturn length;\n}\n\n/** The length of the common suffix of `a` and `b`. */\nfunction commonSuffixLength(a: string, b: string): number {\n\tconst maxLength = Math.min(a.length, b.length);\n\tlet length = 0;\n\twhile (\n\t\tlength < maxLength\n\t\t&& a.charCodeAt(a.length - length - 1) === b.charCodeAt(b.length - length - 1)\n\t) {\n\t\tlength++;\n\t}\n\treturn length;\n}\n\nexport class StringEdit {\n\tpublic static readonly empty = new StringEdit([]);\n\n\tpublic static single(replacement: StringReplacement): StringEdit {\n\t\treturn new StringEdit([replacement]);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.replace(range, text)]);\n\t}\n\n\tpublic static insert(offset: number, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.insert(offset, text)]);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringEdit {\n\t\treturn new StringEdit([StringReplacement.delete(range)]);\n\t}\n\n\tpublic readonly replacements: readonly StringReplacement[];\n\n\tconstructor(replacements: readonly StringReplacement[]) {\n\t\tlet lastEndEx = -1;\n\t\tfor (const replacement of replacements) {\n\t\t\tif (replacement.replaceRange.start < lastEndEx) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Edits must be disjoint and sorted. Found ${replacement} after ${lastEndEx}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlastEndEx = replacement.replaceRange.endExclusive;\n\t\t}\n\t\tthis.replacements = replacements;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replacements.length === 0;\n\t}\n\n\tpublic apply(base: string): string {\n\t\tconst parts: string[] = [];\n\t\tlet pos = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tparts.push(base.substring(pos, r.replaceRange.start));\n\t\t\tparts.push(r.newText);\n\t\t\tpos = r.replaceRange.endExclusive;\n\t\t}\n\t\tparts.push(base.substring(pos));\n\t\treturn parts.join('');\n\t}\n\n\tpublic inverse(original: string): StringEdit {\n\t\tconst edits: StringReplacement[] = [];\n\t\tlet offset = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tconst oldText = original.substring(r.replaceRange.start, r.replaceRange.endExclusive);\n\t\t\tedits.push(\n\t\t\t\tStringReplacement.replace(\n\t\t\t\t\tOffsetRange.ofStartAndLength(r.replaceRange.start + offset, r.newText.length),\n\t\t\t\t\toldText,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset += r.newText.length - r.replaceRange.length;\n\t\t}\n\t\treturn new StringEdit(edits);\n\t}\n\n\tpublic equals(other: StringEdit): boolean {\n\t\tif (this.replacements.length !== other.replacements.length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (let i = 0; i < this.replacements.length; i++) {\n\t\t\tif (!this.replacements[i].equals(other.replacements[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic mapOffset(offset: number): number {\n\t\tlet delta = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tif (r.replaceRange.start > offset) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (r.replaceRange.endExclusive <= offset) {\n\t\t\t\tdelta += r.newText.length - r.replaceRange.length;\n\t\t\t} else {\n\t\t\t\t// offset is inside a replaced range — map to end of replacement\n\t\t\t\treturn r.replaceRange.start + delta + r.newText.length;\n\t\t\t}\n\t\t}\n\t\treturn offset + delta;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.replacements.map(r => r.toString()).join(', ')}]`;\n\t}\n}\n\n/**\n * Computes the smallest single replacement that transforms `original` into\n * `modified`.\n *\n * Distinct from {@link computeStringEdit}, which produces a word-level\n * multi-hunk diff but requires the asynchronously loaded `@vscode/diff`\n * computer and throws before it is ready. This one is synchronous and\n * dependency-free, so it is safe on the edit-application and history paths.\n */\nexport function computeMinimalEdit(original: string, modified: string): StringEdit {\n\tif (original === modified) {\n\t\treturn StringEdit.empty;\n\t}\n\n\treturn StringEdit.single(\n\t\tStringReplacement\n\t\t\t.replace(new OffsetRange(0, original.length), modified)\n\t\t\t.removeCommonSuffixPrefix(original),\n\t);\n}\n"],"names":["OffsetRange","start","endExclusive","length","offset","other","end","str","arr","StringReplacement","replaceRange","newText","text","range","source","oldText","prefixLength","commonPrefixLength","suffixLength","commonSuffixLength","a","b","maxLength","StringEdit","replacement","replacements","lastEndEx","base","parts","pos","original","edits","i","delta","r","computeMinimalEdit","modified"],"mappings":"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"}
|
package/dist/web-editors.d.ts
CHANGED
|
@@ -119,6 +119,11 @@ declare class StringReplacement {
|
|
|
119
119
|
constructor(replaceRange: OffsetRange, newText: string);
|
|
120
120
|
get isEmpty(): boolean;
|
|
121
121
|
equals(other: StringReplacement): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Narrows this replacement to the span that actually changes, by trimming
|
|
124
|
+
* the prefix and suffix it shares with the text it replaces in `source`.
|
|
125
|
+
*/
|
|
126
|
+
removeCommonSuffixPrefix(source: string): StringReplacement;
|
|
122
127
|
toString(): string;
|
|
123
128
|
}
|
|
124
129
|
|
package/dist/web-editors.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stringEdit-DzLs4E1d.js","sources":["../src/core/offsetRange.ts","../src/core/stringEdit.ts"],"sourcesContent":["export class OffsetRange {\n\tpublic static fromTo(start: number, endExclusive: number): OffsetRange {\n\t\treturn new OffsetRange(start, endExclusive);\n\t}\n\n\tpublic static ofLength(length: number): OffsetRange {\n\t\treturn new OffsetRange(0, length);\n\t}\n\n\tpublic static ofStartAndLength(start: number, length: number): OffsetRange {\n\t\treturn new OffsetRange(start, start + length);\n\t}\n\n\tpublic static emptyAt(offset: number): OffsetRange {\n\t\treturn new OffsetRange(offset, offset);\n\t}\n\n\tconstructor(\n\t\tpublic readonly start: number,\n\t\tpublic readonly endExclusive: number,\n\t) {\n\t\tif (start > endExclusive) {\n\t\t\tthrow new Error(`Invalid range: [${start}, ${endExclusive})`);\n\t\t}\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.start === this.endExclusive;\n\t}\n\n\tget length(): number {\n\t\treturn this.endExclusive - this.start;\n\t}\n\n\tpublic delta(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive + offset);\n\t}\n\n\tpublic deltaStart(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive);\n\t}\n\n\tpublic deltaEnd(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start, this.endExclusive + offset);\n\t}\n\n\tpublic contains(offset: number): boolean {\n\t\treturn this.start <= offset && offset < this.endExclusive;\n\t}\n\n\tpublic containsRange(other: OffsetRange): boolean {\n\t\treturn this.start <= other.start && other.endExclusive <= this.endExclusive;\n\t}\n\n\tpublic intersects(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) < Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersectsOrTouches(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) <= Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersect(other: OffsetRange): OffsetRange | undefined {\n\t\tconst start = Math.max(this.start, other.start);\n\t\tconst end = Math.min(this.endExclusive, other.endExclusive);\n\t\tif (start <= end) {\n\t\t\treturn new OffsetRange(start, end);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic join(other: OffsetRange): OffsetRange {\n\t\treturn new OffsetRange(\n\t\t\tMath.min(this.start, other.start),\n\t\t\tMath.max(this.endExclusive, other.endExclusive),\n\t\t);\n\t}\n\n\tpublic isBefore(other: OffsetRange): boolean {\n\t\treturn this.endExclusive <= other.start;\n\t}\n\n\tpublic isAfter(other: OffsetRange): boolean {\n\t\treturn this.start >= other.endExclusive;\n\t}\n\n\tpublic substring(str: string): string {\n\t\treturn str.substring(this.start, this.endExclusive);\n\t}\n\n\tpublic slice<T>(arr: readonly T[]): T[] {\n\t\treturn arr.slice(this.start, this.endExclusive);\n\t}\n\n\tpublic equals(other: OffsetRange): boolean {\n\t\treturn this.start === other.start && this.endExclusive === other.endExclusive;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.start}, ${this.endExclusive})`;\n\t}\n}\n","import { OffsetRange } from './offsetRange.js';\n\nexport class StringReplacement {\n\tpublic static insert(offset: number, text: string): StringReplacement {\n\t\treturn new StringReplacement(OffsetRange.emptyAt(offset), text);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringReplacement {\n\t\treturn new StringReplacement(range, text);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringReplacement {\n\t\treturn new StringReplacement(range, '');\n\t}\n\n\tconstructor(\n\t\tpublic readonly replaceRange: OffsetRange,\n\t\tpublic readonly newText: string,\n\t) {}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replaceRange.isEmpty && this.newText.length === 0;\n\t}\n\n\tpublic equals(other: StringReplacement): boolean {\n\t\treturn this.replaceRange.equals(other.replaceRange) && this.newText === other.newText;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;\n\t}\n}\n\nexport class StringEdit {\n\tpublic static readonly empty = new StringEdit([]);\n\n\tpublic static single(replacement: StringReplacement): StringEdit {\n\t\treturn new StringEdit([replacement]);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.replace(range, text)]);\n\t}\n\n\tpublic static insert(offset: number, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.insert(offset, text)]);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringEdit {\n\t\treturn new StringEdit([StringReplacement.delete(range)]);\n\t}\n\n\tpublic readonly replacements: readonly StringReplacement[];\n\n\tconstructor(replacements: readonly StringReplacement[]) {\n\t\tlet lastEndEx = -1;\n\t\tfor (const replacement of replacements) {\n\t\t\tif (replacement.replaceRange.start < lastEndEx) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Edits must be disjoint and sorted. Found ${replacement} after ${lastEndEx}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlastEndEx = replacement.replaceRange.endExclusive;\n\t\t}\n\t\tthis.replacements = replacements;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replacements.length === 0;\n\t}\n\n\tpublic apply(base: string): string {\n\t\tconst parts: string[] = [];\n\t\tlet pos = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tparts.push(base.substring(pos, r.replaceRange.start));\n\t\t\tparts.push(r.newText);\n\t\t\tpos = r.replaceRange.endExclusive;\n\t\t}\n\t\tparts.push(base.substring(pos));\n\t\treturn parts.join('');\n\t}\n\n\tpublic inverse(original: string): StringEdit {\n\t\tconst edits: StringReplacement[] = [];\n\t\tlet offset = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tconst oldText = original.substring(r.replaceRange.start, r.replaceRange.endExclusive);\n\t\t\tedits.push(\n\t\t\t\tStringReplacement.replace(\n\t\t\t\t\tOffsetRange.ofStartAndLength(r.replaceRange.start + offset, r.newText.length),\n\t\t\t\t\toldText,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset += r.newText.length - r.replaceRange.length;\n\t\t}\n\t\treturn new StringEdit(edits);\n\t}\n\n\tpublic equals(other: StringEdit): boolean {\n\t\tif (this.replacements.length !== other.replacements.length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (let i = 0; i < this.replacements.length; i++) {\n\t\t\tif (!this.replacements[i].equals(other.replacements[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic mapOffset(offset: number): number {\n\t\tlet delta = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tif (r.replaceRange.start > offset) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (r.replaceRange.endExclusive <= offset) {\n\t\t\t\tdelta += r.newText.length - r.replaceRange.length;\n\t\t\t} else {\n\t\t\t\t// offset is inside a replaced range — map to end of replacement\n\t\t\t\treturn r.replaceRange.start + delta + r.newText.length;\n\t\t\t}\n\t\t}\n\t\treturn offset + delta;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.replacements.map(r => r.toString()).join(', ')}]`;\n\t}\n}\n"],"names":["OffsetRange","start","endExclusive","length","offset","other","end","str","arr","StringReplacement","replaceRange","newText","text","range","StringEdit","replacement","replacements","lastEndEx","base","parts","pos","r","original","edits","oldText","i","delta"],"mappings":"AAAO,MAAMA,EAAY;AAAA,EAiBxB,YACiBC,GACAC,GACf;AACD,QAHgB,KAAA,QAAAD,GACA,KAAA,eAAAC,GAEZD,IAAQC;AACX,YAAM,IAAI,MAAM,mBAAmBD,CAAK,KAAKC,CAAY,GAAG;AAAA,EAE9D;AAAA,EAvBA,OAAc,OAAOD,GAAeC,GAAmC;AACtE,WAAO,IAAIF,EAAYC,GAAOC,CAAY;AAAA,EAC3C;AAAA,EAEA,OAAc,SAASC,GAA6B;AACnD,WAAO,IAAIH,EAAY,GAAGG,CAAM;AAAA,EACjC;AAAA,EAEA,OAAc,iBAAiBF,GAAeE,GAA6B;AAC1E,WAAO,IAAIH,EAAYC,GAAOA,IAAQE,CAAM;AAAA,EAC7C;AAAA,EAEA,OAAc,QAAQC,GAA6B;AAClD,WAAO,IAAIJ,EAAYI,GAAQA,CAAM;AAAA,EACtC;AAAA,EAWA,IAAI,UAAmB;AACtB,WAAO,KAAK,UAAU,KAAK;AAAA,EAC5B;AAAA,EAEA,IAAI,SAAiB;AACpB,WAAO,KAAK,eAAe,KAAK;AAAA,EACjC;AAAA,EAEO,MAAMA,GAA6B;AACzC,WAAO,IAAIJ,EAAY,KAAK,QAAQI,GAAQ,KAAK,eAAeA,CAAM;AAAA,EACvE;AAAA,EAEO,WAAWA,GAA6B;AAC9C,WAAO,IAAIJ,EAAY,KAAK,QAAQI,GAAQ,KAAK,YAAY;AAAA,EAC9D;AAAA,EAEO,SAASA,GAA6B;AAC5C,WAAO,IAAIJ,EAAY,KAAK,OAAO,KAAK,eAAeI,CAAM;AAAA,EAC9D;AAAA,EAEO,SAASA,GAAyB;AACxC,WAAO,KAAK,SAASA,KAAUA,IAAS,KAAK;AAAA,EAC9C;AAAA,EAEO,cAAcC,GAA6B;AACjD,WAAO,KAAK,SAASA,EAAM,SAASA,EAAM,gBAAgB,KAAK;AAAA,EAChE;AAAA,EAEO,WAAWA,GAA6B;AAC9C,WAAO,KAAK,IAAI,KAAK,OAAOA,EAAM,KAAK,IAAI,KAAK,IAAI,KAAK,cAAcA,EAAM,YAAY;AAAA,EAC1F;AAAA,EAEO,oBAAoBA,GAA6B;AACvD,WAAO,KAAK,IAAI,KAAK,OAAOA,EAAM,KAAK,KAAK,KAAK,IAAI,KAAK,cAAcA,EAAM,YAAY;AAAA,EAC3F;AAAA,EAEO,UAAUA,GAA6C;AAC7D,UAAMJ,IAAQ,KAAK,IAAI,KAAK,OAAOI,EAAM,KAAK,GACxCC,IAAM,KAAK,IAAI,KAAK,cAAcD,EAAM,YAAY;AAC1D,QAAIJ,KAASK;AACZ,aAAO,IAAIN,EAAYC,GAAOK,CAAG;AAAA,EAGnC;AAAA,EAEO,KAAKD,GAAiC;AAC5C,WAAO,IAAIL;AAAA,MACV,KAAK,IAAI,KAAK,OAAOK,EAAM,KAAK;AAAA,MAChC,KAAK,IAAI,KAAK,cAAcA,EAAM,YAAY;AAAA,IAAA;AAAA,EAEhD;AAAA,EAEO,SAASA,GAA6B;AAC5C,WAAO,KAAK,gBAAgBA,EAAM;AAAA,EACnC;AAAA,EAEO,QAAQA,GAA6B;AAC3C,WAAO,KAAK,SAASA,EAAM;AAAA,EAC5B;AAAA,EAEO,UAAUE,GAAqB;AACrC,WAAOA,EAAI,UAAU,KAAK,OAAO,KAAK,YAAY;AAAA,EACnD;AAAA,EAEO,MAASC,GAAwB;AACvC,WAAOA,EAAI,MAAM,KAAK,OAAO,KAAK,YAAY;AAAA,EAC/C;AAAA,EAEO,OAAOH,GAA6B;AAC1C,WAAO,KAAK,UAAUA,EAAM,SAAS,KAAK,iBAAiBA,EAAM;AAAA,EAClE;AAAA,EAEO,WAAmB;AACzB,WAAO,IAAI,KAAK,KAAK,KAAK,KAAK,YAAY;AAAA,EAC5C;AACD;ACnGO,MAAMI,EAAkB;AAAA,EAa9B,YACiBC,GACAC,GACf;AAFe,SAAA,eAAAD,GACA,KAAA,UAAAC;AAAA,EACd;AAAA,EAfH,OAAc,OAAOP,GAAgBQ,GAAiC;AACrE,WAAO,IAAIH,EAAkBT,EAAY,QAAQI,CAAM,GAAGQ,CAAI;AAAA,EAC/D;AAAA,EAEA,OAAc,QAAQC,GAAoBD,GAAiC;AAC1E,WAAO,IAAIH,EAAkBI,GAAOD,CAAI;AAAA,EACzC;AAAA,EAEA,OAAc,OAAOC,GAAuC;AAC3D,WAAO,IAAIJ,EAAkBI,GAAO,EAAE;AAAA,EACvC;AAAA,EAOA,IAAI,UAAmB;AACtB,WAAO,KAAK,aAAa,WAAW,KAAK,QAAQ,WAAW;AAAA,EAC7D;AAAA,EAEO,OAAOR,GAAmC;AAChD,WAAO,KAAK,aAAa,OAAOA,EAAM,YAAY,KAAK,KAAK,YAAYA,EAAM;AAAA,EAC/E;AAAA,EAEO,WAAmB;AACzB,WAAO,GAAG,KAAK,YAAY,OAAO,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EAC/D;AACD;AAEO,MAAMS,EAAW;AAAA,EACvB,OAAuB,QAAQ,IAAIA,EAAW,EAAE;AAAA,EAEhD,OAAc,OAAOC,GAA4C;AAChE,WAAO,IAAID,EAAW,CAACC,CAAW,CAAC;AAAA,EACpC;AAAA,EAEA,OAAc,QAAQF,GAAoBD,GAA0B;AACnE,WAAO,IAAIE,EAAW,CAACL,EAAkB,QAAQI,GAAOD,CAAI,CAAC,CAAC;AAAA,EAC/D;AAAA,EAEA,OAAc,OAAOR,GAAgBQ,GAA0B;AAC9D,WAAO,IAAIE,EAAW,CAACL,EAAkB,OAAOL,GAAQQ,CAAI,CAAC,CAAC;AAAA,EAC/D;AAAA,EAEA,OAAc,OAAOC,GAAgC;AACpD,WAAO,IAAIC,EAAW,CAACL,EAAkB,OAAOI,CAAK,CAAC,CAAC;AAAA,EACxD;AAAA,EAEgB;AAAA,EAEhB,YAAYG,GAA4C;AACvD,QAAIC,IAAY;AAChB,eAAWF,KAAeC,GAAc;AACvC,UAAID,EAAY,aAAa,QAAQE;AACpC,cAAM,IAAI;AAAA,UACT,4CAA4CF,CAAW,UAAUE,CAAS;AAAA,QAAA;AAG5E,MAAAA,IAAYF,EAAY,aAAa;AAAA,IACtC;AACA,SAAK,eAAeC;AAAA,EACrB;AAAA,EAEA,IAAI,UAAmB;AACtB,WAAO,KAAK,aAAa,WAAW;AAAA,EACrC;AAAA,EAEO,MAAME,GAAsB;AAClC,UAAMC,IAAkB,CAAA;AACxB,QAAIC,IAAM;AACV,eAAWC,KAAK,KAAK;AACpB,MAAAF,EAAM,KAAKD,EAAK,UAAUE,GAAKC,EAAE,aAAa,KAAK,CAAC,GACpDF,EAAM,KAAKE,EAAE,OAAO,GACpBD,IAAMC,EAAE,aAAa;AAEtB,WAAAF,EAAM,KAAKD,EAAK,UAAUE,CAAG,CAAC,GACvBD,EAAM,KAAK,EAAE;AAAA,EACrB;AAAA,EAEO,QAAQG,GAA8B;AAC5C,UAAMC,IAA6B,CAAA;AACnC,QAAInB,IAAS;AACb,eAAWiB,KAAK,KAAK,cAAc;AAClC,YAAMG,IAAUF,EAAS,UAAUD,EAAE,aAAa,OAAOA,EAAE,aAAa,YAAY;AACpF,MAAAE,EAAM;AAAA,QACLd,EAAkB;AAAA,UACjBT,EAAY,iBAAiBqB,EAAE,aAAa,QAAQjB,GAAQiB,EAAE,QAAQ,MAAM;AAAA,UAC5EG;AAAA,QAAA;AAAA,MACD,GAEDpB,KAAUiB,EAAE,QAAQ,SAASA,EAAE,aAAa;AAAA,IAC7C;AACA,WAAO,IAAIP,EAAWS,CAAK;AAAA,EAC5B;AAAA,EAEO,OAAOlB,GAA4B;AACzC,QAAI,KAAK,aAAa,WAAWA,EAAM,aAAa;AACnD,aAAO;AAER,aAASoB,IAAI,GAAGA,IAAI,KAAK,aAAa,QAAQA;AAC7C,UAAI,CAAC,KAAK,aAAaA,CAAC,EAAE,OAAOpB,EAAM,aAAaoB,CAAC,CAAC;AACrD,eAAO;AAGT,WAAO;AAAA,EACR;AAAA,EAEO,UAAUrB,GAAwB;AACxC,QAAIsB,IAAQ;AACZ,eAAWL,KAAK,KAAK,cAAc;AAClC,UAAIA,EAAE,aAAa,QAAQjB;AAC1B;AAED,UAAIiB,EAAE,aAAa,gBAAgBjB;AAClC,QAAAsB,KAASL,EAAE,QAAQ,SAASA,EAAE,aAAa;AAAA;AAG3C,eAAOA,EAAE,aAAa,QAAQK,IAAQL,EAAE,QAAQ;AAAA,IAElD;AACA,WAAOjB,IAASsB;AAAA,EACjB;AAAA,EAEO,WAAmB;AACzB,WAAO,IAAI,KAAK,aAAa,IAAI,CAAAL,MAAKA,EAAE,SAAA,CAAU,EAAE,KAAK,IAAI,CAAC;AAAA,EAC/D;AACD;"}
|