@pierre/diffs 1.0.7 → 1.1.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.
- package/dist/components/File.d.ts +4 -2
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +80 -34
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +50 -28
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +220 -79
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.d.ts +1 -0
- package/dist/components/FileStream.d.ts.map +1 -1
- package/dist/components/FileStream.js +8 -4
- package/dist/components/FileStream.js.map +1 -1
- package/dist/constants.d.ts +8 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +19 -10
- package/dist/index.js +14 -5
- package/dist/managers/LineSelectionManager.d.ts.map +1 -1
- package/dist/managers/LineSelectionManager.js +8 -9
- package/dist/managers/LineSelectionManager.js.map +1 -1
- package/dist/react/MultiFileDiff.js +2 -2
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/index.d.ts +2 -2
- package/dist/react/utils/renderDiffChildren.d.ts +4 -4
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +3 -3
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +7 -6
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +263 -337
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +1 -0
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +11 -4
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +246 -42
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
- package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
- package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
- package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
- package/dist/utils/areHunkDataEqual.d.ts +7 -0
- package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
- package/dist/utils/areHunkDataEqual.js +8 -0
- package/dist/utils/areHunkDataEqual.js.map +1 -0
- package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
- package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
- package/dist/utils/areLineAnnotationsEqual.js +8 -0
- package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
- package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
- package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
- package/dist/utils/arePrePropertiesEqual.js +9 -0
- package/dist/utils/arePrePropertiesEqual.js.map +1 -0
- package/dist/utils/areRenderRangesEqual.d.ts +7 -0
- package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
- package/dist/utils/areRenderRangesEqual.js +9 -0
- package/dist/utils/areRenderRangesEqual.js.map +1 -0
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
- package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
- package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
- package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
- package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
- package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
- package/dist/utils/areWorkerStatsEqual.js +9 -0
- package/dist/utils/areWorkerStatsEqual.js.map +1 -0
- package/dist/utils/createTransformerWithState.js +1 -1
- package/dist/utils/createTransformerWithState.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
- package/dist/utils/createWindowFromScrollPosition.js +26 -0
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
- package/dist/utils/diffAcceptRejectHunk.js +36 -21
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/getOrCreateCodeNode.d.ts +14 -0
- package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
- package/dist/utils/getOrCreateCodeNode.js +13 -0
- package/dist/utils/getOrCreateCodeNode.js.map +1 -0
- package/dist/utils/getTotalLineCountFromHunks.js +1 -1
- package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
- package/dist/utils/hast_utils.d.ts +2 -1
- package/dist/utils/hast_utils.d.ts.map +1 -1
- package/dist/utils/hast_utils.js +10 -1
- package/dist/utils/hast_utils.js.map +1 -1
- package/dist/utils/isDefaultRenderRange.d.ts +7 -0
- package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
- package/dist/utils/isDefaultRenderRange.js +8 -0
- package/dist/utils/isDefaultRenderRange.js.map +1 -0
- package/dist/utils/iterateOverDiff.d.ts +39 -0
- package/dist/utils/iterateOverDiff.d.ts.map +1 -0
- package/dist/utils/iterateOverDiff.js +356 -0
- package/dist/utils/iterateOverDiff.js.map +1 -0
- package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseDiffFromFile.js +8 -6
- package/dist/utils/parseDiffFromFile.js.map +1 -1
- package/dist/utils/parsePatchFiles.d.ts +15 -3
- package/dist/utils/parsePatchFiles.d.ts.map +1 -1
- package/dist/utils/parsePatchFiles.js +207 -158
- package/dist/utils/parsePatchFiles.js.map +1 -1
- package/dist/utils/processLine.js +4 -3
- package/dist/utils/processLine.js.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.d.ts +7 -2
- package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
- package/dist/utils/renderDiffWithHighlighter.js +149 -227
- package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
- package/dist/utils/setWrapperNodeProps.d.ts +3 -7
- package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
- package/dist/utils/setWrapperNodeProps.js +1 -1
- package/dist/utils/setWrapperNodeProps.js.map +1 -1
- package/dist/worker/WorkerPoolManager.d.ts +9 -2
- package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
- package/dist/worker/WorkerPoolManager.js +124 -45
- package/dist/worker/WorkerPoolManager.js.map +1 -1
- package/dist/worker/types.d.ts +7 -0
- package/dist/worker/types.d.ts.map +1 -1
- package/dist/worker/worker-portable.js +634 -242
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +511 -231
- package/dist/worker/worker.js.map +1 -1
- package/package.json +20 -1
- package/dist/utils/createCodeNode.d.ts +0 -12
- package/dist/utils/createCodeNode.d.ts.map +0 -1
- package/dist/utils/createCodeNode.js +0 -12
- package/dist/utils/createCodeNode.js.map +0 -1
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
//#region src/utils/iterateOverDiff.ts
|
|
2
|
+
function iterateOverDiff({ diff, diffStyle, startingLine = 0, totalLines = Infinity, expandedHunks, callback }) {
|
|
3
|
+
const state = {
|
|
4
|
+
finalHunk: diff.hunks.at(-1),
|
|
5
|
+
viewportStart: startingLine,
|
|
6
|
+
viewportEnd: startingLine + totalLines,
|
|
7
|
+
isWindowedHighlight: startingLine > 0 || totalLines < Infinity,
|
|
8
|
+
splitCount: 0,
|
|
9
|
+
unifiedCount: 0,
|
|
10
|
+
shouldBreak() {
|
|
11
|
+
if (!state.isWindowedHighlight) return false;
|
|
12
|
+
const breakUnified = state.unifiedCount >= startingLine + totalLines;
|
|
13
|
+
const breakSplit = state.splitCount >= startingLine + totalLines;
|
|
14
|
+
if (diffStyle === "unified") return breakUnified;
|
|
15
|
+
else if (diffStyle === "split") return breakSplit;
|
|
16
|
+
else return breakUnified && breakSplit;
|
|
17
|
+
},
|
|
18
|
+
shouldSkip(unifiedHeight, splitHeight) {
|
|
19
|
+
if (!state.isWindowedHighlight) return false;
|
|
20
|
+
const skipUnified = state.unifiedCount + unifiedHeight < startingLine;
|
|
21
|
+
const skipSplit = state.splitCount + splitHeight < startingLine;
|
|
22
|
+
if (diffStyle === "unified") return skipUnified;
|
|
23
|
+
else if (diffStyle === "split") return skipSplit;
|
|
24
|
+
else return skipUnified && skipSplit;
|
|
25
|
+
},
|
|
26
|
+
incrementCounts(unifiedValue, splitValue) {
|
|
27
|
+
if (diffStyle === "unified" || diffStyle === "both") state.unifiedCount += unifiedValue;
|
|
28
|
+
if (diffStyle === "split" || diffStyle === "both") state.splitCount += splitValue;
|
|
29
|
+
},
|
|
30
|
+
isInWindow(unifiedHeight, splitHeight) {
|
|
31
|
+
if (!state.isWindowedHighlight) return true;
|
|
32
|
+
const unifiedInWindow = state.isInUnifiedWindow(unifiedHeight);
|
|
33
|
+
const splitInWindow = state.isInSplitWindow(splitHeight);
|
|
34
|
+
if (diffStyle === "unified") return unifiedInWindow;
|
|
35
|
+
else if (diffStyle === "split") return splitInWindow;
|
|
36
|
+
else return unifiedInWindow || splitInWindow;
|
|
37
|
+
},
|
|
38
|
+
isInUnifiedWindow(unifiedHeight) {
|
|
39
|
+
return !state.isWindowedHighlight || state.unifiedCount >= startingLine - unifiedHeight && state.unifiedCount < startingLine + totalLines;
|
|
40
|
+
},
|
|
41
|
+
isInSplitWindow(splitHeight) {
|
|
42
|
+
return !state.isWindowedHighlight || state.splitCount >= startingLine - splitHeight && state.splitCount < startingLine + totalLines;
|
|
43
|
+
},
|
|
44
|
+
emit(props, silent = false) {
|
|
45
|
+
if (!silent) if (diffStyle === "unified") state.incrementCounts(1, 0);
|
|
46
|
+
else if (diffStyle === "split") state.incrementCounts(0, 1);
|
|
47
|
+
else state.incrementCounts(1, 1);
|
|
48
|
+
return callback(props) ?? false;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
hunkIterator: for (const [hunkIndex, hunk] of diff.hunks.entries()) {
|
|
52
|
+
if (state.shouldBreak()) break;
|
|
53
|
+
const leadingRegion = getExpandedRegion(diff.isPartial, hunk.collapsedBefore, expandedHunks, hunkIndex);
|
|
54
|
+
const trailingRegion = (() => {
|
|
55
|
+
if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) return;
|
|
56
|
+
const additionRemaining = diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);
|
|
57
|
+
const deletionRemaining = diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);
|
|
58
|
+
if (additionRemaining !== deletionRemaining) throw new Error(`iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`);
|
|
59
|
+
const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);
|
|
60
|
+
return getExpandedRegion(diff.isPartial, trailingRangeSize, expandedHunks, diff.hunks.length);
|
|
61
|
+
})();
|
|
62
|
+
const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;
|
|
63
|
+
function getTrailingCollapsedAfter(unifiedLineIndex$1, splitLineIndex$1) {
|
|
64
|
+
if (trailingRegion == null || trailingRegion.collapsedLines <= 0 || trailingRegion.fromStart + trailingRegion.fromEnd > 0) return 0;
|
|
65
|
+
if (diffStyle === "unified") return unifiedLineIndex$1 === hunk.unifiedLineStart + hunk.unifiedLineCount - 1 ? trailingRegion.collapsedLines : 0;
|
|
66
|
+
return splitLineIndex$1 === hunk.splitLineStart + hunk.splitLineCount - 1 ? trailingRegion.collapsedLines : 0;
|
|
67
|
+
}
|
|
68
|
+
function getPendingCollapsed() {
|
|
69
|
+
if (leadingRegion.collapsedLines === 0) return 0;
|
|
70
|
+
const value = leadingRegion.collapsedLines;
|
|
71
|
+
leadingRegion.collapsedLines = 0;
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
if (!state.shouldSkip(expandedLineCount, expandedLineCount)) {
|
|
75
|
+
let unifiedLineIndex$1 = hunk.unifiedLineStart - leadingRegion.rangeSize;
|
|
76
|
+
let splitLineIndex$1 = hunk.splitLineStart - leadingRegion.rangeSize;
|
|
77
|
+
let deletionLineIndex$1 = hunk.deletionLineIndex - leadingRegion.rangeSize;
|
|
78
|
+
let additionLineIndex$1 = hunk.additionLineIndex - leadingRegion.rangeSize;
|
|
79
|
+
let deletionLineNumber$1 = hunk.deletionStart - leadingRegion.rangeSize;
|
|
80
|
+
let additionLineNumber$1 = hunk.additionStart - leadingRegion.rangeSize;
|
|
81
|
+
let index = 0;
|
|
82
|
+
while (index < leadingRegion.fromStart) {
|
|
83
|
+
if (state.isInWindow(0, 0)) {
|
|
84
|
+
if (state.emit({
|
|
85
|
+
hunkIndex,
|
|
86
|
+
hunk,
|
|
87
|
+
collapsedBefore: 0,
|
|
88
|
+
collapsedAfter: 0,
|
|
89
|
+
unifiedDeletionLineIndex: unifiedLineIndex$1 + index,
|
|
90
|
+
unifiedAdditionLineIndex: unifiedLineIndex$1 + index,
|
|
91
|
+
splitLineIndex: splitLineIndex$1 + index,
|
|
92
|
+
deletionLineIndex: deletionLineIndex$1 + index,
|
|
93
|
+
additionLineIndex: additionLineIndex$1 + index,
|
|
94
|
+
deletionLineNumber: deletionLineNumber$1 + index,
|
|
95
|
+
additionLineNumber: additionLineNumber$1 + index,
|
|
96
|
+
type: "context-expanded",
|
|
97
|
+
noEOFCRAddition: false,
|
|
98
|
+
noEOFCRDeletion: false
|
|
99
|
+
})) break hunkIterator;
|
|
100
|
+
} else state.incrementCounts(1, 1);
|
|
101
|
+
index++;
|
|
102
|
+
}
|
|
103
|
+
unifiedLineIndex$1 = hunk.unifiedLineStart - leadingRegion.fromEnd;
|
|
104
|
+
splitLineIndex$1 = hunk.splitLineStart - leadingRegion.fromEnd;
|
|
105
|
+
deletionLineIndex$1 = hunk.deletionLineIndex - leadingRegion.fromEnd;
|
|
106
|
+
additionLineIndex$1 = hunk.additionLineIndex - leadingRegion.fromEnd;
|
|
107
|
+
deletionLineNumber$1 = hunk.deletionStart - leadingRegion.fromEnd;
|
|
108
|
+
additionLineNumber$1 = hunk.additionStart - leadingRegion.fromEnd;
|
|
109
|
+
index = 0;
|
|
110
|
+
while (index < leadingRegion.fromEnd) {
|
|
111
|
+
if (state.isInWindow(0, 0)) {
|
|
112
|
+
if (state.emit({
|
|
113
|
+
hunkIndex,
|
|
114
|
+
hunk,
|
|
115
|
+
collapsedBefore: getPendingCollapsed(),
|
|
116
|
+
collapsedAfter: 0,
|
|
117
|
+
unifiedDeletionLineIndex: unifiedLineIndex$1 + index,
|
|
118
|
+
unifiedAdditionLineIndex: unifiedLineIndex$1 + index,
|
|
119
|
+
splitLineIndex: splitLineIndex$1 + index,
|
|
120
|
+
deletionLineIndex: deletionLineIndex$1 + index,
|
|
121
|
+
additionLineIndex: additionLineIndex$1 + index,
|
|
122
|
+
deletionLineNumber: deletionLineNumber$1 + index,
|
|
123
|
+
additionLineNumber: additionLineNumber$1 + index,
|
|
124
|
+
type: "context-expanded",
|
|
125
|
+
noEOFCRAddition: false,
|
|
126
|
+
noEOFCRDeletion: false
|
|
127
|
+
})) break hunkIterator;
|
|
128
|
+
} else state.incrementCounts(1, 1);
|
|
129
|
+
index++;
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
state.incrementCounts(expandedLineCount, expandedLineCount);
|
|
133
|
+
getPendingCollapsed();
|
|
134
|
+
}
|
|
135
|
+
let unifiedLineIndex = hunk.unifiedLineStart;
|
|
136
|
+
let splitLineIndex = hunk.splitLineStart;
|
|
137
|
+
let deletionLineIndex = hunk.deletionLineIndex;
|
|
138
|
+
let additionLineIndex = hunk.additionLineIndex;
|
|
139
|
+
let deletionLineNumber = hunk.deletionStart;
|
|
140
|
+
let additionLineNumber = hunk.additionStart;
|
|
141
|
+
const lastContent = hunk.hunkContent.at(-1);
|
|
142
|
+
for (const content of hunk.hunkContent) {
|
|
143
|
+
if (state.shouldBreak()) break hunkIterator;
|
|
144
|
+
const isLastContent = content === lastContent;
|
|
145
|
+
if (content.type === "context") {
|
|
146
|
+
if (!state.shouldSkip(content.lines, content.lines)) {
|
|
147
|
+
let index = 0;
|
|
148
|
+
while (index < content.lines) {
|
|
149
|
+
if (state.isInWindow(0, 0)) {
|
|
150
|
+
const isLastLine = isLastContent && index === content.lines - 1;
|
|
151
|
+
const unifiedRowIndex = unifiedLineIndex + index;
|
|
152
|
+
const splitRowIndex = splitLineIndex + index;
|
|
153
|
+
if (state.emit({
|
|
154
|
+
hunkIndex,
|
|
155
|
+
hunk,
|
|
156
|
+
collapsedBefore: getPendingCollapsed(),
|
|
157
|
+
collapsedAfter: getTrailingCollapsedAfter(unifiedRowIndex, splitRowIndex),
|
|
158
|
+
unifiedDeletionLineIndex: unifiedRowIndex,
|
|
159
|
+
unifiedAdditionLineIndex: unifiedRowIndex,
|
|
160
|
+
splitLineIndex: splitRowIndex,
|
|
161
|
+
deletionLineIndex: deletionLineIndex + index,
|
|
162
|
+
additionLineIndex: additionLineIndex + index,
|
|
163
|
+
deletionLineNumber: deletionLineNumber + index,
|
|
164
|
+
additionLineNumber: additionLineNumber + index,
|
|
165
|
+
type: "context",
|
|
166
|
+
noEOFCRAddition: isLastLine && hunk.noEOFCRAdditions,
|
|
167
|
+
noEOFCRDeletion: isLastLine && hunk.noEOFCRDeletions
|
|
168
|
+
})) break hunkIterator;
|
|
169
|
+
} else state.incrementCounts(1, 1);
|
|
170
|
+
index++;
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
state.incrementCounts(content.lines, content.lines);
|
|
174
|
+
getPendingCollapsed();
|
|
175
|
+
}
|
|
176
|
+
unifiedLineIndex += content.lines;
|
|
177
|
+
splitLineIndex += content.lines;
|
|
178
|
+
deletionLineIndex += content.lines;
|
|
179
|
+
additionLineIndex += content.lines;
|
|
180
|
+
deletionLineNumber += content.lines;
|
|
181
|
+
additionLineNumber += content.lines;
|
|
182
|
+
} else {
|
|
183
|
+
const splitCount = Math.max(content.deletions, content.additions);
|
|
184
|
+
const unifiedCount = content.deletions + content.additions;
|
|
185
|
+
if (!state.shouldSkip(unifiedCount, splitCount)) {
|
|
186
|
+
const iterationRanges = getChangeIterationRanges(state, content, diffStyle);
|
|
187
|
+
for (const [rangeStart, rangeEnd] of iterationRanges) for (let index = rangeStart; index < rangeEnd; index++) {
|
|
188
|
+
const collapsedAfter = getTrailingCollapsedAfter(unifiedLineIndex + index, diffStyle === "unified" ? splitLineIndex + (index < content.deletions ? index : index - content.deletions) : splitLineIndex + index);
|
|
189
|
+
if (state.emit(getChangeLineData({
|
|
190
|
+
hunkIndex,
|
|
191
|
+
hunk,
|
|
192
|
+
collapsedBefore: getPendingCollapsed(),
|
|
193
|
+
collapsedAfter,
|
|
194
|
+
diffStyle,
|
|
195
|
+
index,
|
|
196
|
+
unifiedLineIndex,
|
|
197
|
+
splitLineIndex,
|
|
198
|
+
additionLineIndex,
|
|
199
|
+
deletionLineIndex,
|
|
200
|
+
additionLineNumber,
|
|
201
|
+
deletionLineNumber,
|
|
202
|
+
content,
|
|
203
|
+
isLastContent,
|
|
204
|
+
unifiedCount,
|
|
205
|
+
splitCount
|
|
206
|
+
}), true)) break hunkIterator;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
getPendingCollapsed();
|
|
210
|
+
state.incrementCounts(unifiedCount, splitCount);
|
|
211
|
+
unifiedLineIndex += unifiedCount;
|
|
212
|
+
splitLineIndex += splitCount;
|
|
213
|
+
deletionLineIndex += content.deletions;
|
|
214
|
+
additionLineIndex += content.additions;
|
|
215
|
+
deletionLineNumber += content.deletions;
|
|
216
|
+
additionLineNumber += content.additions;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (trailingRegion != null) {
|
|
220
|
+
const { collapsedLines, fromStart, fromEnd } = trailingRegion;
|
|
221
|
+
const len = fromStart + fromEnd;
|
|
222
|
+
let index = 0;
|
|
223
|
+
while (index < len) {
|
|
224
|
+
if (state.shouldBreak()) break hunkIterator;
|
|
225
|
+
if (state.isInWindow(0, 0)) {
|
|
226
|
+
const isLastLine = index === len - 1;
|
|
227
|
+
if (state.emit({
|
|
228
|
+
hunkIndex: diff.hunks.length,
|
|
229
|
+
hunk: void 0,
|
|
230
|
+
collapsedBefore: 0,
|
|
231
|
+
collapsedAfter: isLastLine ? collapsedLines : 0,
|
|
232
|
+
unifiedDeletionLineIndex: unifiedLineIndex + index,
|
|
233
|
+
unifiedAdditionLineIndex: unifiedLineIndex + index,
|
|
234
|
+
splitLineIndex: splitLineIndex + index,
|
|
235
|
+
additionLineIndex: additionLineIndex + index,
|
|
236
|
+
deletionLineIndex: deletionLineIndex + index,
|
|
237
|
+
additionLineNumber: additionLineNumber + index,
|
|
238
|
+
deletionLineNumber: deletionLineNumber + index,
|
|
239
|
+
type: "context-expanded",
|
|
240
|
+
noEOFCRAddition: false,
|
|
241
|
+
noEOFCRDeletion: false
|
|
242
|
+
})) break hunkIterator;
|
|
243
|
+
} else state.incrementCounts(1, 1);
|
|
244
|
+
index++;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function getExpandedRegion(isPartial, rangeSize, expandedHunks, hunkIndex) {
|
|
250
|
+
rangeSize = Math.max(rangeSize, 0);
|
|
251
|
+
if (rangeSize === 0 || isPartial) return {
|
|
252
|
+
fromStart: 0,
|
|
253
|
+
fromEnd: 0,
|
|
254
|
+
rangeSize,
|
|
255
|
+
collapsedLines: Math.max(rangeSize, 0)
|
|
256
|
+
};
|
|
257
|
+
if (expandedHunks === true) return {
|
|
258
|
+
fromStart: rangeSize,
|
|
259
|
+
fromEnd: 0,
|
|
260
|
+
rangeSize,
|
|
261
|
+
collapsedLines: 0
|
|
262
|
+
};
|
|
263
|
+
const region = expandedHunks?.get(hunkIndex);
|
|
264
|
+
const fromStart = Math.min(Math.max(region?.fromStart ?? 0, 0), rangeSize);
|
|
265
|
+
const fromEnd = Math.min(Math.max(region?.fromEnd ?? 0, 0), rangeSize);
|
|
266
|
+
const expandedCount = fromStart + fromEnd;
|
|
267
|
+
const renderAll = expandedCount >= rangeSize;
|
|
268
|
+
return {
|
|
269
|
+
fromStart: renderAll ? rangeSize : fromStart,
|
|
270
|
+
fromEnd: renderAll ? 0 : fromEnd,
|
|
271
|
+
rangeSize,
|
|
272
|
+
collapsedLines: Math.max(rangeSize - expandedCount, 0)
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function hasFinalCollapsedHunk(diff) {
|
|
276
|
+
const lastHunk = diff.hunks.at(-1);
|
|
277
|
+
if (lastHunk == null || diff.isPartial || diff.additionLines.length === 0 || diff.deletionLines.length === 0) return false;
|
|
278
|
+
return lastHunk.additionLineIndex + lastHunk.additionCount < diff.additionLines.length || lastHunk.deletionLineIndex + lastHunk.deletionCount < diff.deletionLines.length;
|
|
279
|
+
}
|
|
280
|
+
function getChangeIterationRanges(state, content, diffStyle) {
|
|
281
|
+
if (!state.isWindowedHighlight) return [[0, diffStyle === "unified" ? content.deletions + content.additions : Math.max(content.deletions, content.additions)]];
|
|
282
|
+
const useUnified = diffStyle !== "split";
|
|
283
|
+
const useSplit = diffStyle !== "unified";
|
|
284
|
+
const iterationSpace = diffStyle === "unified" ? "unified" : "split";
|
|
285
|
+
const iterationRanges = [];
|
|
286
|
+
function getVisibleRange(start, count) {
|
|
287
|
+
if (start + count <= state.viewportStart || start >= state.viewportEnd) return;
|
|
288
|
+
const visibleStart = Math.max(0, state.viewportStart - start);
|
|
289
|
+
const visibleEnd = Math.min(count, state.viewportEnd - start);
|
|
290
|
+
return visibleEnd > visibleStart ? [visibleStart, visibleEnd] : void 0;
|
|
291
|
+
}
|
|
292
|
+
function mapRangeToIteration(range, kind) {
|
|
293
|
+
if (iterationSpace === "split") return range;
|
|
294
|
+
return kind === "additions" ? [range[0] + content.deletions, range[1] + content.deletions] : range;
|
|
295
|
+
}
|
|
296
|
+
function pushRange(range, kind) {
|
|
297
|
+
if (range == null) return;
|
|
298
|
+
const [start, end] = mapRangeToIteration(range, kind);
|
|
299
|
+
if (end > start) iterationRanges.push([start, end]);
|
|
300
|
+
}
|
|
301
|
+
if (useUnified) {
|
|
302
|
+
pushRange(getVisibleRange(state.unifiedCount, content.deletions), "deletions");
|
|
303
|
+
pushRange(getVisibleRange(state.unifiedCount + content.deletions, content.additions), "additions");
|
|
304
|
+
}
|
|
305
|
+
if (useSplit) {
|
|
306
|
+
pushRange(getVisibleRange(state.splitCount, content.deletions), "deletions");
|
|
307
|
+
pushRange(getVisibleRange(state.splitCount, content.additions), "additions");
|
|
308
|
+
}
|
|
309
|
+
if (iterationRanges.length === 0) return iterationRanges;
|
|
310
|
+
iterationRanges.sort((a, b) => a[0] - b[0]);
|
|
311
|
+
const merged = [iterationRanges[0]];
|
|
312
|
+
for (const [start, end] of iterationRanges.slice(1)) {
|
|
313
|
+
const last = merged[merged.length - 1];
|
|
314
|
+
if (start <= last[1]) last[1] = Math.max(last[1], end);
|
|
315
|
+
else merged.push([start, end]);
|
|
316
|
+
}
|
|
317
|
+
return merged;
|
|
318
|
+
}
|
|
319
|
+
function getChangeLineData({ hunkIndex, hunk, collapsedAfter, collapsedBefore, diffStyle, index, unifiedLineIndex, splitLineIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, content, isLastContent, unifiedCount, splitCount }) {
|
|
320
|
+
if (diffStyle === "unified") return {
|
|
321
|
+
type: "change",
|
|
322
|
+
hunkIndex,
|
|
323
|
+
hunk,
|
|
324
|
+
collapsedAfter,
|
|
325
|
+
collapsedBefore,
|
|
326
|
+
unifiedDeletionLineIndex: index < content.deletions ? unifiedLineIndex + index : void 0,
|
|
327
|
+
unifiedAdditionLineIndex: index >= content.deletions ? unifiedLineIndex + index : void 0,
|
|
328
|
+
splitLineIndex: splitLineIndex + (index < content.deletions ? index : index - content.deletions),
|
|
329
|
+
additionLineIndex: index >= content.deletions ? additionLineIndex + (index - content.deletions) : void 0,
|
|
330
|
+
additionLineNumber: index >= content.deletions ? additionLineNumber + (index - content.deletions) : void 0,
|
|
331
|
+
deletionLineIndex: index < content.deletions ? deletionLineIndex + index : void 0,
|
|
332
|
+
deletionLineNumber: index < content.deletions ? deletionLineNumber + index : void 0,
|
|
333
|
+
noEOFCRDeletion: isLastContent && index === content.deletions - 1 && hunk.noEOFCRDeletions,
|
|
334
|
+
noEOFCRAddition: isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions
|
|
335
|
+
};
|
|
336
|
+
return {
|
|
337
|
+
type: "change",
|
|
338
|
+
hunkIndex,
|
|
339
|
+
hunk,
|
|
340
|
+
collapsedAfter,
|
|
341
|
+
collapsedBefore,
|
|
342
|
+
unifiedDeletionLineIndex: index < content.deletions ? unifiedLineIndex + index : void 0,
|
|
343
|
+
unifiedAdditionLineIndex: index < content.additions ? unifiedLineIndex + content.deletions + index : void 0,
|
|
344
|
+
splitLineIndex: splitLineIndex + index,
|
|
345
|
+
additionLineIndex: index < content.additions ? additionLineIndex + index : void 0,
|
|
346
|
+
additionLineNumber: index < content.additions ? additionLineNumber + index : void 0,
|
|
347
|
+
deletionLineIndex: index < content.deletions ? deletionLineIndex + index : void 0,
|
|
348
|
+
deletionLineNumber: index < content.deletions ? deletionLineNumber + index : void 0,
|
|
349
|
+
noEOFCRDeletion: isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions,
|
|
350
|
+
noEOFCRAddition: isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
//#endregion
|
|
355
|
+
export { iterateOverDiff };
|
|
356
|
+
//# sourceMappingURL=iterateOverDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterateOverDiff.js","names":["state: IterationState","unifiedLineIndex","splitLineIndex","deletionLineIndex","additionLineIndex","deletionLineNumber","additionLineNumber","iterationRanges: [number, number][]","merged: [number, number][]"],"sources":["../../src/utils/iterateOverDiff.ts"],"sourcesContent":["import type {\n ChangeContent,\n FileDiffMetadata,\n Hunk,\n HunkExpansionRegion,\n} from '../types';\n\nexport interface DiffLineCallbackProps {\n hunkIndex: number;\n hunk: Hunk | undefined; // undefined for trailing expansion region\n collapsedBefore: number; // > 0 means separator before this line, value = hidden lines\n collapsedAfter: number; // > 0 only on final line if trailing collapsed content\n unifiedDeletionLineIndex: number | undefined;\n unifiedAdditionLineIndex: number | undefined;\n splitLineIndex: number;\n additionLineIndex: number | undefined;\n deletionLineIndex: number | undefined;\n additionLineNumber: number | undefined; // 1-based file line number\n deletionLineNumber: number | undefined;\n type: 'context' | 'context-expanded' | 'change';\n // noEOFCR metadata - true if this is the last line and has no trailing newline\n noEOFCRAddition: boolean;\n noEOFCRDeletion: boolean;\n}\n\ninterface IterationState {\n finalHunk: Hunk | undefined;\n isWindowedHighlight: boolean;\n viewportStart: number;\n viewportEnd: number;\n splitCount: number;\n unifiedCount: number;\n shouldBreak(): boolean;\n shouldSkip(unifiedHeight: number, splitHeight: number): boolean;\n incrementCounts(unifiedValue: number, splitValue: number): void;\n isInWindow(unifiedHeight: number, splitHeight: number): boolean;\n isInUnifiedWindow(height: number): boolean;\n isInSplitWindow(height: number): boolean;\n emit(props: DiffLineCallbackProps, silent?: boolean): boolean;\n}\n\nexport type DiffLineCallback = (props: DiffLineCallbackProps) => boolean | void;\n\nexport interface IterateOverDiffProps {\n diff: FileDiffMetadata;\n diffStyle: 'unified' | 'split' | 'both';\n startingLine?: number;\n totalLines?: number;\n expandedHunks?: Map<number, HunkExpansionRegion> | true;\n callback: DiffLineCallback;\n}\n\nexport function iterateOverDiff({\n diff,\n diffStyle,\n startingLine = 0,\n totalLines = Infinity,\n expandedHunks,\n callback,\n}: IterateOverDiffProps): void {\n const state: IterationState = {\n finalHunk: diff.hunks.at(-1),\n viewportStart: startingLine,\n viewportEnd: startingLine + totalLines,\n isWindowedHighlight: startingLine > 0 || totalLines < Infinity,\n splitCount: 0,\n unifiedCount: 0,\n shouldBreak() {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const breakUnified = state.unifiedCount >= startingLine + totalLines;\n const breakSplit = state.splitCount >= startingLine + totalLines;\n\n if (diffStyle === 'unified') {\n return breakUnified;\n } else if (diffStyle === 'split') {\n return breakSplit;\n } else {\n return breakUnified && breakSplit;\n }\n },\n shouldSkip(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const skipUnified = state.unifiedCount + unifiedHeight < startingLine;\n const skipSplit = state.splitCount + splitHeight < startingLine;\n\n if (diffStyle === 'unified') {\n return skipUnified;\n } else if (diffStyle === 'split') {\n return skipSplit;\n } else {\n return skipUnified && skipSplit;\n }\n },\n incrementCounts(unifiedValue: number, splitValue: number) {\n if (diffStyle === 'unified' || diffStyle === 'both') {\n state.unifiedCount += unifiedValue;\n }\n if (diffStyle === 'split' || diffStyle === 'both') {\n state.splitCount += splitValue;\n }\n },\n isInWindow(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return true;\n }\n\n const unifiedInWindow = state.isInUnifiedWindow(unifiedHeight);\n const splitInWindow = state.isInSplitWindow(splitHeight);\n\n if (diffStyle === 'unified') {\n return unifiedInWindow;\n } else if (diffStyle === 'split') {\n return splitInWindow;\n } else {\n return unifiedInWindow || splitInWindow;\n }\n },\n isInUnifiedWindow(unifiedHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.unifiedCount >= startingLine - unifiedHeight &&\n state.unifiedCount < startingLine + totalLines)\n );\n },\n isInSplitWindow(splitHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.splitCount >= startingLine - splitHeight &&\n state.splitCount < startingLine + totalLines)\n );\n },\n emit(props: DiffLineCallbackProps, silent = false): boolean {\n if (!silent) {\n if (diffStyle === 'unified') {\n state.incrementCounts(1, 0);\n } else if (diffStyle === 'split') {\n state.incrementCounts(0, 1);\n } else {\n state.incrementCounts(1, 1);\n // FIXME MAYBE\n // state.incrementCounts(\n // state.isInUnifiedWindow(0) ? 1 : 0,\n // state.isInSplitWindow(0) ? 1 : 0\n // );\n }\n }\n return callback(props) ?? false;\n },\n };\n\n hunkIterator: for (const [hunkIndex, hunk] of diff.hunks.entries()) {\n if (state.shouldBreak()) {\n break;\n }\n\n const leadingRegion = getExpandedRegion(\n diff.isPartial,\n hunk.collapsedBefore,\n expandedHunks,\n hunkIndex\n );\n // We only create a trailing region if it's the last hunk\n const trailingRegion = (() => {\n if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) {\n return undefined;\n }\n const additionRemaining =\n diff.additionLines.length -\n (hunk.additionLineIndex + hunk.additionCount);\n const deletionRemaining =\n diff.deletionLines.length -\n (hunk.deletionLineIndex + hunk.deletionCount);\n\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`\n );\n }\n const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);\n return getExpandedRegion(\n diff.isPartial,\n trailingRangeSize,\n expandedHunks,\n // hunkIndex for trailing region\n diff.hunks.length\n );\n })();\n const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;\n\n function getTrailingCollapsedAfter(\n unifiedLineIndex: number,\n splitLineIndex: number\n ) {\n if (\n trailingRegion == null ||\n trailingRegion.collapsedLines <= 0 ||\n trailingRegion.fromStart + trailingRegion.fromEnd > 0\n ) {\n return 0;\n }\n if (diffStyle === 'unified') {\n return unifiedLineIndex ===\n hunk.unifiedLineStart + hunk.unifiedLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n return splitLineIndex === hunk.splitLineStart + hunk.splitLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n function getPendingCollapsed() {\n if (leadingRegion.collapsedLines === 0) {\n return 0;\n }\n const value = leadingRegion.collapsedLines;\n leadingRegion.collapsedLines = 0;\n return value;\n }\n\n // Emit for expanded lines\n if (!state.shouldSkip(expandedLineCount, expandedLineCount)) {\n let unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.rangeSize;\n let splitLineIndex = hunk.splitLineStart - leadingRegion.rangeSize;\n\n let deletionLineIndex = hunk.deletionLineIndex - leadingRegion.rangeSize;\n let additionLineIndex = hunk.additionLineIndex - leadingRegion.rangeSize;\n let deletionLineNumber = hunk.deletionStart - leadingRegion.rangeSize;\n let additionLineNumber = hunk.additionStart - leadingRegion.rangeSize;\n\n let index = 0;\n // FIXME: add skip\n while (index < leadingRegion.fromStart) {\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk: hunk,\n collapsedBefore: 0,\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n unifiedDeletionLineIndex: unifiedLineIndex + index,\n unifiedAdditionLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n deletionLineIndex: deletionLineIndex + index,\n additionLineIndex: additionLineIndex + index,\n deletionLineNumber: deletionLineNumber + index,\n additionLineNumber: additionLineNumber + index,\n type: 'context-expanded',\n noEOFCRAddition: false,\n noEOFCRDeletion: false,\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n\n unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.fromEnd;\n splitLineIndex = hunk.splitLineStart - leadingRegion.fromEnd;\n\n deletionLineIndex = hunk.deletionLineIndex - leadingRegion.fromEnd;\n additionLineIndex = hunk.additionLineIndex - leadingRegion.fromEnd;\n deletionLineNumber = hunk.deletionStart - leadingRegion.fromEnd;\n additionLineNumber = hunk.additionStart - leadingRegion.fromEnd;\n index = 0;\n\n // FIXME(amadeus): Implement a skip if needed\n while (index < leadingRegion.fromEnd) {\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n unifiedDeletionLineIndex: unifiedLineIndex + index,\n unifiedAdditionLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n deletionLineIndex: deletionLineIndex + index,\n additionLineIndex: additionLineIndex + index,\n deletionLineNumber: deletionLineNumber + index,\n additionLineNumber: additionLineNumber + index,\n type: 'context-expanded',\n noEOFCRAddition: false,\n noEOFCRDeletion: false,\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(expandedLineCount, expandedLineCount);\n getPendingCollapsed();\n }\n\n let unifiedLineIndex = hunk.unifiedLineStart;\n let splitLineIndex = hunk.splitLineStart;\n\n let deletionLineIndex = hunk.deletionLineIndex;\n let additionLineIndex = hunk.additionLineIndex;\n let deletionLineNumber = hunk.deletionStart;\n let additionLineNumber = hunk.additionStart;\n const lastContent = hunk.hunkContent.at(-1);\n\n for (const content of hunk.hunkContent) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n\n const isLastContent = content === lastContent;\n\n // Hunk Context Content\n if (content.type === 'context') {\n if (!state.shouldSkip(content.lines, content.lines)) {\n let index = 0;\n // FIXME: add a skip if we aren't rendering all the lines\n while (index < content.lines) {\n if (state.isInWindow(0, 0)) {\n const isLastLine = isLastContent && index === content.lines - 1;\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex = splitLineIndex + index;\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n ),\n unifiedDeletionLineIndex: unifiedRowIndex,\n unifiedAdditionLineIndex: unifiedRowIndex,\n splitLineIndex: splitRowIndex,\n deletionLineIndex: deletionLineIndex + index,\n additionLineIndex: additionLineIndex + index,\n deletionLineNumber: deletionLineNumber + index,\n additionLineNumber: additionLineNumber + index,\n type: 'context',\n noEOFCRAddition: isLastLine && hunk.noEOFCRAdditions,\n noEOFCRDeletion: isLastLine && hunk.noEOFCRDeletions,\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(content.lines, content.lines);\n getPendingCollapsed();\n }\n unifiedLineIndex += content.lines;\n splitLineIndex += content.lines;\n\n deletionLineIndex += content.lines;\n additionLineIndex += content.lines;\n deletionLineNumber += content.lines;\n additionLineNumber += content.lines;\n }\n // Hunk Change Content\n else {\n const splitCount = Math.max(content.deletions, content.additions);\n const unifiedCount = content.deletions + content.additions;\n const shouldSkipChange = state.shouldSkip(unifiedCount, splitCount);\n if (!shouldSkipChange) {\n const iterationRanges = getChangeIterationRanges(\n state,\n content,\n diffStyle\n );\n\n // No need for any skipping because the render ranges skip for us\n for (const [rangeStart, rangeEnd] of iterationRanges) {\n for (let index = rangeStart; index < rangeEnd; index++) {\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex =\n diffStyle === 'unified'\n ? splitLineIndex +\n (index < content.deletions\n ? index\n : index - content.deletions)\n : splitLineIndex + index;\n const collapsedAfter = getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n );\n if (\n state.emit(\n getChangeLineData({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n }),\n true\n )\n ) {\n break hunkIterator;\n }\n }\n }\n }\n\n getPendingCollapsed();\n state.incrementCounts(unifiedCount, splitCount);\n unifiedLineIndex += unifiedCount;\n splitLineIndex += splitCount;\n deletionLineIndex += content.deletions;\n additionLineIndex += content.additions;\n deletionLineNumber += content.deletions;\n additionLineNumber += content.additions;\n }\n }\n\n if (trailingRegion != null) {\n const { collapsedLines, fromStart, fromEnd } = trailingRegion;\n const len = fromStart + fromEnd;\n let index = 0;\n // FIXME: add a skip\n while (index < len) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n if (state.isInWindow(0, 0)) {\n const isLastLine = index === len - 1;\n if (\n state.emit({\n hunkIndex: diff.hunks.length,\n hunk: undefined,\n collapsedBefore: 0,\n collapsedAfter: isLastLine ? collapsedLines : 0,\n unifiedDeletionLineIndex: unifiedLineIndex + index,\n unifiedAdditionLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n additionLineIndex: additionLineIndex + index,\n deletionLineIndex: deletionLineIndex + index,\n additionLineNumber: additionLineNumber + index,\n deletionLineNumber: deletionLineNumber + index,\n type: 'context-expanded',\n noEOFCRAddition: false,\n noEOFCRDeletion: false,\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n }\n }\n}\n\ninterface ExpandedRegionResult {\n fromStart: number;\n fromEnd: number;\n rangeSize: number;\n collapsedLines: number;\n}\n\nfunction getExpandedRegion(\n isPartial: boolean,\n rangeSize: number,\n expandedHunks: Map<number, HunkExpansionRegion> | true | undefined,\n hunkIndex: number\n): ExpandedRegionResult {\n rangeSize = Math.max(rangeSize, 0);\n if (rangeSize === 0 || isPartial) {\n return {\n fromStart: 0,\n fromEnd: 0,\n rangeSize,\n collapsedLines: Math.max(rangeSize, 0),\n };\n }\n if (expandedHunks === true) {\n return {\n fromStart: rangeSize,\n fromEnd: 0,\n rangeSize,\n collapsedLines: 0,\n };\n }\n const region = expandedHunks?.get(hunkIndex);\n const fromStart = Math.min(Math.max(region?.fromStart ?? 0, 0), rangeSize);\n const fromEnd = Math.min(Math.max(region?.fromEnd ?? 0, 0), rangeSize);\n const expandedCount = fromStart + fromEnd;\n const renderAll = expandedCount >= rangeSize;\n return {\n fromStart: renderAll ? rangeSize : fromStart,\n fromEnd: renderAll ? 0 : fromEnd,\n rangeSize,\n collapsedLines: Math.max(rangeSize - expandedCount, 0),\n };\n}\n\nfunction hasFinalCollapsedHunk(diff: FileDiffMetadata): boolean {\n const lastHunk = diff.hunks.at(-1);\n if (\n lastHunk == null ||\n diff.isPartial ||\n diff.additionLines.length === 0 ||\n diff.deletionLines.length === 0\n ) {\n return false;\n }\n return (\n lastHunk.additionLineIndex + lastHunk.additionCount <\n diff.additionLines.length ||\n lastHunk.deletionLineIndex + lastHunk.deletionCount <\n diff.deletionLines.length\n );\n}\n\n// The intention of this function is to grab the appropriate windowed ranges of\n// the change content. If diffStyle is both, we will iterate AS split, however\n// we will encompass all needed lines to allow us to render split or unified\nfunction getChangeIterationRanges(\n state: IterationState,\n content: ChangeContent,\n diffStyle: 'split' | 'unified' | 'both'\n): [number, number][] {\n // If not a window highlight, then we should just render the entire range\n if (!state.isWindowedHighlight) {\n return [\n [\n 0,\n diffStyle === 'unified'\n ? content.deletions + content.additions\n : Math.max(content.deletions, content.additions),\n ],\n ];\n }\n const useUnified = diffStyle !== 'split';\n const useSplit = diffStyle !== 'unified';\n const iterationSpace = diffStyle === 'unified' ? 'unified' : 'split';\n const iterationRanges: [number, number][] = [];\n function getVisibleRange(\n start: number,\n count: number\n ): [number, number] | undefined {\n const end = start + count;\n if (end <= state.viewportStart || start >= state.viewportEnd) {\n return undefined;\n }\n const visibleStart = Math.max(0, state.viewportStart - start);\n const visibleEnd = Math.min(count, state.viewportEnd - start);\n return visibleEnd > visibleStart ? [visibleStart, visibleEnd] : undefined;\n }\n function mapRangeToIteration(\n range: [number, number],\n kind: 'deletions' | 'additions'\n ): [number, number] {\n if (iterationSpace === 'split') {\n // For split iteration, additions/deletions are already in split row space.\n return range;\n }\n return kind === 'additions'\n ? [range[0] + content.deletions, range[1] + content.deletions]\n : range;\n }\n function pushRange(\n range: [number, number] | undefined,\n kind: 'deletions' | 'additions'\n ) {\n if (range == null) {\n return;\n }\n const [start, end] = mapRangeToIteration(range, kind);\n if (end > start) {\n iterationRanges.push([start, end]);\n }\n }\n\n if (useUnified) {\n pushRange(\n getVisibleRange(state.unifiedCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(\n state.unifiedCount + content.deletions,\n content.additions\n ),\n 'additions'\n );\n }\n\n if (useSplit) {\n pushRange(\n getVisibleRange(state.splitCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(state.splitCount, content.additions),\n 'additions'\n );\n }\n\n if (iterationRanges.length === 0) {\n return iterationRanges;\n }\n\n iterationRanges.sort((a, b) => a[0] - b[0]);\n const merged: [number, number][] = [iterationRanges[0]];\n for (const [start, end] of iterationRanges.slice(1)) {\n const last = merged[merged.length - 1];\n if (start <= last[1]) {\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n\ninterface GetChangeLineDataProps {\n hunkIndex: number;\n hunk: Hunk;\n collapsedBefore: number;\n collapsedAfter: number;\n diffStyle: 'split' | 'unified' | 'both';\n index: number;\n unifiedLineIndex: number;\n splitLineIndex: number;\n additionLineIndex: number;\n additionLineNumber: number;\n deletionLineNumber: number;\n deletionLineIndex: number;\n content: ChangeContent;\n isLastContent: boolean;\n unifiedCount: number;\n splitCount: number;\n}\n\n// NOTE(amadeus): It's quite tedious to grab the appropriate line info and\n// related props for change content regions, so I made it a specialized\n// function to help make the main hunkIterator easy to reason about\nfunction getChangeLineData({\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n}: GetChangeLineDataProps): DiffLineCallbackProps {\n if (diffStyle === 'unified') {\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n unifiedDeletionLineIndex:\n index < content.deletions ? unifiedLineIndex + index : undefined,\n unifiedAdditionLineIndex:\n index >= content.deletions ? unifiedLineIndex + index : undefined,\n splitLineIndex:\n splitLineIndex +\n (index < content.deletions ? index : index - content.deletions),\n additionLineIndex:\n index >= content.deletions\n ? additionLineIndex + (index - content.deletions)\n : undefined,\n additionLineNumber:\n index >= content.deletions\n ? additionLineNumber + (index - content.deletions)\n : undefined,\n deletionLineIndex:\n index < content.deletions ? deletionLineIndex + index : undefined,\n deletionLineNumber:\n index < content.deletions ? deletionLineNumber + index : undefined,\n noEOFCRDeletion:\n isLastContent &&\n index === content.deletions - 1 &&\n hunk.noEOFCRDeletions,\n noEOFCRAddition:\n isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions,\n };\n }\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n unifiedDeletionLineIndex:\n index < content.deletions ? unifiedLineIndex + index : undefined,\n unifiedAdditionLineIndex:\n index < content.additions\n ? unifiedLineIndex + content.deletions + index\n : undefined,\n splitLineIndex: splitLineIndex + index,\n additionLineIndex:\n index < content.additions ? additionLineIndex + index : undefined,\n additionLineNumber:\n index < content.additions ? additionLineNumber + index : undefined,\n deletionLineIndex:\n index < content.deletions ? deletionLineIndex + index : undefined,\n deletionLineNumber:\n index < content.deletions ? deletionLineNumber + index : undefined,\n noEOFCRDeletion:\n isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions,\n noEOFCRAddition:\n isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseDiffFromFile.d.ts","names":[],"sources":["../../src/utils/parseDiffFromFile.ts"],"sourcesContent":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"parseDiffFromFile.d.ts","names":[],"sources":["../../src/utils/parseDiffFromFile.ts"],"sourcesContent":[],"mappings":";;;;;;;AAWA;;;;AAMG,iBANa,iBAAA,CAMb,OAAA,EAHQ,YAGR,EAAA,OAAA,EAFQ,YAER,EAAA,OAAA,CAAA,EADS,8BACT,CAAA,EAAA,gBAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { parsePatchFiles } from "./parsePatchFiles.js";
|
|
1
|
+
import { processFile } from "./parsePatchFiles.js";
|
|
3
2
|
import { createTwoFilesPatch } from "diff";
|
|
4
3
|
|
|
5
4
|
//#region src/utils/parseDiffFromFile.ts
|
|
@@ -10,11 +9,14 @@ import { createTwoFilesPatch } from "diff";
|
|
|
10
9
|
* automatically get a combined cache key in the format `oldKey:newKey`.
|
|
11
10
|
*/
|
|
12
11
|
function parseDiffFromFile(oldFile, newFile, options) {
|
|
13
|
-
const fileData =
|
|
12
|
+
const fileData = processFile(createTwoFilesPatch(oldFile.name, newFile.name, oldFile.contents, newFile.contents, oldFile.header, newFile.header, options), {
|
|
13
|
+
cacheKey: (() => {
|
|
14
|
+
if (oldFile.cacheKey != null && newFile.cacheKey != null) return `${oldFile.cacheKey}:${newFile.cacheKey}`;
|
|
15
|
+
})(),
|
|
16
|
+
oldFile,
|
|
17
|
+
newFile
|
|
18
|
+
});
|
|
14
19
|
if (fileData == null) throw new Error("parseDiffFrom: FileInvalid diff -- probably need to fix something -- if the files are the same maybe?");
|
|
15
|
-
fileData.oldLines = oldFile.contents.split(SPLIT_WITH_NEWLINES);
|
|
16
|
-
fileData.newLines = newFile.contents.split(SPLIT_WITH_NEWLINES);
|
|
17
|
-
if (oldFile.cacheKey != null && newFile.cacheKey != null) fileData.cacheKey = `${oldFile.cacheKey}:${newFile.cacheKey}`;
|
|
18
20
|
return fileData;
|
|
19
21
|
}
|
|
20
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseDiffFromFile.js","names":[],"sources":["../../src/utils/parseDiffFromFile.ts"],"sourcesContent":["import { type CreatePatchOptionsNonabortable, createTwoFilesPatch } from 'diff';\n\nimport
|
|
1
|
+
{"version":3,"file":"parseDiffFromFile.js","names":[],"sources":["../../src/utils/parseDiffFromFile.ts"],"sourcesContent":["import { type CreatePatchOptionsNonabortable, createTwoFilesPatch } from 'diff';\n\nimport type { FileContents, FileDiffMetadata } from '../types';\nimport { processFile } from './parsePatchFiles';\n\n/**\n * Parses a diff from two file contents objects.\n *\n * If both `oldFile` and `newFile` have a `cacheKey`, the resulting diff will\n * automatically get a combined cache key in the format `oldKey:newKey`.\n */\nexport function parseDiffFromFile(\n // FIXME(amadeus): oldFile/newFile should be optional to simulate new/deleted\n // files\n oldFile: FileContents,\n newFile: FileContents,\n options?: CreatePatchOptionsNonabortable\n): FileDiffMetadata {\n const patch = createTwoFilesPatch(\n oldFile.name,\n newFile.name,\n oldFile.contents,\n newFile.contents,\n oldFile.header,\n newFile.header,\n options\n );\n\n const fileData = processFile(patch, {\n cacheKey: (() => {\n if (oldFile.cacheKey != null && newFile.cacheKey != null) {\n return `${oldFile.cacheKey}:${newFile.cacheKey}`;\n }\n return undefined;\n })(),\n oldFile,\n newFile,\n });\n if (fileData == null) {\n throw new Error(\n 'parseDiffFrom: FileInvalid diff -- probably need to fix something -- if the files are the same maybe?'\n );\n }\n return fileData;\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,kBAGd,SACA,SACA,SACkB;CAWlB,MAAM,WAAW,YAVH,oBACZ,QAAQ,MACR,QAAQ,MACR,QAAQ,UACR,QAAQ,UACR,QAAQ,QACR,QAAQ,QACR,QACD,EAEmC;EAClC,iBAAiB;AACf,OAAI,QAAQ,YAAY,QAAQ,QAAQ,YAAY,KAClD,QAAO,GAAG,QAAQ,SAAS,GAAG,QAAQ;MAGtC;EACJ;EACA;EACD,CAAC;AACF,KAAI,YAAY,KACd,OAAM,IAAI,MACR,wGACD;AAEH,QAAO"}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
import { ParsedPatch } from "../types.js";
|
|
1
|
+
import { FileContents, FileDiffMetadata, ParsedPatch } from "../types.js";
|
|
2
2
|
|
|
3
3
|
//#region src/utils/parsePatchFiles.d.ts
|
|
4
|
-
|
|
4
|
+
declare function processPatch(data: string, cacheKeyPrefix?: string): ParsedPatch;
|
|
5
|
+
interface ProcessFileOptions {
|
|
6
|
+
cacheKey?: string;
|
|
7
|
+
isGitDiff?: boolean;
|
|
8
|
+
oldFile?: FileContents;
|
|
9
|
+
newFile?: FileContents;
|
|
10
|
+
}
|
|
11
|
+
declare function processFile(fileDiffString: string, {
|
|
12
|
+
cacheKey,
|
|
13
|
+
isGitDiff,
|
|
14
|
+
oldFile,
|
|
15
|
+
newFile
|
|
16
|
+
}?: ProcessFileOptions): FileDiffMetadata | undefined;
|
|
5
17
|
/**
|
|
6
18
|
* Parses a patch file string into an array of parsed patches.
|
|
7
19
|
*
|
|
@@ -12,5 +24,5 @@ import { ParsedPatch } from "../types.js";
|
|
|
12
24
|
*/
|
|
13
25
|
declare function parsePatchFiles(data: string, cacheKeyPrefix?: string): ParsedPatch[];
|
|
14
26
|
//#endregion
|
|
15
|
-
export { parsePatchFiles };
|
|
27
|
+
export { parsePatchFiles, processFile, processPatch };
|
|
16
28
|
//# sourceMappingURL=parsePatchFiles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parsePatchFiles.d.ts","names":[],"sources":["../../src/utils/parsePatchFiles.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parsePatchFiles.d.ts","names":[],"sources":["../../src/utils/parsePatchFiles.ts"],"sourcesContent":[],"mappings":";;;iBAuBgB,YAAA,yCAGb;UAgDO,kBAAA;EAnDV,QAAgB,CAAA,EAAA,MAAA;EAGb,SAgDO,CAAA,EAAA,OAAA;EAOV,OAAgB,CAAA,EAJJ,YAII;EAGZ,OAAA,CAAA,EANQ,YAMR;;AAEA,iBALY,WAAA,CAKZ,cAAA,EAAA,MAAA,EAAA;EAAA,QAAA;EAAA,SAAA;EAAA,OAAA;EAAA;AAAA,CAAA,CAAA,EAEC,kBAFD,CAAA,EAGD,gBAHC,GAAA,SAAA;;;;;AA4WJ;;;;iBAAgB,eAAA,yCAGb"}
|