@osovv/vv-opencode 1.2.6 → 1.2.8
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/CHANGELOG.md +16 -0
- package/README.md +29 -2
- package/dist/commands/patch-provider.js +2 -0
- package/dist/commands/patch-provider.js.map +1 -1
- package/dist/commands/plugin-list.js +8 -3
- package/dist/commands/plugin-list.js.map +1 -1
- package/dist/commands/plugin-toggle.js +8 -1
- package/dist/commands/plugin-toggle.js.map +1 -1
- package/dist/lib/plugin-toggle-config.d.ts +5 -1
- package/dist/lib/plugin-toggle-config.js +15 -10
- package/dist/lib/plugin-toggle-config.js.map +1 -1
- package/dist/lib/vvoc-config.d.ts +33 -1
- package/dist/lib/vvoc-config.js +49 -1
- package/dist/lib/vvoc-config.js.map +1 -1
- package/dist/plugins/hashline-edit/diff-summary.d.ts +7 -0
- package/dist/plugins/hashline-edit/diff-summary.js +79 -0
- package/dist/plugins/hashline-edit/diff-summary.js.map +1 -0
- package/dist/plugins/hashline-edit/edit-operation-primitives.d.ts +2 -2
- package/dist/plugins/hashline-edit/edit-operation-primitives.js +56 -37
- package/dist/plugins/hashline-edit/edit-operation-primitives.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-operations.d.ts +1 -0
- package/dist/plugins/hashline-edit/edit-operations.js +17 -10
- package/dist/plugins/hashline-edit/edit-operations.js.map +1 -1
- package/dist/plugins/hashline-edit/edit-text-normalization.d.ts +27 -4
- package/dist/plugins/hashline-edit/edit-text-normalization.js +45 -56
- package/dist/plugins/hashline-edit/edit-text-normalization.js.map +1 -1
- package/dist/plugins/hashline-edit/index.js +331 -35
- package/dist/plugins/hashline-edit/index.js.map +1 -1
- package/dist/plugins/hashline-edit/normalize-edits.js +56 -20
- package/dist/plugins/hashline-edit/normalize-edits.js.map +1 -1
- package/dist/plugins/hashline-edit/replace-engine.d.ts +24 -0
- package/dist/plugins/hashline-edit/replace-engine.js +246 -0
- package/dist/plugins/hashline-edit/replace-engine.js.map +1 -0
- package/dist/plugins/hashline-edit/routing.d.ts +21 -0
- package/dist/plugins/hashline-edit/routing.js +113 -0
- package/dist/plugins/hashline-edit/routing.js.map +1 -0
- package/dist/plugins/hashline-edit/session-state.d.ts +23 -0
- package/dist/plugins/hashline-edit/session-state.js +70 -0
- package/dist/plugins/hashline-edit/session-state.js.map +1 -0
- package/dist/plugins/hashline-edit/str-replace-editor.d.ts +50 -0
- package/dist/plugins/hashline-edit/str-replace-editor.js +285 -0
- package/dist/plugins/hashline-edit/str-replace-editor.js.map +1 -0
- package/dist/plugins/hashline-edit/tool-description.d.ts +2 -1
- package/dist/plugins/hashline-edit/tool-description.js +44 -18
- package/dist/plugins/hashline-edit/tool-description.js.map +1 -1
- package/dist/plugins/hashline-edit/validation.d.ts +1 -0
- package/dist/plugins/hashline-edit/validation.js +13 -3
- package/dist/plugins/hashline-edit/validation.js.map +1 -1
- package/package.json +1 -1
- package/schemas/vvoc/v3.json +29 -2
- package/dist/plugins/hashline-edit/autocorrect-replacement-lines.d.ts +0 -1
- package/dist/plugins/hashline-edit/autocorrect-replacement-lines.js +0 -188
- package/dist/plugins/hashline-edit/autocorrect-replacement-lines.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
interface EditApplyOptions {
|
|
1
|
+
export interface EditApplyOptions {
|
|
2
2
|
skipValidation?: boolean;
|
|
3
|
+
onWarning?: (message: string) => void;
|
|
3
4
|
}
|
|
4
5
|
export declare function applySetLine(lines: string[], anchor: string, newText: string | string[] | null, options?: EditApplyOptions): string[];
|
|
5
6
|
export declare function applyReplaceLines(lines: string[], startAnchor: string, endAnchor: string, newText: string | string[] | null, options?: EditApplyOptions): string[];
|
|
@@ -7,4 +8,3 @@ export declare function applyInsertAfter(lines: string[], anchor: string, text:
|
|
|
7
8
|
export declare function applyInsertBefore(lines: string[], anchor: string, text: string | string[], options?: EditApplyOptions): string[];
|
|
8
9
|
export declare function applyAppend(lines: string[], text: string | string[]): string[];
|
|
9
10
|
export declare function applyPrepend(lines: string[], text: string | string[]): string[];
|
|
10
|
-
export {};
|
|
@@ -1,47 +1,50 @@
|
|
|
1
1
|
// FILE: src/plugins/hashline-edit/edit-operation-primitives.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.3.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE: Apply validated hashline edit operations to an in-memory file snapshot one mutation at a time.
|
|
5
|
-
// SCOPE: Single-line replace, range replace, anchored insert-before/after, and BOF/EOF insert helpers.
|
|
6
|
-
// DEPENDS: [src/plugins/hashline-edit/
|
|
4
|
+
// PURPOSE: Apply validated hashline edit operations literally to an in-memory file snapshot one mutation at a time.
|
|
5
|
+
// SCOPE: Single-line replace, range replace, anchored insert-before/after with exact-match echo trimming, neighbor-duplication warnings for insertions, and BOF/EOF insert helpers that preserve trailing-newline sentinels.
|
|
6
|
+
// DEPENDS: [src/plugins/hashline-edit/edit-text-normalization.ts, src/plugins/hashline-edit/validation.ts]
|
|
7
7
|
// LINKS: [M-PLUGIN-HASHLINE-EDIT]
|
|
8
8
|
// ROLE: RUNTIME
|
|
9
9
|
// MAP_MODE: EXPORTS
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
13
|
+
// EditApplyOptions - Optional validation skip and warning collector for primitive apply calls.
|
|
14
|
+
// applySetLine - Replace or delete a single anchored line literally.
|
|
15
|
+
// applyReplaceLines - Replace or delete an inclusive anchored line range literally, trimming only exact boundary echoes.
|
|
16
|
+
// applyInsertAfter - Insert lines after an anchored line, trimming only an exact anchor echo.
|
|
17
|
+
// applyInsertBefore - Insert lines before an anchored line, trimming only an exact anchor echo.
|
|
18
|
+
// applyAppend - Insert lines at EOF without creating a phantom blank line before the trailing newline.
|
|
18
19
|
// applyPrepend - Insert lines at BOF, creating content for an empty file.
|
|
19
20
|
// END_MODULE_MAP
|
|
20
21
|
//
|
|
21
22
|
// START_CHANGE_SUMMARY
|
|
22
|
-
// LAST_CHANGE: [v0.
|
|
23
|
+
// LAST_CHANGE: [v0.3.0 - Added visible warnings when append/prepend payloads duplicate the lines already adjacent to the anchor, applied literally.]
|
|
23
24
|
// END_CHANGE_SUMMARY
|
|
24
|
-
import {
|
|
25
|
-
import { restoreLeadingIndent, stripInsertAnchorEcho, stripInsertBeforeEcho, stripRangeBoundaryEcho, toNewLines, } from "./edit-text-normalization.js";
|
|
25
|
+
import { stripExactBoundaryEchoes, stripExactInsertBeforeEcho, stripExactInsertEcho, toNewLines, } from "./edit-text-normalization.js";
|
|
26
26
|
import { parseLineRef, validateLineRef } from "./validation.js";
|
|
27
27
|
function shouldValidate(options) {
|
|
28
28
|
return options?.skipValidation !== true;
|
|
29
29
|
}
|
|
30
|
+
function linesEqual(left, right) {
|
|
31
|
+
if (left.length !== right.length || left.length === 0) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
for (let i = 0; i < left.length; i += 1) {
|
|
35
|
+
if (left[i] !== right[i]) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
30
41
|
export function applySetLine(lines, anchor, newText, options) {
|
|
31
42
|
if (shouldValidate(options)) {
|
|
32
43
|
validateLineRef(lines, anchor);
|
|
33
44
|
}
|
|
34
45
|
const { line } = parseLineRef(anchor);
|
|
35
46
|
const result = [...lines];
|
|
36
|
-
const
|
|
37
|
-
const normalized = newText === null ? [] : toNewLines(newText);
|
|
38
|
-
const corrected = autocorrectReplacementLines([originalLine], normalized);
|
|
39
|
-
const replacement = corrected.map((entry, index) => {
|
|
40
|
-
if (index !== 0) {
|
|
41
|
-
return entry;
|
|
42
|
-
}
|
|
43
|
-
return restoreLeadingIndent(originalLine, entry);
|
|
44
|
-
});
|
|
47
|
+
const replacement = newText === null ? [] : toNewLines(newText);
|
|
45
48
|
if (replacement.length > 1) {
|
|
46
49
|
throw new Error("applySetLine: replace is for single-line replacement only. " +
|
|
47
50
|
`Removing 1 line but inserting ${replacement.length} lines. Use applyReplaceLines (replace_range) for multi-line replacement.`);
|
|
@@ -60,17 +63,13 @@ export function applyReplaceLines(lines, startAnchor, endAnchor, newText, option
|
|
|
60
63
|
throw new Error(`Invalid range: start line ${startLine} cannot be greater than end line ${endLine}`);
|
|
61
64
|
}
|
|
62
65
|
const result = [...lines];
|
|
63
|
-
const originalRange = lines.slice(startLine - 1, endLine);
|
|
64
66
|
const normalized = newText === null ? [] : toNewLines(newText);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return restoreLeadingIndent(lines[startLine - 1] ?? "", entry);
|
|
72
|
-
});
|
|
73
|
-
result.splice(startLine - 1, endLine - startLine + 1, ...restored);
|
|
67
|
+
const trimmed = stripExactBoundaryEchoes(lines, startLine, endLine, normalized);
|
|
68
|
+
const dropped = trimmed.droppedLeading + trimmed.droppedTrailing;
|
|
69
|
+
if (dropped > 0) {
|
|
70
|
+
options?.onWarning?.(`replace_range lines ${startLine}-${endLine}: dropped ${dropped} exact boundary echo line(s) duplicating surviving neighbors; the rest of the payload was applied literally`);
|
|
71
|
+
}
|
|
72
|
+
result.splice(startLine - 1, endLine - startLine + 1, ...trimmed.lines);
|
|
74
73
|
return result;
|
|
75
74
|
}
|
|
76
75
|
export function applyInsertAfter(lines, anchor, text, options) {
|
|
@@ -79,11 +78,18 @@ export function applyInsertAfter(lines, anchor, text, options) {
|
|
|
79
78
|
}
|
|
80
79
|
const { line } = parseLineRef(anchor);
|
|
81
80
|
const result = [...lines];
|
|
82
|
-
const
|
|
83
|
-
if (
|
|
81
|
+
const trimmed = stripExactInsertEcho(lines[line - 1] ?? "", toNewLines(text));
|
|
82
|
+
if (trimmed.stripped > 0) {
|
|
83
|
+
options?.onWarning?.(`append at line ${line}: dropped payload line identical to the anchor line`);
|
|
84
|
+
}
|
|
85
|
+
if (trimmed.lines.length === 0) {
|
|
84
86
|
throw new Error(`append (anchored) requires non-empty text for ${anchor}`);
|
|
85
87
|
}
|
|
86
|
-
|
|
88
|
+
const following = lines.slice(line, line + trimmed.lines.length);
|
|
89
|
+
if (linesEqual(trimmed.lines, following)) {
|
|
90
|
+
options?.onWarning?.(`append at line ${line}: payload duplicates the ${trimmed.lines.length} line(s) already following the anchor; applying literally creates a duplicate block`);
|
|
91
|
+
}
|
|
92
|
+
result.splice(line, 0, ...trimmed.lines);
|
|
87
93
|
return result;
|
|
88
94
|
}
|
|
89
95
|
export function applyInsertBefore(lines, anchor, text, options) {
|
|
@@ -92,11 +98,18 @@ export function applyInsertBefore(lines, anchor, text, options) {
|
|
|
92
98
|
}
|
|
93
99
|
const { line } = parseLineRef(anchor);
|
|
94
100
|
const result = [...lines];
|
|
95
|
-
const
|
|
96
|
-
if (
|
|
101
|
+
const trimmed = stripExactInsertBeforeEcho(lines[line - 1] ?? "", toNewLines(text));
|
|
102
|
+
if (trimmed.stripped > 0) {
|
|
103
|
+
options?.onWarning?.(`prepend at line ${line}: dropped payload line identical to the anchor line`);
|
|
104
|
+
}
|
|
105
|
+
if (trimmed.lines.length === 0) {
|
|
97
106
|
throw new Error(`prepend (anchored) requires non-empty text for ${anchor}`);
|
|
98
107
|
}
|
|
99
|
-
|
|
108
|
+
const preceding = lines.slice(line - 1 - trimmed.lines.length, line - 1);
|
|
109
|
+
if (linesEqual(trimmed.lines, preceding)) {
|
|
110
|
+
options?.onWarning?.(`prepend at line ${line}: payload duplicates the ${trimmed.lines.length} line(s) already preceding the anchor; applying literally creates a duplicate block`);
|
|
111
|
+
}
|
|
112
|
+
result.splice(line - 1, 0, ...trimmed.lines);
|
|
100
113
|
return result;
|
|
101
114
|
}
|
|
102
115
|
export function applyAppend(lines, text) {
|
|
@@ -107,6 +120,12 @@ export function applyAppend(lines, text) {
|
|
|
107
120
|
if (lines.length === 1 && lines[0] === "") {
|
|
108
121
|
return [...normalized];
|
|
109
122
|
}
|
|
123
|
+
// A newline-terminated file splits into a trailing "" sentinel. Append
|
|
124
|
+
// before it so no phantom blank line is created and the final newline is
|
|
125
|
+
// preserved.
|
|
126
|
+
if (lines.length > 1 && lines[lines.length - 1] === "") {
|
|
127
|
+
return [...lines.slice(0, -1), ...normalized, ""];
|
|
128
|
+
}
|
|
110
129
|
return [...lines, ...normalized];
|
|
111
130
|
}
|
|
112
131
|
export function applyPrepend(lines, text) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-operation-primitives.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-operation-primitives.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iBAAiB;AACjB,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"edit-operation-primitives.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-operation-primitives.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/plugins/hashline-edit/edit-operations.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.7.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE: Validate, order, deduplicate, and apply a batch of hashline edit operations against a file snapshot.
|
|
5
|
-
// SCOPE: Batch region computation, comprehensive conflict detection covering all mutation types, exact-edit deduplication, bottom-up application ordering,
|
|
4
|
+
// PURPOSE: Validate, order, deduplicate, and apply a batch of hashline edit operations literally against a file snapshot while collecting apply warnings.
|
|
5
|
+
// SCOPE: Batch region computation, comprehensive conflict detection covering all mutation types, exact-edit deduplication, bottom-up application ordering, no-op reporting, and warning aggregation.
|
|
6
6
|
// DEPENDS: [src/plugins/hashline-edit/edit-operation-primitives.ts, src/plugins/hashline-edit/types.ts, src/plugins/hashline-edit/validation.ts]
|
|
7
7
|
// LINKS: [M-PLUGIN-HASHLINE-EDIT]
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
// END_MODULE_CONTRACT
|
|
11
11
|
//
|
|
12
12
|
// START_MODULE_MAP
|
|
13
|
-
// HashlineApplyReport - Result shape returned after applying a batch of hashline edits.
|
|
14
|
-
// applyHashlineEditsWithReport - Validate and apply a batch of edits while reporting no-ops and
|
|
13
|
+
// HashlineApplyReport - Result shape returned after applying a batch of hashline edits, including apply warnings.
|
|
14
|
+
// applyHashlineEditsWithReport - Validate and apply a batch of edits literally while reporting no-ops, deduplicated operations, and echo-trim warnings.
|
|
15
15
|
// END_MODULE_MAP
|
|
16
16
|
//
|
|
17
17
|
// START_CHANGE_SUMMARY
|
|
18
|
-
// LAST_CHANGE: [v0.7.0 -
|
|
18
|
+
// LAST_CHANGE: [v0.7.0 - Application is literal: primitives receive a warning collector and HashlineApplyReport surfaces echo-trim warnings.]
|
|
19
19
|
// END_CHANGE_SUMMARY
|
|
20
20
|
import { applyAppend, applyInsertAfter, applyInsertBefore, applyPrepend, applyReplaceLines, applySetLine, } from "./edit-operation-primitives.js";
|
|
21
21
|
import { normalizeLineRef, parseLineRef, validateLineRefs } from "./validation.js";
|
|
@@ -167,6 +167,7 @@ export function applyHashlineEditsWithReport(content, edits) {
|
|
|
167
167
|
content,
|
|
168
168
|
noopEdits: 0,
|
|
169
169
|
deduplicatedEdits: 0,
|
|
170
|
+
warnings: [],
|
|
170
171
|
};
|
|
171
172
|
}
|
|
172
173
|
const dedupeResult = dedupeEdits(edits);
|
|
@@ -202,6 +203,11 @@ export function applyHashlineEditsWithReport(content, edits) {
|
|
|
202
203
|
})
|
|
203
204
|
.map((entry) => entry.edit);
|
|
204
205
|
let lines = content.length === 0 ? [] : content.split("\n");
|
|
206
|
+
const warnings = [];
|
|
207
|
+
const applyOptions = {
|
|
208
|
+
skipValidation: true,
|
|
209
|
+
onWarning: (message) => warnings.push(message),
|
|
210
|
+
};
|
|
205
211
|
const regions = computeEditRegions(sortedEdits);
|
|
206
212
|
validateBatchConflicts(regions);
|
|
207
213
|
const refs = collectLineRefs(sortedEdits);
|
|
@@ -211,19 +217,19 @@ export function applyHashlineEditsWithReport(content, edits) {
|
|
|
211
217
|
let next = lines;
|
|
212
218
|
switch (edit.op) {
|
|
213
219
|
case "replace_range":
|
|
214
|
-
next = applyReplaceLines(lines, edit.pos, edit.end, edit.lines,
|
|
220
|
+
next = applyReplaceLines(lines, edit.pos, edit.end, edit.lines, applyOptions);
|
|
215
221
|
break;
|
|
216
222
|
case "replace":
|
|
217
|
-
next = applySetLine(lines, edit.pos, edit.lines,
|
|
223
|
+
next = applySetLine(lines, edit.pos, edit.lines, applyOptions);
|
|
218
224
|
break;
|
|
219
225
|
case "append":
|
|
220
226
|
next = edit.pos
|
|
221
|
-
? applyInsertAfter(lines, edit.pos, edit.lines,
|
|
227
|
+
? applyInsertAfter(lines, edit.pos, edit.lines, applyOptions)
|
|
222
228
|
: applyAppend(lines, edit.lines);
|
|
223
229
|
break;
|
|
224
230
|
case "prepend":
|
|
225
231
|
next = edit.pos
|
|
226
|
-
? applyInsertBefore(lines, edit.pos, edit.lines,
|
|
232
|
+
? applyInsertBefore(lines, edit.pos, edit.lines, applyOptions)
|
|
227
233
|
: applyPrepend(lines, edit.lines);
|
|
228
234
|
break;
|
|
229
235
|
}
|
|
@@ -236,6 +242,7 @@ export function applyHashlineEditsWithReport(content, edits) {
|
|
|
236
242
|
return {
|
|
237
243
|
content: lines.join("\n"),
|
|
238
244
|
noopEdits,
|
|
245
|
+
warnings,
|
|
239
246
|
deduplicatedEdits: dedupeResult.deduplicatedEdits,
|
|
240
247
|
};
|
|
241
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-operations.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-operations.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,iBAAiB;AACjB,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"edit-operations.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
export declare function stripLinePrefixes(lines: string[]): string[];
|
|
2
2
|
export declare function toNewLines(input: string | string[]): string[];
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
export interface EchoTrimResult {
|
|
4
|
+
lines: string[];
|
|
5
|
+
stripped: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Remove a leading payload line that exactly duplicates the append anchor
|
|
9
|
+
* line. Only byte-identical echoes are trimmed; whitespace-differing lines
|
|
10
|
+
* are literal content and stay in the payload.
|
|
11
|
+
*/
|
|
12
|
+
export declare function stripExactInsertEcho(anchorLine: string, newLines: string[]): EchoTrimResult;
|
|
13
|
+
/**
|
|
14
|
+
* Remove a trailing payload line that exactly duplicates the prepend anchor
|
|
15
|
+
* line. Only byte-identical echoes are trimmed.
|
|
16
|
+
*/
|
|
17
|
+
export declare function stripExactInsertBeforeEcho(anchorLine: string, newLines: string[]): EchoTrimResult;
|
|
18
|
+
export interface BoundaryEchoTrimResult {
|
|
19
|
+
lines: string[];
|
|
20
|
+
droppedLeading: number;
|
|
21
|
+
droppedTrailing: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Remove exact copies of the surviving neighbor lines from a replace payload
|
|
25
|
+
* that is longer than the replaced range. Payloads that are not longer than
|
|
26
|
+
* their range are returned untouched so intentional boundary content is
|
|
27
|
+
* never silently dropped.
|
|
28
|
+
*/
|
|
29
|
+
export declare function stripExactBoundaryEchoes(fileLines: string[], startLine: number, endLine: number, newLines: string[]): BoundaryEchoTrimResult;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// FILE: src/plugins/hashline-edit/edit-text-normalization.ts
|
|
2
|
-
// VERSION: 0.
|
|
2
|
+
// VERSION: 0.5.0
|
|
3
3
|
// START_MODULE_CONTRACT
|
|
4
|
-
// PURPOSE: Normalize edit payload text so copied hashline rows and accidental diff markers do not corrupt replacements.
|
|
5
|
-
// SCOPE: Prefix stripping, line splitting,
|
|
4
|
+
// PURPOSE: Normalize edit payload text so copied hashline rows and accidental diff markers do not corrupt replacements, and trim only provably accidental echo lines.
|
|
5
|
+
// SCOPE: Prefix stripping, line splitting, exact-match insert echo trimming with reporting, and exact-match range-boundary echo trimming with reporting.
|
|
6
6
|
// DEPENDS: []
|
|
7
7
|
// LINKS: [M-PLUGIN-HASHLINE-EDIT]
|
|
8
8
|
// ROLE: RUNTIME
|
|
@@ -12,26 +12,18 @@
|
|
|
12
12
|
// START_MODULE_MAP
|
|
13
13
|
// stripLinePrefixes - Remove copied hashline or diff prefixes when most payload lines include them.
|
|
14
14
|
// toNewLines - Normalize string or string[] payloads into plain content lines.
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
15
|
+
// EchoTrimResult - Trimmed payload lines plus the number of exact echo lines removed.
|
|
16
|
+
// stripExactInsertEcho - Remove a leading payload line that exactly duplicates the append anchor line.
|
|
17
|
+
// stripExactInsertBeforeEcho - Remove a trailing payload line that exactly duplicates the prepend anchor line.
|
|
18
|
+
// BoundaryEchoTrimResult - Trimmed payload lines plus removed leading/trailing boundary echo counts.
|
|
19
|
+
// stripExactBoundaryEchoes - Remove exact copies of surviving neighbor lines from over-long replace payloads.
|
|
19
20
|
// END_MODULE_MAP
|
|
20
21
|
//
|
|
21
22
|
// START_CHANGE_SUMMARY
|
|
22
|
-
// LAST_CHANGE: [v0.
|
|
23
|
+
// LAST_CHANGE: [v0.5.0 - Replaced whitespace-insensitive autocorrect helpers with exact-match, reported echo trimming so valid payloads apply literally.]
|
|
23
24
|
// END_CHANGE_SUMMARY
|
|
24
25
|
const HASHLINE_PREFIX_RE = /^\s*(?:>>>|>>)?\s*\d+\s*#\s*[ZPMQVRWSNKTXJBYH]{2}(?:\s*#\s*[ZPMQVRWSNKTXJBYH]{2})?\|/;
|
|
25
26
|
const DIFF_PLUS_RE = /^[+](?![+])/;
|
|
26
|
-
function equalsIgnoringWhitespace(left, right) {
|
|
27
|
-
if (left === right) {
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
return left.replace(/\s+/g, "") === right.replace(/\s+/g, "");
|
|
31
|
-
}
|
|
32
|
-
function leadingWhitespace(text) {
|
|
33
|
-
return text.match(/^\s*/)?.[0] ?? "";
|
|
34
|
-
}
|
|
35
27
|
export function stripLinePrefixes(lines) {
|
|
36
28
|
let hashPrefixCount = 0;
|
|
37
29
|
let diffPlusCount = 0;
|
|
@@ -72,56 +64,53 @@ export function toNewLines(input) {
|
|
|
72
64
|
}
|
|
73
65
|
return stripLinePrefixes(input.split("\n"));
|
|
74
66
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
if (templateLine.trim() === line.trim()) {
|
|
87
|
-
return line;
|
|
88
|
-
}
|
|
89
|
-
return `${templateIndent}${line}`;
|
|
90
|
-
}
|
|
91
|
-
export function stripInsertAnchorEcho(anchorLine, newLines) {
|
|
92
|
-
if (newLines.length === 0) {
|
|
93
|
-
return newLines;
|
|
94
|
-
}
|
|
95
|
-
if (equalsIgnoringWhitespace(newLines[0] ?? "", anchorLine)) {
|
|
96
|
-
return newLines.slice(1);
|
|
97
|
-
}
|
|
98
|
-
return newLines;
|
|
67
|
+
/**
|
|
68
|
+
* Remove a leading payload line that exactly duplicates the append anchor
|
|
69
|
+
* line. Only byte-identical echoes are trimmed; whitespace-differing lines
|
|
70
|
+
* are literal content and stay in the payload.
|
|
71
|
+
*/
|
|
72
|
+
export function stripExactInsertEcho(anchorLine, newLines) {
|
|
73
|
+
if (newLines.length > 0 && newLines[0] === anchorLine) {
|
|
74
|
+
return { lines: newLines.slice(1), stripped: 1 };
|
|
75
|
+
}
|
|
76
|
+
return { lines: newLines, stripped: 0 };
|
|
99
77
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Remove a trailing payload line that exactly duplicates the prepend anchor
|
|
80
|
+
* line. Only byte-identical echoes are trimmed.
|
|
81
|
+
*/
|
|
82
|
+
export function stripExactInsertBeforeEcho(anchorLine, newLines) {
|
|
83
|
+
if (newLines.length > 0 && newLines[newLines.length - 1] === anchorLine) {
|
|
84
|
+
return { lines: newLines.slice(0, -1), stripped: 1 };
|
|
85
|
+
}
|
|
86
|
+
return { lines: newLines, stripped: 0 };
|
|
108
87
|
}
|
|
109
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Remove exact copies of the surviving neighbor lines from a replace payload
|
|
90
|
+
* that is longer than the replaced range. Payloads that are not longer than
|
|
91
|
+
* their range are returned untouched so intentional boundary content is
|
|
92
|
+
* never silently dropped.
|
|
93
|
+
*/
|
|
94
|
+
export function stripExactBoundaryEchoes(fileLines, startLine, endLine, newLines) {
|
|
110
95
|
const replacedCount = endLine - startLine + 1;
|
|
111
|
-
if (newLines.length <=
|
|
112
|
-
return newLines;
|
|
96
|
+
if (newLines.length <= replacedCount) {
|
|
97
|
+
return { lines: newLines, droppedLeading: 0, droppedTrailing: 0 };
|
|
113
98
|
}
|
|
114
99
|
let output = newLines;
|
|
100
|
+
let droppedLeading = 0;
|
|
101
|
+
let droppedTrailing = 0;
|
|
115
102
|
const beforeIndex = startLine - 2;
|
|
116
|
-
if (beforeIndex >= 0 && output[0] ===
|
|
103
|
+
if (beforeIndex >= 0 && output[0] === fileLines[beforeIndex]) {
|
|
117
104
|
output = output.slice(1);
|
|
105
|
+
droppedLeading = 1;
|
|
118
106
|
}
|
|
119
107
|
const afterIndex = endLine;
|
|
120
|
-
if (afterIndex <
|
|
108
|
+
if (afterIndex < fileLines.length &&
|
|
121
109
|
output.length > 0 &&
|
|
122
|
-
output[output.length - 1] ===
|
|
110
|
+
output[output.length - 1] === fileLines[afterIndex]) {
|
|
123
111
|
output = output.slice(0, -1);
|
|
112
|
+
droppedTrailing = 1;
|
|
124
113
|
}
|
|
125
|
-
return output;
|
|
114
|
+
return { lines: output, droppedLeading, droppedTrailing };
|
|
126
115
|
}
|
|
127
116
|
//# sourceMappingURL=edit-text-normalization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edit-text-normalization.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-text-normalization.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,iBAAiB;AACjB,wBAAwB;AACxB,
|
|
1
|
+
{"version":3,"file":"edit-text-normalization.js","sourceRoot":"","sources":["../../../src/plugins/hashline-edit/edit-text-normalization.ts"],"names":[],"mappings":"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"}
|