@pierre/diffs 1.1.1 → 1.1.3
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 +7 -3
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +12 -3
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +4 -0
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +12 -3
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts +19 -9
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/UnresolvedFile.js +160 -53
- package/dist/components/UnresolvedFile.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/constants.d.ts +5 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +8 -7
- package/dist/index.js +5 -4
- package/dist/react/UnresolvedFile.d.ts +9 -3
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/index.d.ts +3 -3
- package/dist/react/utils/renderDiffChildren.d.ts +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +6 -4
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.d.ts +3 -2
- package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +15 -12
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +15 -7
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +9 -7
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +11 -16
- package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/UnresolvedFileHunksRenderer.js +68 -75
- package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/preloadDiffs.d.ts +2 -2
- package/dist/ssr/preloadDiffs.d.ts.map +1 -1
- package/dist/ssr/preloadDiffs.js +4 -3
- package/dist/ssr/preloadDiffs.js.map +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +41 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js +1 -1
- package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.d.ts +3 -2
- package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
- package/dist/utils/diffAcceptRejectHunk.js +24 -89
- package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.d.ts +4 -6
- package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
- package/dist/utils/getMergeConflictActionSlotName.js +2 -2
- package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.d.ts +1 -2
- package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
- package/dist/utils/getMergeConflictLineTypes.js +7 -12
- package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
- package/dist/utils/normalizeDiffResolution.d.ts +7 -0
- package/dist/utils/normalizeDiffResolution.d.ts.map +1 -0
- package/dist/utils/normalizeDiffResolution.js +11 -0
- package/dist/utils/normalizeDiffResolution.js.map +1 -0
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts +16 -12
- package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
- package/dist/utils/parseMergeConflictDiffFromFile.js +474 -117
- package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
- package/dist/utils/resolveConflict.d.ts +7 -0
- package/dist/utils/resolveConflict.d.ts.map +1 -0
- package/dist/utils/resolveConflict.js +23 -0
- package/dist/utils/resolveConflict.js.map +1 -0
- package/dist/utils/resolveRegion.d.ts +14 -0
- package/dist/utils/resolveRegion.d.ts.map +1 -0
- package/dist/utils/resolveRegion.js +215 -0
- package/dist/utils/resolveRegion.js.map +1 -0
- package/dist/utils/trimPatchContext.js +19 -20
- package/dist/utils/trimPatchContext.js.map +1 -1
- package/dist/worker/worker-portable.js +4 -0
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js.map +1 -1
- package/package.json +2 -1
- package/dist/utils/resolveMergeConflict.d.ts +0 -7
- package/dist/utils/resolveMergeConflict.d.ts.map +0 -1
- package/dist/utils/resolveMergeConflict.js +0 -30
- package/dist/utils/resolveMergeConflict.js.map +0 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { DEFAULT_THEMES } from "../constants.js";
|
|
2
2
|
import { pluckInteractionOptions } from "../managers/InteractionManager.js";
|
|
3
|
+
import { splitFileContents } from "../utils/splitFileContents.js";
|
|
3
4
|
import { areFilesEqual } from "../utils/areFilesEqual.js";
|
|
4
5
|
import { createAnnotationWrapperNode } from "../utils/createAnnotationWrapperNode.js";
|
|
5
6
|
import { FileDiff } from "./FileDiff.js";
|
|
6
7
|
import { getMergeConflictActionSlotName } from "../utils/getMergeConflictActionSlotName.js";
|
|
7
|
-
import { getMergeConflictActionAnchor, parseMergeConflictDiffFromFile } from "../utils/parseMergeConflictDiffFromFile.js";
|
|
8
|
+
import { buildMergeConflictMarkerRows, getMergeConflictActionAnchor, parseMergeConflictDiffFromFile } from "../utils/parseMergeConflictDiffFromFile.js";
|
|
8
9
|
import { UnresolvedFileHunksRenderer } from "../renderers/UnresolvedFileHunksRenderer.js";
|
|
9
10
|
import { areMergeConflictActionsEqual } from "../utils/areMergeConflictActionsEqual.js";
|
|
10
|
-
import {
|
|
11
|
+
import { resolveConflict } from "../utils/resolveConflict.js";
|
|
11
12
|
|
|
12
13
|
//#region src/components/UnresolvedFile.ts
|
|
13
14
|
let instanceId = -1;
|
|
@@ -16,9 +17,11 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
16
17
|
computedCache = {
|
|
17
18
|
file: void 0,
|
|
18
19
|
fileDiff: void 0,
|
|
19
|
-
actions: void 0
|
|
20
|
+
actions: void 0,
|
|
21
|
+
markerRows: void 0
|
|
20
22
|
};
|
|
21
23
|
conflictActions = [];
|
|
24
|
+
markerRows = [];
|
|
22
25
|
conflictActionCache = /* @__PURE__ */ new Map();
|
|
23
26
|
constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
|
|
24
27
|
super(void 0, workerManager, isContainerManaged);
|
|
@@ -37,11 +40,7 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
37
40
|
return new UnresolvedFileHunksRenderer(this.getHunksRendererOptions(options), this.handleHighlightRender, this.workerManager);
|
|
38
41
|
}
|
|
39
42
|
getHunksRendererOptions(options) {
|
|
40
|
-
return
|
|
41
|
-
...this.options,
|
|
42
|
-
hunkSeparators: typeof options.hunkSeparators === "function" ? "custom" : options.hunkSeparators,
|
|
43
|
-
mergeConflictActionsType: typeof options.mergeConflictActionsType === "function" ? "custom" : options.mergeConflictActionsType
|
|
44
|
-
};
|
|
43
|
+
return getUnresolvedDiffHunksRendererOptions(options, this.options);
|
|
45
44
|
}
|
|
46
45
|
applyPreNodeAttributes(pre, result) {
|
|
47
46
|
super.applyPreNodeAttributes(pre, result, { "data-has-merge-conflict": "" });
|
|
@@ -51,73 +50,88 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
51
50
|
this.computedCache = {
|
|
52
51
|
file: void 0,
|
|
53
52
|
fileDiff: void 0,
|
|
54
|
-
actions: void 0
|
|
53
|
+
actions: void 0,
|
|
54
|
+
markerRows: void 0
|
|
55
55
|
};
|
|
56
56
|
this.conflictActions = [];
|
|
57
57
|
super.cleanUp();
|
|
58
58
|
}
|
|
59
|
-
getOrComputeDiff({ file, fileDiff, actions }) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
getOrComputeDiff({ file, fileDiff, actions, markerRows }) {
|
|
60
|
+
const { maxContextLines, onMergeConflictAction } = this.options;
|
|
61
|
+
wrapper: if (onMergeConflictAction != null) {
|
|
62
|
+
const hasFileDiff = fileDiff != null;
|
|
63
|
+
if (hasFileDiff !== (actions != null) || hasFileDiff !== (markerRows != null)) throw new Error("UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows must be passed together");
|
|
64
|
+
if (fileDiff != null && actions != null && markerRows != null) {
|
|
63
65
|
this.computedCache = {
|
|
64
66
|
file: file ?? this.computedCache.file,
|
|
65
67
|
fileDiff,
|
|
66
|
-
actions
|
|
68
|
+
actions,
|
|
69
|
+
markerRows
|
|
67
70
|
};
|
|
68
71
|
break wrapper;
|
|
69
72
|
} else if (file != null || this.computedCache.file != null) {
|
|
73
|
+
if (file != null && this.computedCache.file != null && !areFilesEqual(file, this.computedCache.file) && this.computedCache.fileDiff != null && this.computedCache.actions != null) throw new Error("UnresolvedFile.getOrComputeDiff: file can only be used to initialize unresolved state once. Pass fileDiff and actions for subsequent updates.");
|
|
70
74
|
file ??= this.computedCache.file;
|
|
71
75
|
if (file == null) throw new Error("UnresolvedFile.getOrComputeDiff: file is null, should be impossible");
|
|
72
76
|
if (!areFilesEqual(file, this.computedCache.file) || this.computedCache.fileDiff == null || this.computedCache.actions == null) {
|
|
73
|
-
const computed = parseMergeConflictDiffFromFile(file);
|
|
77
|
+
const computed = parseMergeConflictDiffFromFile(file, maxContextLines);
|
|
74
78
|
this.computedCache = {
|
|
75
79
|
file,
|
|
76
80
|
fileDiff: computed.fileDiff,
|
|
77
|
-
actions: computed.actions
|
|
81
|
+
actions: computed.actions,
|
|
82
|
+
markerRows: computed.markerRows
|
|
78
83
|
};
|
|
79
84
|
}
|
|
80
85
|
fileDiff = this.computedCache.fileDiff;
|
|
81
86
|
actions = this.computedCache.actions;
|
|
87
|
+
markerRows = this.computedCache.markerRows;
|
|
82
88
|
break wrapper;
|
|
83
89
|
} else {
|
|
84
90
|
fileDiff = this.computedCache.fileDiff;
|
|
85
91
|
actions = this.computedCache.actions;
|
|
92
|
+
markerRows = this.computedCache.markerRows;
|
|
86
93
|
break wrapper;
|
|
87
94
|
}
|
|
88
95
|
} else {
|
|
89
|
-
if (fileDiff != null || actions != null) throw new Error("UnresolvedFile.getOrComputeDiff: fileDiff and
|
|
96
|
+
if (fileDiff != null || actions != null || markerRows != null) throw new Error("UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows are only usable in controlled mode, you must pass in `onMergeConflictAction`");
|
|
97
|
+
if (file != null && this.computedCache.file != null && !areFilesEqual(file, this.computedCache.file)) throw new Error("UnresolvedFile.getOrComputeDiff: uncontrolled unresolved files parse the file only once. Later updates must come from the cached diff state.");
|
|
90
98
|
this.computedCache.file ??= file;
|
|
91
99
|
if (this.computedCache.fileDiff == null && this.computedCache.file != null) {
|
|
92
|
-
const computed = parseMergeConflictDiffFromFile(this.computedCache.file);
|
|
100
|
+
const computed = parseMergeConflictDiffFromFile(this.computedCache.file, maxContextLines);
|
|
93
101
|
this.computedCache.fileDiff = computed.fileDiff;
|
|
94
102
|
this.computedCache.actions = computed.actions;
|
|
103
|
+
this.computedCache.markerRows = computed.markerRows;
|
|
95
104
|
}
|
|
96
105
|
fileDiff = this.computedCache.fileDiff;
|
|
97
106
|
actions = this.computedCache.actions;
|
|
107
|
+
markerRows = this.computedCache.markerRows;
|
|
98
108
|
break wrapper;
|
|
99
109
|
}
|
|
100
|
-
if (fileDiff == null || actions == null) return;
|
|
110
|
+
if (fileDiff == null || actions == null || markerRows == null) return;
|
|
101
111
|
return {
|
|
102
112
|
fileDiff,
|
|
103
|
-
actions
|
|
113
|
+
actions,
|
|
114
|
+
markerRows
|
|
104
115
|
};
|
|
105
116
|
}
|
|
106
117
|
hydrate(props) {
|
|
107
|
-
const { file, fileDiff, actions, lineAnnotations,...rest } = props;
|
|
118
|
+
const { file, fileDiff, actions, markerRows, lineAnnotations, preventEmit = false,...rest } = props;
|
|
108
119
|
const source = this.getOrComputeDiff({
|
|
109
120
|
file,
|
|
110
121
|
fileDiff,
|
|
111
|
-
actions
|
|
122
|
+
actions,
|
|
123
|
+
markerRows
|
|
112
124
|
});
|
|
113
125
|
if (source == null) return;
|
|
114
|
-
this.
|
|
126
|
+
this.setActiveMergeConflictState(source.actions, source.markerRows);
|
|
115
127
|
super.hydrate({
|
|
116
128
|
...rest,
|
|
117
129
|
fileDiff: source.fileDiff,
|
|
118
|
-
lineAnnotations
|
|
130
|
+
lineAnnotations,
|
|
131
|
+
preventEmit: true
|
|
119
132
|
});
|
|
120
133
|
this.renderMergeConflictActionSlots();
|
|
134
|
+
if (!preventEmit) this.emitPostRender();
|
|
121
135
|
}
|
|
122
136
|
rerender() {
|
|
123
137
|
if (!this.enabled || this.fileDiff == null) return;
|
|
@@ -127,25 +141,30 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
127
141
|
});
|
|
128
142
|
}
|
|
129
143
|
render(props = {}) {
|
|
130
|
-
let { file, fileDiff, actions, lineAnnotations,...rest } = props;
|
|
144
|
+
let { file, fileDiff, actions, markerRows, lineAnnotations, preventEmit = false,...rest } = props;
|
|
131
145
|
const source = this.getOrComputeDiff({
|
|
132
146
|
file,
|
|
133
147
|
fileDiff,
|
|
134
|
-
actions
|
|
148
|
+
actions,
|
|
149
|
+
markerRows
|
|
135
150
|
});
|
|
136
151
|
if (source == null) return false;
|
|
137
|
-
this.
|
|
152
|
+
this.setActiveMergeConflictState(source.actions, source.markerRows);
|
|
138
153
|
const didRender = super.render({
|
|
139
154
|
...rest,
|
|
140
155
|
fileDiff: source.fileDiff,
|
|
141
|
-
lineAnnotations
|
|
156
|
+
lineAnnotations,
|
|
157
|
+
preventEmit: true
|
|
142
158
|
});
|
|
143
|
-
|
|
159
|
+
if (didRender) {
|
|
160
|
+
this.renderMergeConflictActionSlots();
|
|
161
|
+
if (!preventEmit) this.emitPostRender();
|
|
162
|
+
}
|
|
144
163
|
return didRender;
|
|
145
164
|
}
|
|
146
|
-
resolveConflict(conflictIndex, resolution,
|
|
165
|
+
resolveConflict(conflictIndex, resolution, fileDiff = this.computedCache.fileDiff) {
|
|
147
166
|
const action = this.conflictActions[conflictIndex];
|
|
148
|
-
if (
|
|
167
|
+
if (fileDiff == null || action == null) return;
|
|
149
168
|
if (action.conflictIndex !== conflictIndex) {
|
|
150
169
|
console.error({
|
|
151
170
|
conflictIndex,
|
|
@@ -153,15 +172,20 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
153
172
|
});
|
|
154
173
|
throw new Error("UnresolvedFile.resolveConflict: conflictIndex and conflictAction don't match");
|
|
155
174
|
}
|
|
156
|
-
const
|
|
157
|
-
|
|
158
|
-
|
|
175
|
+
const newFileDiff = resolveConflict(fileDiff, action, resolution);
|
|
176
|
+
const previousFile = this.computedCache.file;
|
|
177
|
+
const { file, actions, markerRows } = rebuildFileAndActions({
|
|
178
|
+
fileDiff: newFileDiff,
|
|
179
|
+
previousActions: this.conflictActions,
|
|
180
|
+
resolvedConflictIndex: conflictIndex,
|
|
181
|
+
previousFile,
|
|
182
|
+
resolution
|
|
159
183
|
});
|
|
160
|
-
if (contents === file.contents) return;
|
|
161
184
|
return {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
185
|
+
file,
|
|
186
|
+
fileDiff: newFileDiff,
|
|
187
|
+
actions,
|
|
188
|
+
markerRows
|
|
165
189
|
};
|
|
166
190
|
}
|
|
167
191
|
resolveConflictAndRender(conflictIndex, resolution) {
|
|
@@ -178,18 +202,23 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
178
202
|
resolution,
|
|
179
203
|
conflict: action.conflict
|
|
180
204
|
};
|
|
181
|
-
const
|
|
182
|
-
if (
|
|
183
|
-
this.computedCache
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
205
|
+
const { file, fileDiff, actions, markerRows } = this.resolveConflict(conflictIndex, resolution) ?? {};
|
|
206
|
+
if (file == null || fileDiff == null || actions == null || markerRows == null) return;
|
|
207
|
+
this.computedCache = {
|
|
208
|
+
file,
|
|
209
|
+
fileDiff,
|
|
210
|
+
actions,
|
|
211
|
+
markerRows
|
|
212
|
+
};
|
|
213
|
+
this.setActiveMergeConflictState(actions, markerRows);
|
|
214
|
+
if (this.workerManager != null) this.hunksRenderer.renderDiff(fileDiff);
|
|
215
|
+
else this.render({ forceRender: true });
|
|
216
|
+
this.options.onMergeConflictResolve?.(file, payload);
|
|
189
217
|
}
|
|
190
|
-
|
|
218
|
+
setActiveMergeConflictState(actions = this.conflictActions, markerRows = this.markerRows) {
|
|
191
219
|
this.conflictActions = actions;
|
|
192
|
-
|
|
220
|
+
this.markerRows = markerRows;
|
|
221
|
+
if (this.computedCache.fileDiff != null && this.hunksRenderer instanceof UnresolvedFileHunksRenderer) this.hunksRenderer.setConflictState(this.options.mergeConflictActionsType === "none" ? [] : actions, markerRows, this.computedCache.fileDiff);
|
|
193
222
|
}
|
|
194
223
|
handleMergeConflictActionClick = (target) => {
|
|
195
224
|
const action = this.conflictActions[target.conflictIndex];
|
|
@@ -212,7 +241,8 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
212
241
|
this.resolveConflictAndRender(target.conflictIndex, target.resolution);
|
|
213
242
|
};
|
|
214
243
|
renderMergeConflictActionSlots() {
|
|
215
|
-
|
|
244
|
+
const { fileDiff } = this.computedCache;
|
|
245
|
+
if (this.isContainerManaged || this.fileContainer == null || typeof this.options.mergeConflictActionsType !== "function" || this.conflictActions.length === 0 || fileDiff == null) {
|
|
216
246
|
this.clearMergeConflictActionCache();
|
|
217
247
|
return;
|
|
218
248
|
}
|
|
@@ -227,12 +257,12 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
227
257
|
});
|
|
228
258
|
throw new Error("UnresolvedFile.renderMergeConflictActionSlots: conflictIndex and conflictAction don't match");
|
|
229
259
|
}
|
|
230
|
-
const anchor = getMergeConflictActionAnchor(action);
|
|
260
|
+
const anchor = getMergeConflictActionAnchor(action, fileDiff);
|
|
231
261
|
if (anchor == null) continue;
|
|
232
262
|
const conflictIndex = action.conflictIndex;
|
|
233
263
|
const slotName = getMergeConflictActionSlotName({
|
|
234
|
-
|
|
235
|
-
|
|
264
|
+
hunkIndex: anchor.hunkIndex,
|
|
265
|
+
lineIndex: anchor.lineIndex,
|
|
236
266
|
conflictIndex
|
|
237
267
|
});
|
|
238
268
|
const id = `${actionIndex}-${slotName}`;
|
|
@@ -274,7 +304,84 @@ var UnresolvedFile = class extends FileDiff {
|
|
|
274
304
|
this.conflictActionCache.clear();
|
|
275
305
|
}
|
|
276
306
|
};
|
|
307
|
+
function rebuildFileAndActions({ fileDiff, previousActions, resolvedConflictIndex, previousFile, resolution }) {
|
|
308
|
+
const resolvedAction = previousActions[resolvedConflictIndex];
|
|
309
|
+
if (resolvedAction == null) throw new Error("rebuildFileAndActions: missing resolved action for unresolved file rebuild");
|
|
310
|
+
const actions = updateConflictActionsAfterResolution(previousActions, resolvedConflictIndex, resolvedAction, resolution);
|
|
311
|
+
const markerRows = buildMergeConflictMarkerRows(fileDiff, actions);
|
|
312
|
+
return {
|
|
313
|
+
file: rebuildUnresolvedFile({
|
|
314
|
+
fileDiff,
|
|
315
|
+
resolvedAction,
|
|
316
|
+
resolvedConflictIndex,
|
|
317
|
+
previousFile,
|
|
318
|
+
resolution
|
|
319
|
+
}),
|
|
320
|
+
actions,
|
|
321
|
+
markerRows
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function rebuildUnresolvedFile({ resolvedAction, resolvedConflictIndex, previousFile, fileDiff, resolution }) {
|
|
325
|
+
const lines = splitFileContents(previousFile?.contents ?? "");
|
|
326
|
+
const { conflict } = resolvedAction;
|
|
327
|
+
const replacementLines = getResolvedConflictReplacementLines(lines, conflict, resolution);
|
|
328
|
+
const contents = [
|
|
329
|
+
...lines.slice(0, conflict.startLineIndex),
|
|
330
|
+
...replacementLines,
|
|
331
|
+
...lines.slice(conflict.endLineIndex + 1)
|
|
332
|
+
].join("");
|
|
333
|
+
return {
|
|
334
|
+
name: previousFile?.name ?? fileDiff.name,
|
|
335
|
+
contents,
|
|
336
|
+
cacheKey: previousFile?.cacheKey != null ? `${previousFile.cacheKey}:mc-${resolvedConflictIndex}-${resolution}` : void 0
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
function getResolvedConflictReplacementLines(lines, conflict, resolution) {
|
|
340
|
+
const currentLines = lines.slice(conflict.startLineIndex + 1, conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex);
|
|
341
|
+
const incomingLines = lines.slice(conflict.separatorLineIndex + 1, conflict.endLineIndex);
|
|
342
|
+
if (resolution === "current") return currentLines;
|
|
343
|
+
if (resolution === "incoming") return incomingLines;
|
|
344
|
+
return [...currentLines, ...incomingLines];
|
|
345
|
+
}
|
|
346
|
+
function updateConflictActionsAfterResolution(previousActions, resolvedConflictIndex, resolvedAction, resolution) {
|
|
347
|
+
const lineDelta = getResolvedConflictLineDelta(resolvedAction.conflict, resolution);
|
|
348
|
+
return previousActions.map((action, index) => {
|
|
349
|
+
if (index === resolvedConflictIndex) return;
|
|
350
|
+
if (action == null) return;
|
|
351
|
+
if (action.conflict.startLineIndex > resolvedAction.conflict.endLineIndex) return {
|
|
352
|
+
...action,
|
|
353
|
+
conflict: shiftMergeConflictRegion(action.conflict, lineDelta)
|
|
354
|
+
};
|
|
355
|
+
return action;
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
function getResolvedConflictLineDelta(conflict, resolution) {
|
|
359
|
+
const currentLineCount = (conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex) - conflict.startLineIndex - 1;
|
|
360
|
+
const incomingLineCount = conflict.endLineIndex - conflict.separatorLineIndex - 1;
|
|
361
|
+
return (resolution === "current" ? currentLineCount : resolution === "incoming" ? incomingLineCount : currentLineCount + incomingLineCount) - (conflict.endLineIndex - conflict.startLineIndex + 1);
|
|
362
|
+
}
|
|
363
|
+
function shiftMergeConflictRegion(conflict, lineDelta) {
|
|
364
|
+
return {
|
|
365
|
+
...conflict,
|
|
366
|
+
startLineIndex: conflict.startLineIndex + lineDelta,
|
|
367
|
+
startLineNumber: conflict.startLineNumber + lineDelta,
|
|
368
|
+
separatorLineIndex: conflict.separatorLineIndex + lineDelta,
|
|
369
|
+
separatorLineNumber: conflict.separatorLineNumber + lineDelta,
|
|
370
|
+
endLineIndex: conflict.endLineIndex + lineDelta,
|
|
371
|
+
endLineNumber: conflict.endLineNumber + lineDelta,
|
|
372
|
+
baseMarkerLineIndex: conflict.baseMarkerLineIndex != null ? conflict.baseMarkerLineIndex + lineDelta : void 0,
|
|
373
|
+
baseMarkerLineNumber: conflict.baseMarkerLineNumber != null ? conflict.baseMarkerLineNumber + lineDelta : void 0
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
function getUnresolvedDiffHunksRendererOptions(options, baseOptions) {
|
|
377
|
+
return {
|
|
378
|
+
...baseOptions,
|
|
379
|
+
...options,
|
|
380
|
+
hunkSeparators: typeof options?.hunkSeparators === "function" ? "custom" : options?.hunkSeparators,
|
|
381
|
+
mergeConflictActionsType: typeof options?.mergeConflictActionsType === "function" ? "custom" : options?.mergeConflictActionsType
|
|
382
|
+
};
|
|
383
|
+
}
|
|
277
384
|
|
|
278
385
|
//#endregion
|
|
279
|
-
export { UnresolvedFile };
|
|
386
|
+
export { UnresolvedFile, getUnresolvedDiffHunksRendererOptions };
|
|
280
387
|
//# sourceMappingURL=UnresolvedFile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnresolvedFile.js","names":["options: UnresolvedFileOptions<LAnnotation>","payload: MergeConflictActionPayload"],"sources":["../../src/components/UnresolvedFile.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type { MergeConflictActionTarget } from '../managers/InteractionManager';\nimport { pluckInteractionOptions } from '../managers/InteractionManager';\nimport type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport {\n UnresolvedFileHunksRenderer,\n type UnresolvedFileHunksRendererOptions,\n} from '../renderers/UnresolvedFileHunksRenderer';\nimport type {\n FileContents,\n FileDiffMetadata,\n MergeConflictActionPayload,\n MergeConflictResolution,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areMergeConflictActionsEqual } from '../utils/areMergeConflictActionsEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { getMergeConflictActionSlotName } from '../utils/getMergeConflictActionSlotName';\nimport {\n getMergeConflictActionAnchor,\n type MergeConflictDiffAction,\n parseMergeConflictDiffFromFile,\n} from '../utils/parseMergeConflictDiffFromFile';\nimport { resolveMergeConflict } from '../utils/resolveMergeConflict';\nimport type { WorkerPoolManager } from '../worker';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\n\nexport type RenderMergeConflictActions<LAnnotation> = (\n action: MergeConflictDiffAction,\n instance: UnresolvedFile<LAnnotation>\n) => HTMLElement | DocumentFragment | null | undefined;\n\nexport type MergeConflictActionsTypeOption<LAnnotation> =\n | 'none'\n | 'default'\n | RenderMergeConflictActions<LAnnotation>;\n\nexport interface UnresolvedFileOptions<\n LAnnotation,\n> extends FileDiffOptions<LAnnotation> {\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(\n payload: MergeConflictActionPayload,\n instance: UnresolvedFile<LAnnotation>\n ): void;\n onMergeConflictResolve?(\n file: FileContents,\n payload: MergeConflictActionPayload\n ): void;\n}\n\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<\n FileDiffRenderProps<LAnnotation>,\n 'oldFile' | 'newFile'\n> {\n file?: FileContents;\n actions?: MergeConflictDiffAction[];\n}\n\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<\n UnresolvedFileRenderProps<LAnnotation>,\n 'file'\n> {\n file?: FileContents;\n fileDiff?: FileDiffMetadata;\n actions?: MergeConflictDiffAction[];\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\ninterface MergeConflictActionElementCache {\n element: HTMLElement;\n action: MergeConflictDiffAction;\n}\n\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: MergeConflictDiffAction[] | undefined;\n}\n\ninterface GetOrComputeDiffResult {\n fileDiff: FileDiffMetadata;\n actions: MergeConflictDiffAction[];\n}\n\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\n\nlet instanceId = -1;\n\nexport class UnresolvedFile<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `unresolved-file:${++instanceId}`;\n protected computedCache: UnresolvedFileDataCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n };\n private conflictActions: MergeConflictDiffAction[] = [];\n private conflictActionCache: Map<string, MergeConflictActionElementCache> =\n new Map();\n\n constructor(\n public override options: UnresolvedFileOptions<LAnnotation> = {\n theme: DEFAULT_THEMES,\n },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n super(undefined, workerManager, isContainerManaged);\n this.setOptions(options);\n }\n\n override setOptions(\n options: UnresolvedFileOptions<LAnnotation> | undefined\n ): void {\n if (options == null) {\n return;\n }\n\n if (\n options.onMergeConflictAction != null &&\n options.onMergeConflictResolve != null\n ) {\n throw new Error(\n 'UnresolvedFile: onMergeConflictAction and onMergeConflictResolve are mutually exclusive. Use only one callback.'\n );\n }\n\n this.options = options;\n this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));\n\n const hunkSeparators = this.options.hunkSeparators ?? 'line-info';\n this.interactionManager.setOptions(\n pluckInteractionOptions(\n this.options,\n typeof hunkSeparators === 'function' ||\n hunkSeparators === 'line-info' ||\n hunkSeparators === 'line-info-basic'\n ? this.expandHunk\n : undefined,\n this.getLineIndex,\n this.handleMergeConflictActionClick\n )\n );\n }\n\n protected override createHunksRenderer(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRenderer<LAnnotation> {\n const renderer = new UnresolvedFileHunksRenderer<LAnnotation>(\n this.getHunksRendererOptions(options),\n this.handleHighlightRender,\n this.workerManager\n );\n return renderer;\n }\n\n protected override getHunksRendererOptions(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRendererOptions {\n return {\n ...this.options,\n hunkSeparators:\n typeof options.hunkSeparators === 'function'\n ? 'custom'\n : options.hunkSeparators,\n mergeConflictActionsType:\n typeof options.mergeConflictActionsType === 'function'\n ? 'custom'\n : options.mergeConflictActionsType,\n };\n }\n\n protected override applyPreNodeAttributes(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n super.applyPreNodeAttributes(pre, result, {\n 'data-has-merge-conflict': '',\n });\n }\n\n override cleanUp(): void {\n this.clearMergeConflictActionCache();\n this.computedCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n };\n this.conflictActions = [];\n super.cleanUp();\n }\n\n private getOrComputeDiff({\n file,\n fileDiff,\n actions,\n }: GetOrComputeDiffProps): GetOrComputeDiffResult | undefined {\n wrapper: {\n // We are dealing with a controlled component\n if (this.options.onMergeConflictAction != null) {\n const hasFileDiff = fileDiff != null;\n const hasActions = actions != null;\n if (hasFileDiff !== hasActions) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff and actions must be passed together'\n );\n }\n // If we were provided a new fileDiff and actions, we are a FULLY\n // controlled component, which means we will not do any computation\n if (fileDiff != null && actions != null) {\n this.computedCache = {\n file: file ?? this.computedCache.file,\n fileDiff,\n actions,\n };\n break wrapper;\n }\n // If we were provided a new file, we should attempt to parse out a new\n // diff/actions if we haven't computed it before\n else if (file != null || this.computedCache.file != null) {\n file ??= this.computedCache.file;\n if (file == null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file is null, should be impossible'\n );\n }\n if (\n !areFilesEqual(file, this.computedCache.file) ||\n this.computedCache.fileDiff == null ||\n this.computedCache.actions == null\n ) {\n const computed = parseMergeConflictDiffFromFile(file);\n this.computedCache = {\n file,\n fileDiff: computed.fileDiff,\n actions: computed.actions,\n };\n }\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n break wrapper;\n }\n // Otherwise we should fall through and try to use the cache if it exists\n else {\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n break wrapper;\n }\n }\n // If we are uncontrolled we only rely on the file and only use the first\n // version, otherwise utilize the cached version\n else {\n if (fileDiff != null || actions != null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff and actions are only usable in controlled mode, you must pass in `onMergeConflictAction`'\n );\n }\n this.computedCache.file ??= file;\n if (\n this.computedCache.fileDiff == null &&\n this.computedCache.file != null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n this.computedCache.file\n );\n this.computedCache.fileDiff = computed.fileDiff;\n this.computedCache.actions = computed.actions;\n }\n // Because we are uncontrolled, the source of truth is the\n // computedCache\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n break wrapper;\n }\n }\n if (fileDiff == null || actions == null) {\n return undefined;\n }\n return { fileDiff, actions };\n }\n\n override hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void {\n const { file, fileDiff, actions, lineAnnotations, ...rest } = props;\n const source = this.getOrComputeDiff({ file, fileDiff, actions });\n if (source == null) {\n return;\n }\n this.setActiveMergeConflictActions(source.actions);\n super.hydrate({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n });\n this.renderMergeConflictActionSlots();\n }\n\n override rerender(): void {\n if (!this.enabled || this.fileDiff == null) {\n return;\n }\n this.render({ forceRender: true, renderRange: this.renderRange });\n }\n\n override render(props: UnresolvedFileRenderProps<LAnnotation> = {}): boolean {\n let { file, fileDiff, actions, lineAnnotations, ...rest } = props;\n const source = this.getOrComputeDiff({ file, fileDiff, actions });\n if (source == null) {\n return false;\n }\n this.setActiveMergeConflictActions(source.actions);\n const didRender = super.render({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n });\n this.renderMergeConflictActionSlots();\n return didRender;\n }\n\n public resolveConflict(\n conflictIndex: number,\n resolution: MergeConflictResolution,\n file: FileContents | undefined = this.computedCache.file\n ): FileContents | undefined {\n const action = this.conflictActions[conflictIndex];\n if (file == null || action == null) {\n return undefined;\n }\n\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflict: conflictIndex and conflictAction don't match\"\n );\n }\n\n const contents = resolveMergeConflict(file.contents, {\n resolution,\n conflict: action.conflict,\n });\n if (contents === file.contents) {\n return undefined;\n }\n\n return {\n ...file,\n contents,\n cacheKey:\n file.cacheKey != null\n ? `${file.cacheKey}:mc-${conflictIndex}-${resolution}`\n : undefined,\n };\n }\n\n private resolveConflictAndRender(\n conflictIndex: number,\n resolution: MergeConflictResolution\n ): FileContents | undefined {\n const action = this.conflictActions[conflictIndex];\n if (action == null) {\n return undefined;\n }\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflictAndRender: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution,\n conflict: action.conflict,\n };\n const nextFile = this.resolveConflict(conflictIndex, resolution);\n if (nextFile == null) {\n return undefined;\n }\n\n this.computedCache.file = nextFile;\n // Clear out the diff cache to force a new compute next render\n this.computedCache.fileDiff = undefined;\n this.computedCache.actions = undefined;\n this.render();\n this.options.onMergeConflictResolve?.(nextFile, payload);\n return nextFile;\n }\n\n private setActiveMergeConflictActions(\n actions: MergeConflictDiffAction[]\n ): void {\n this.conflictActions = actions;\n if (this.hunksRenderer instanceof UnresolvedFileHunksRenderer) {\n this.hunksRenderer.setConflictActions(\n this.options.mergeConflictActionsType === 'none' ? [] : actions\n );\n }\n }\n\n private handleMergeConflictActionClick = (\n target: MergeConflictActionTarget\n ): void => {\n const action = this.conflictActions[target.conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== target.conflictIndex) {\n console.error({ conflictIndex: target.conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.handleMergeConflictActionClick: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution: target.resolution,\n conflict: action.conflict,\n };\n if (this.options.onMergeConflictAction != null) {\n this.options.onMergeConflictAction(payload, this);\n return;\n }\n this.resolveConflictAndRender(target.conflictIndex, target.resolution);\n };\n\n private renderMergeConflictActionSlots(): void {\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof this.options.mergeConflictActionsType !== 'function' ||\n this.conflictActions.length === 0\n ) {\n this.clearMergeConflictActionCache();\n return;\n }\n const staleActions = new Map(this.conflictActionCache);\n for (\n let actionIndex = 0;\n actionIndex < this.conflictActions.length;\n actionIndex++\n ) {\n const action = this.conflictActions[actionIndex];\n if (action == null) {\n continue;\n }\n if (action.conflictIndex !== actionIndex) {\n console.error({ conflictIndex: actionIndex, action });\n throw new Error(\n \"UnresolvedFile.renderMergeConflictActionSlots: conflictIndex and conflictAction don't match\"\n );\n }\n const anchor = getMergeConflictActionAnchor(action);\n if (anchor == null) {\n continue;\n }\n const conflictIndex = action.conflictIndex;\n const slotName = getMergeConflictActionSlotName({\n side: anchor.side,\n lineNumber: anchor.lineNumber,\n conflictIndex,\n });\n const id = `${actionIndex}-${slotName}`;\n let cache = this.conflictActionCache.get(id);\n if (\n cache == null ||\n !areMergeConflictActionsEqual(cache.action, action)\n ) {\n cache?.element.remove();\n const rendered = this.renderMergeConflictAction(action);\n if (rendered == null) {\n continue;\n }\n const element = createAnnotationWrapperNode(slotName);\n element.appendChild(rendered);\n this.fileContainer.appendChild(element);\n cache = { element, action };\n this.conflictActionCache.set(id, cache);\n }\n staleActions.delete(id);\n }\n for (const [id, { element }] of staleActions.entries()) {\n this.conflictActionCache.delete(id);\n element.remove();\n }\n }\n\n private renderMergeConflictAction(\n action: MergeConflictDiffAction\n ): HTMLElement | undefined {\n if (typeof this.options.mergeConflictActionsType !== 'function') {\n return undefined;\n }\n const rendered = this.options.mergeConflictActionsType(action, this);\n if (rendered == null) {\n return undefined;\n }\n if (rendered instanceof HTMLElement) {\n return rendered;\n }\n if (\n typeof DocumentFragment !== 'undefined' &&\n rendered instanceof DocumentFragment\n ) {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n wrapper.appendChild(rendered);\n return wrapper;\n }\n return undefined;\n }\n\n private clearMergeConflictActionCache(): void {\n for (const { element } of this.conflictActionCache.values()) {\n element.remove();\n }\n this.conflictActionCache.clear();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UnresolvedFile.js","names":["options: UnresolvedFileOptions<LAnnotation>","resolveConflictDiff","payload: MergeConflictActionPayload"],"sources":["../../src/components/UnresolvedFile.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type { MergeConflictActionTarget } from '../managers/InteractionManager';\nimport { pluckInteractionOptions } from '../managers/InteractionManager';\nimport type { HunksRenderResult } from '../renderers/DiffHunksRenderer';\nimport {\n UnresolvedFileHunksRenderer,\n type UnresolvedFileHunksRendererOptions,\n} from '../renderers/UnresolvedFileHunksRenderer';\nimport type {\n FileContents,\n FileDiffMetadata,\n MergeConflictActionPayload,\n MergeConflictMarkerRow,\n MergeConflictRegion,\n MergeConflictResolution,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areMergeConflictActionsEqual } from '../utils/areMergeConflictActionsEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { getMergeConflictActionSlotName } from '../utils/getMergeConflictActionSlotName';\nimport {\n buildMergeConflictMarkerRows,\n getMergeConflictActionAnchor,\n type MergeConflictDiffAction,\n parseMergeConflictDiffFromFile,\n} from '../utils/parseMergeConflictDiffFromFile';\nimport { resolveConflict as resolveConflictDiff } from '../utils/resolveConflict';\nimport { splitFileContents } from '../utils/splitFileContents';\nimport type { WorkerPoolManager } from '../worker';\nimport {\n FileDiff,\n type FileDiffOptions,\n type FileDiffRenderProps,\n} from './FileDiff';\n\nexport type RenderMergeConflictActions<LAnnotation> = (\n action: MergeConflictDiffAction,\n instance: UnresolvedFile<LAnnotation>\n) => HTMLElement | DocumentFragment | null | undefined;\n\nexport type MergeConflictActionsTypeOption<LAnnotation> =\n | 'none'\n | 'default'\n | RenderMergeConflictActions<LAnnotation>;\n\nexport interface UnresolvedFileOptions<LAnnotation> extends Omit<\n FileDiffOptions<LAnnotation>,\n 'diffStyle'\n> {\n onPostRender?(\n node: HTMLElement,\n instance: UnresolvedFile<LAnnotation>\n ): unknown;\n mergeConflictActionsType?: MergeConflictActionsTypeOption<LAnnotation>;\n onMergeConflictAction?(\n payload: MergeConflictActionPayload,\n instance: UnresolvedFile<LAnnotation>\n ): void;\n onMergeConflictResolve?(\n file: FileContents,\n payload: MergeConflictActionPayload\n ): void;\n maxContextLines?: number;\n}\n\nexport interface UnresolvedFileRenderProps<LAnnotation> extends Omit<\n FileDiffRenderProps<LAnnotation>,\n 'oldFile' | 'newFile'\n> {\n file?: FileContents;\n actions?: (MergeConflictDiffAction | undefined)[];\n markerRows?: MergeConflictMarkerRow[];\n}\n\nexport interface UnresolvedFileHydrationProps<LAnnotation> extends Omit<\n UnresolvedFileRenderProps<LAnnotation>,\n 'file'\n> {\n file?: FileContents;\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\ninterface MergeConflictActionElementCache {\n element: HTMLElement;\n action: MergeConflictDiffAction;\n}\n\ninterface GetOrComputeDiffProps {\n file: FileContents | undefined;\n fileDiff: FileDiffMetadata | undefined;\n actions: (MergeConflictDiffAction | undefined)[] | undefined;\n markerRows: MergeConflictMarkerRow[] | undefined;\n}\n\ninterface GetOrComputeDiffResult {\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ninterface ResolveConflictReturn {\n file: FileContents;\n fileDiff: FileDiffMetadata;\n actions: (MergeConflictDiffAction | undefined)[];\n markerRows: MergeConflictMarkerRow[];\n}\n\ntype UnresolvedFileDataCache = GetOrComputeDiffProps;\n\nlet instanceId = -1;\n\nexport class UnresolvedFile<\n LAnnotation = undefined,\n> extends FileDiff<LAnnotation> {\n override readonly __id: string = `unresolved-file:${++instanceId}`;\n protected computedCache: UnresolvedFileDataCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n private conflictActions: (MergeConflictDiffAction | undefined)[] = [];\n private markerRows: MergeConflictMarkerRow[] = [];\n private conflictActionCache: Map<string, MergeConflictActionElementCache> =\n new Map();\n\n constructor(\n public override options: UnresolvedFileOptions<LAnnotation> = {\n theme: DEFAULT_THEMES,\n },\n workerManager?: WorkerPoolManager | undefined,\n isContainerManaged = false\n ) {\n super(undefined, workerManager, isContainerManaged);\n this.setOptions(options);\n }\n\n override setOptions(\n options: UnresolvedFileOptions<LAnnotation> | undefined\n ): void {\n if (options == null) {\n return;\n }\n\n if (\n options.onMergeConflictAction != null &&\n options.onMergeConflictResolve != null\n ) {\n throw new Error(\n 'UnresolvedFile: onMergeConflictAction and onMergeConflictResolve are mutually exclusive. Use only one callback.'\n );\n }\n\n this.options = options;\n this.hunksRenderer.setOptions(this.getHunksRendererOptions(options));\n\n const hunkSeparators = this.options.hunkSeparators ?? 'line-info';\n this.interactionManager.setOptions(\n pluckInteractionOptions(\n this.options,\n typeof hunkSeparators === 'function' ||\n hunkSeparators === 'line-info' ||\n hunkSeparators === 'line-info-basic'\n ? this.expandHunk\n : undefined,\n this.getLineIndex,\n this.handleMergeConflictActionClick\n )\n );\n }\n\n protected override createHunksRenderer(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRenderer<LAnnotation> {\n const renderer = new UnresolvedFileHunksRenderer<LAnnotation>(\n this.getHunksRendererOptions(options),\n this.handleHighlightRender,\n this.workerManager\n );\n return renderer;\n }\n\n protected override getHunksRendererOptions(\n options: UnresolvedFileOptions<LAnnotation>\n ): UnresolvedFileHunksRendererOptions {\n return getUnresolvedDiffHunksRendererOptions(options, this.options);\n }\n\n protected override applyPreNodeAttributes(\n pre: HTMLPreElement,\n result: HunksRenderResult\n ): void {\n super.applyPreNodeAttributes(pre, result, {\n 'data-has-merge-conflict': '',\n });\n }\n\n override cleanUp(): void {\n this.clearMergeConflictActionCache();\n this.computedCache = {\n file: undefined,\n fileDiff: undefined,\n actions: undefined,\n markerRows: undefined,\n };\n this.conflictActions = [];\n super.cleanUp();\n }\n\n private getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n }: GetOrComputeDiffProps): GetOrComputeDiffResult | undefined {\n const { maxContextLines, onMergeConflictAction } = this.options;\n wrapper: {\n // We are dealing with a controlled component\n if (onMergeConflictAction != null) {\n const hasFileDiff = fileDiff != null;\n const hasActions = actions != null;\n const hasMarkerRows = markerRows != null;\n if (hasFileDiff !== hasActions || hasFileDiff !== hasMarkerRows) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows must be passed together'\n );\n }\n // If we were provided a new fileDiff/actions/markerRows, we are a FULLY\n // controlled component, which means we will not do any computation\n if (fileDiff != null && actions != null && markerRows != null) {\n this.computedCache = {\n file: file ?? this.computedCache.file,\n fileDiff,\n actions,\n markerRows,\n };\n break wrapper;\n }\n // If we were provided a new file, we should attempt to parse out a new\n // diff/actions if we haven't computed it before. Once we initialize from\n // a file, later updates must flow through fileDiff/actions instead of\n // reparsing from a new file input.\n else if (file != null || this.computedCache.file != null) {\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file) &&\n this.computedCache.fileDiff != null &&\n this.computedCache.actions != null\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file can only be used to initialize unresolved state once. Pass fileDiff and actions for subsequent updates.'\n );\n }\n file ??= this.computedCache.file;\n if (file == null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: file is null, should be impossible'\n );\n }\n if (\n !areFilesEqual(file, this.computedCache.file) ||\n this.computedCache.fileDiff == null ||\n this.computedCache.actions == null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n file,\n maxContextLines\n );\n this.computedCache = {\n file,\n fileDiff: computed.fileDiff,\n actions: computed.actions,\n markerRows: computed.markerRows,\n };\n }\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n // Otherwise we should fall through and try to use the cache if it exists\n else {\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n // If we are uncontrolled we only rely on the file and only use the first\n // version. After that, the cached diff/action pair is the source of\n // truth and we should not accept a new file input.\n else {\n if (fileDiff != null || actions != null || markerRows != null) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: fileDiff, actions, and markerRows are only usable in controlled mode, you must pass in `onMergeConflictAction`'\n );\n }\n if (\n file != null &&\n this.computedCache.file != null &&\n !areFilesEqual(file, this.computedCache.file)\n ) {\n throw new Error(\n 'UnresolvedFile.getOrComputeDiff: uncontrolled unresolved files parse the file only once. Later updates must come from the cached diff state.'\n );\n }\n this.computedCache.file ??= file;\n if (\n this.computedCache.fileDiff == null &&\n this.computedCache.file != null\n ) {\n const computed = parseMergeConflictDiffFromFile(\n this.computedCache.file,\n maxContextLines\n );\n this.computedCache.fileDiff = computed.fileDiff;\n this.computedCache.actions = computed.actions;\n this.computedCache.markerRows = computed.markerRows;\n }\n // Because we are uncontrolled, the source of truth is the\n // computedCache\n fileDiff = this.computedCache.fileDiff;\n actions = this.computedCache.actions;\n markerRows = this.computedCache.markerRows;\n break wrapper;\n }\n }\n if (fileDiff == null || actions == null || markerRows == null) {\n return undefined;\n }\n return { fileDiff, actions, markerRows };\n }\n\n override hydrate(props: UnresolvedFileHydrationProps<LAnnotation>): void {\n const {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n preventEmit = false,\n ...rest\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return;\n }\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n super.hydrate({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n preventEmit: true,\n });\n this.renderMergeConflictActionSlots();\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n override rerender(): void {\n if (!this.enabled || this.fileDiff == null) {\n return;\n }\n this.render({ forceRender: true, renderRange: this.renderRange });\n }\n\n override render(props: UnresolvedFileRenderProps<LAnnotation> = {}): boolean {\n let {\n file,\n fileDiff,\n actions,\n markerRows,\n lineAnnotations,\n preventEmit = false,\n ...rest\n } = props;\n const source = this.getOrComputeDiff({\n file,\n fileDiff,\n actions,\n markerRows,\n });\n if (source == null) {\n return false;\n }\n this.setActiveMergeConflictState(source.actions, source.markerRows);\n const didRender = super.render({\n ...rest,\n fileDiff: source.fileDiff,\n lineAnnotations,\n preventEmit: true,\n });\n if (didRender) {\n this.renderMergeConflictActionSlots();\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n return didRender;\n }\n\n public resolveConflict(\n conflictIndex: number,\n resolution: MergeConflictResolution,\n fileDiff: FileDiffMetadata | undefined = this.computedCache.fileDiff\n ): ResolveConflictReturn | undefined {\n const action = this.conflictActions[conflictIndex];\n if (fileDiff == null || action == null) {\n return undefined;\n }\n\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflict: conflictIndex and conflictAction don't match\"\n );\n }\n\n const newFileDiff = resolveConflictDiff(fileDiff, action, resolution);\n const previousFile = this.computedCache.file;\n const { file, actions, markerRows } = rebuildFileAndActions({\n fileDiff: newFileDiff,\n previousActions: this.conflictActions,\n resolvedConflictIndex: conflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n fileDiff: newFileDiff,\n actions,\n markerRows,\n };\n }\n\n private resolveConflictAndRender(\n conflictIndex: number,\n resolution: MergeConflictResolution\n ): void {\n const action = this.conflictActions[conflictIndex];\n if (action == null) {\n return undefined;\n }\n if (action.conflictIndex !== conflictIndex) {\n console.error({ conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.resolveConflictAndRender: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution,\n conflict: action.conflict,\n };\n const { file, fileDiff, actions, markerRows } =\n this.resolveConflict(conflictIndex, resolution) ?? {};\n if (\n file == null ||\n fileDiff == null ||\n actions == null ||\n markerRows == null\n ) {\n return undefined;\n }\n\n this.computedCache = { file, fileDiff, actions, markerRows };\n this.setActiveMergeConflictState(actions, markerRows);\n // NOTE(amadeus): This is a bit jank, but helps to ensure we don't see a\n // bunch of jittery re-renders as things resolve out. In a more perfect\n // world we would have a more elegant way to kick off a render to the\n // highlighter and then resolve actions in a cleaner way, but time is short\n // right now. Can't let perfect be the enemy of good\n if (this.workerManager != null) {\n // Because we are using a workerManager, if we fire off the renderDiff\n // call, it will eventually get back to us in a callback which will\n // trigger a re-render\n this.hunksRenderer.renderDiff(fileDiff);\n } else {\n this.render({ forceRender: true });\n }\n this.options.onMergeConflictResolve?.(file, payload);\n }\n\n private setActiveMergeConflictState(\n actions: (MergeConflictDiffAction | undefined)[] = this.conflictActions,\n markerRows: MergeConflictMarkerRow[] = this.markerRows\n ): void {\n this.conflictActions = actions;\n this.markerRows = markerRows;\n if (\n this.computedCache.fileDiff != null &&\n this.hunksRenderer instanceof UnresolvedFileHunksRenderer\n ) {\n this.hunksRenderer.setConflictState(\n this.options.mergeConflictActionsType === 'none' ? [] : actions,\n markerRows,\n this.computedCache.fileDiff\n );\n }\n }\n\n private handleMergeConflictActionClick = (\n target: MergeConflictActionTarget\n ): void => {\n const action = this.conflictActions[target.conflictIndex];\n if (action == null) {\n return;\n }\n if (action.conflictIndex !== target.conflictIndex) {\n console.error({ conflictIndex: target.conflictIndex, action });\n throw new Error(\n \"UnresolvedFile.handleMergeConflictActionClick: conflictIndex and conflictAction don't match\"\n );\n }\n const payload: MergeConflictActionPayload = {\n resolution: target.resolution,\n conflict: action.conflict,\n };\n if (this.options.onMergeConflictAction != null) {\n this.options.onMergeConflictAction(payload, this);\n return;\n }\n this.resolveConflictAndRender(target.conflictIndex, target.resolution);\n };\n\n private renderMergeConflictActionSlots(): void {\n const { fileDiff } = this.computedCache;\n if (\n this.isContainerManaged ||\n this.fileContainer == null ||\n typeof this.options.mergeConflictActionsType !== 'function' ||\n this.conflictActions.length === 0 ||\n fileDiff == null\n ) {\n this.clearMergeConflictActionCache();\n return;\n }\n const staleActions = new Map(this.conflictActionCache);\n for (\n let actionIndex = 0;\n actionIndex < this.conflictActions.length;\n actionIndex++\n ) {\n const action = this.conflictActions[actionIndex];\n if (action == null) {\n continue;\n }\n if (action.conflictIndex !== actionIndex) {\n console.error({ conflictIndex: actionIndex, action });\n throw new Error(\n \"UnresolvedFile.renderMergeConflictActionSlots: conflictIndex and conflictAction don't match\"\n );\n }\n const anchor = getMergeConflictActionAnchor(action, fileDiff);\n if (anchor == null) {\n continue;\n }\n const conflictIndex = action.conflictIndex;\n const slotName = getMergeConflictActionSlotName({\n hunkIndex: anchor.hunkIndex,\n lineIndex: anchor.lineIndex,\n conflictIndex,\n });\n const id = `${actionIndex}-${slotName}`;\n let cache = this.conflictActionCache.get(id);\n if (\n cache == null ||\n !areMergeConflictActionsEqual(cache.action, action)\n ) {\n cache?.element.remove();\n const rendered = this.renderMergeConflictAction(action);\n if (rendered == null) {\n continue;\n }\n const element = createAnnotationWrapperNode(slotName);\n element.appendChild(rendered);\n this.fileContainer.appendChild(element);\n cache = { element, action };\n this.conflictActionCache.set(id, cache);\n }\n staleActions.delete(id);\n }\n for (const [id, { element }] of staleActions.entries()) {\n this.conflictActionCache.delete(id);\n element.remove();\n }\n }\n\n private renderMergeConflictAction(\n action: MergeConflictDiffAction\n ): HTMLElement | undefined {\n if (typeof this.options.mergeConflictActionsType !== 'function') {\n return undefined;\n }\n const rendered = this.options.mergeConflictActionsType(action, this);\n if (rendered == null) {\n return undefined;\n }\n if (rendered instanceof HTMLElement) {\n return rendered;\n }\n if (\n typeof DocumentFragment !== 'undefined' &&\n rendered instanceof DocumentFragment\n ) {\n const wrapper = document.createElement('div');\n wrapper.style.display = 'contents';\n wrapper.appendChild(rendered);\n return wrapper;\n }\n return undefined;\n }\n\n private clearMergeConflictActionCache(): void {\n for (const { element } of this.conflictActionCache.values()) {\n element.remove();\n }\n this.conflictActionCache.clear();\n }\n}\n\ninterface RebuildFileAndActionsProps {\n fileDiff: FileDiffMetadata;\n previousActions: (MergeConflictDiffAction | undefined)[];\n resolvedConflictIndex: number;\n // FIXME: Probably should remove this...\n // additionOffset: number;\n // deletionOffset: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the emitted unresolved file contents and remaining action anchors in\n// one pass over the post-resolution diff state.\nfunction rebuildFileAndActions({\n fileDiff,\n previousActions,\n resolvedConflictIndex,\n previousFile,\n resolution,\n}: RebuildFileAndActionsProps): Pick<\n ResolveConflictReturn,\n 'file' | 'actions' | 'markerRows'\n> {\n const resolvedAction = previousActions[resolvedConflictIndex];\n if (resolvedAction == null) {\n throw new Error(\n 'rebuildFileAndActions: missing resolved action for unresolved file rebuild'\n );\n }\n\n const actions = updateConflictActionsAfterResolution(\n previousActions,\n resolvedConflictIndex,\n resolvedAction,\n resolution\n );\n const markerRows = buildMergeConflictMarkerRows(fileDiff, actions);\n\n const file = rebuildUnresolvedFile({\n fileDiff,\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n resolution,\n });\n\n return {\n file,\n actions,\n markerRows,\n };\n}\n\ninterface RebuildUnresolvedFileProps {\n fileDiff: FileDiffMetadata;\n resolvedAction: MergeConflictDiffAction;\n resolvedConflictIndex: number;\n previousFile: FileContents | undefined;\n resolution: MergeConflictResolution;\n}\n\n// Rebuild the unresolved file text from the previous unresolved source so we\n// preserve remaining marker blocks exactly while the diff state stays in-place.\nfunction rebuildUnresolvedFile({\n resolvedAction,\n resolvedConflictIndex,\n previousFile,\n fileDiff,\n resolution,\n}: RebuildUnresolvedFileProps): FileContents {\n const previousContents = previousFile?.contents ?? '';\n const lines = splitFileContents(previousContents);\n const { conflict } = resolvedAction;\n const replacementLines = getResolvedConflictReplacementLines(\n lines,\n conflict,\n resolution\n );\n const contents = [\n ...lines.slice(0, conflict.startLineIndex),\n ...replacementLines,\n ...lines.slice(conflict.endLineIndex + 1),\n ].join('');\n\n return {\n name: previousFile?.name ?? fileDiff.name,\n contents,\n cacheKey:\n previousFile?.cacheKey != null\n ? `${previousFile.cacheKey}:mc-${resolvedConflictIndex}-${resolution}`\n : undefined,\n };\n}\n\nfunction getResolvedConflictReplacementLines(\n lines: string[],\n conflict: MergeConflictDiffAction['conflict'],\n resolution: MergeConflictResolution\n): string[] {\n const currentLines = lines.slice(\n conflict.startLineIndex + 1,\n conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex\n );\n const incomingLines = lines.slice(\n conflict.separatorLineIndex + 1,\n conflict.endLineIndex\n );\n\n if (resolution === 'current') {\n return currentLines;\n }\n if (resolution === 'incoming') {\n return incomingLines;\n }\n return [...currentLines, ...incomingLines];\n}\n\n// The diff resolver keeps hunk/content group indexes stable, so the only\n// follow-up update we need here is shifting unresolved source-region line\n// numbers for later conflicts in the rebuilt file text.\nfunction updateConflictActionsAfterResolution(\n previousActions: (MergeConflictDiffAction | undefined)[],\n resolvedConflictIndex: number,\n resolvedAction: MergeConflictDiffAction,\n resolution: MergeConflictResolution\n): (MergeConflictDiffAction | undefined)[] {\n const lineDelta = getResolvedConflictLineDelta(\n resolvedAction.conflict,\n resolution\n );\n\n return previousActions.map((action, index) => {\n if (index === resolvedConflictIndex) {\n return undefined;\n }\n if (action == null) {\n return undefined;\n }\n if (action.conflict.startLineIndex > resolvedAction.conflict.endLineIndex) {\n return {\n ...action,\n conflict: shiftMergeConflictRegion(action.conflict, lineDelta),\n };\n }\n return action;\n });\n}\n\nfunction getResolvedConflictLineDelta(\n conflict: MergeConflictRegion,\n resolution: MergeConflictResolution\n): number {\n const currentLineCount =\n (conflict.baseMarkerLineIndex ?? conflict.separatorLineIndex) -\n conflict.startLineIndex -\n 1;\n const incomingLineCount =\n conflict.endLineIndex - conflict.separatorLineIndex - 1;\n const replacementLineCount =\n resolution === 'current'\n ? currentLineCount\n : resolution === 'incoming'\n ? incomingLineCount\n : currentLineCount + incomingLineCount;\n const conflictLineCount = conflict.endLineIndex - conflict.startLineIndex + 1;\n return replacementLineCount - conflictLineCount;\n}\n\nfunction shiftMergeConflictRegion(\n conflict: MergeConflictRegion,\n lineDelta: number\n): MergeConflictRegion {\n return {\n ...conflict,\n startLineIndex: conflict.startLineIndex + lineDelta,\n startLineNumber: conflict.startLineNumber + lineDelta,\n separatorLineIndex: conflict.separatorLineIndex + lineDelta,\n separatorLineNumber: conflict.separatorLineNumber + lineDelta,\n endLineIndex: conflict.endLineIndex + lineDelta,\n endLineNumber: conflict.endLineNumber + lineDelta,\n baseMarkerLineIndex:\n conflict.baseMarkerLineIndex != null\n ? conflict.baseMarkerLineIndex + lineDelta\n : undefined,\n baseMarkerLineNumber:\n conflict.baseMarkerLineNumber != null\n ? conflict.baseMarkerLineNumber + lineDelta\n : undefined,\n };\n}\n\n// NOTE(amadeus): Should probably pull this out into a util, and make variants\n// for all component types\nexport function getUnresolvedDiffHunksRendererOptions<LAnnotation>(\n options?: UnresolvedFileOptions<LAnnotation>,\n baseOptions?: UnresolvedFileOptions<LAnnotation>\n): UnresolvedFileHunksRendererOptions {\n return {\n ...baseOptions,\n ...options,\n hunkSeparators:\n typeof options?.hunkSeparators === 'function'\n ? 'custom'\n : options?.hunkSeparators,\n mergeConflictActionsType:\n typeof options?.mergeConflictActionsType === 'function'\n ? 'custom'\n : options?.mergeConflictActionsType,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VirtulizerDevelopment.d.ts","names":["AdvancedVirtualizer","Virtualizer","
|
|
1
|
+
{"version":3,"file":"VirtulizerDevelopment.d.ts","names":["AdvancedVirtualizer","Virtualizer","_1","sideEffect"],"sources":["../../src/components/VirtulizerDevelopment.d.ts"],"sourcesContent":["import type { AdvancedVirtualizer } from './AdvancedVirtualizer';\nimport type { Virtualizer } from './Virtualizer';\n\n// FIXME(amadeus): REMOVE ME AFTER RELEASING VIRTUALIZATION\ndeclare global {\n interface Window {\n // oxlint-disable-next-line typescript/no-explicit-any\n __INSTANCE?: AdvancedVirtualizer<any> | Virtualizer;\n __TOGGLE?: () => void;\n __LOG?: boolean;\n }\n}\n"],"mappings":";;;;;AACiD,QAAAE,MAAA,CAAA;EAAA,UAAA,MAAA,CAAA;;IAMMC,UAAAD,CAAA,EAAtCF,mBAAsC,CAAA,GAAA,CAAA,GAAXC,WAAW;IAAA,QAAA,CAAA,EAAA,GAAA,GAAA,IAAA"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -12,6 +12,10 @@ declare const FILENAME_HEADER_REGEX: RegExp;
|
|
|
12
12
|
declare const FILENAME_HEADER_REGEX_GIT: RegExp;
|
|
13
13
|
declare const ALTERNATE_FILE_NAMES_GIT: RegExp;
|
|
14
14
|
declare const INDEX_LINE_METADATA: RegExp;
|
|
15
|
+
declare const MERGE_CONFLICT_START_MARKER_REGEX: RegExp;
|
|
16
|
+
declare const MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp;
|
|
17
|
+
declare const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp;
|
|
18
|
+
declare const MERGE_CONFLICT_END_MARKER_REGEX: RegExp;
|
|
15
19
|
declare const HEADER_PREFIX_SLOT_ID = "header-prefix";
|
|
16
20
|
declare const HEADER_METADATA_SLOT_ID = "header-metadata";
|
|
17
21
|
declare const DEFAULT_THEMES: ThemesType;
|
|
@@ -23,5 +27,5 @@ declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;
|
|
|
23
27
|
declare const DEFAULT_RENDER_RANGE: RenderRange;
|
|
24
28
|
declare const EMPTY_RENDER_RANGE: RenderRange;
|
|
25
29
|
//#endregion
|
|
26
|
-
export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, EMPTY_RENDER_RANGE, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID, HUNK_HEADER, INDEX_LINE_METADATA, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
|
|
30
|
+
export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, EMPTY_RENDER_RANGE, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID, HUNK_HEADER, INDEX_LINE_METADATA, MERGE_CONFLICT_BASE_MARKER_REGEX, MERGE_CONFLICT_END_MARKER_REGEX, MERGE_CONFLICT_SEPARATOR_MARKER_REGEX, MERGE_CONFLICT_START_MARKER_REGEX, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
|
|
27
31
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","names":["HunkExpansionRegion","RenderRange","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","COMMIT_METADATA_SPLIT","RegExp","GIT_DIFF_FILE_BREAK_REGEX","UNIFIED_DIFF_FILE_BREAK_REGEX","FILE_CONTEXT_BLOB","HUNK_HEADER","SPLIT_WITH_NEWLINES","FILENAME_HEADER_REGEX","FILENAME_HEADER_REGEX_GIT","ALTERNATE_FILE_NAMES_GIT","INDEX_LINE_METADATA","HEADER_PREFIX_SLOT_ID","HEADER_METADATA_SLOT_ID","DEFAULT_THEMES","UNSAFE_CSS_ATTRIBUTE","CORE_CSS_ATTRIBUTE","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { HunkExpansionRegion, RenderRange, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\nexport declare const COMMIT_METADATA_SPLIT: RegExp;\nexport declare const GIT_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const FILE_CONTEXT_BLOB: RegExp;\nexport declare const HUNK_HEADER: RegExp;\nexport declare const SPLIT_WITH_NEWLINES: RegExp;\nexport declare const FILENAME_HEADER_REGEX: RegExp;\nexport declare const FILENAME_HEADER_REGEX_GIT: RegExp;\nexport declare const ALTERNATE_FILE_NAMES_GIT: RegExp;\nexport declare const INDEX_LINE_METADATA: RegExp;\nexport declare const HEADER_PREFIX_SLOT_ID = \"header-prefix\";\nexport declare const HEADER_METADATA_SLOT_ID = \"header-metadata\";\nexport declare const DEFAULT_THEMES: ThemesType;\nexport declare const UNSAFE_CSS_ATTRIBUTE = \"data-unsafe-css\";\nexport declare const CORE_CSS_ATTRIBUTE = \"data-core-css\";\nexport declare const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;\nexport declare const DEFAULT_RENDER_RANGE: RenderRange;\nexport declare const EMPTY_RENDER_RANGE: RenderRange;\n//# sourceMappingURL=constants.d.ts.map"],"mappings":";;;cACqBI;cACAC,uBAAuBC;AADvBF,cAEAG,yBAFiC,EAEND,MAFM;AACjCD,cAEAG,6BAF6B,EAEEF,MAFF;AAC7BC,cAEAE,iBAFiC,EAEdH,MAFQA;AAC3BE,cAEAE,WAFAF,EAEaF,MAFwB;AACrCG,cAEAE,mBAFmBL,EAEEA,MAFI;AACzBI,cAEAE,qBAFmB,EAEIN,MAFJ;AACnBK,cAEAE,yBAF2B,EAEAP,MAFA;AAC3BM,cAEAE,wBAFuBR,EAEGA,MAFG;AAC7BO,cAEAE,mBAFiC,EAEZT,MAFMA;AAC3BQ,cAEAE,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","names":["HunkExpansionRegion","RenderRange","ThemesType","VirtualFileMetrics","DIFFS_TAG_NAME","COMMIT_METADATA_SPLIT","RegExp","GIT_DIFF_FILE_BREAK_REGEX","UNIFIED_DIFF_FILE_BREAK_REGEX","FILE_CONTEXT_BLOB","HUNK_HEADER","SPLIT_WITH_NEWLINES","FILENAME_HEADER_REGEX","FILENAME_HEADER_REGEX_GIT","ALTERNATE_FILE_NAMES_GIT","INDEX_LINE_METADATA","MERGE_CONFLICT_START_MARKER_REGEX","MERGE_CONFLICT_BASE_MARKER_REGEX","MERGE_CONFLICT_SEPARATOR_MARKER_REGEX","MERGE_CONFLICT_END_MARKER_REGEX","HEADER_PREFIX_SLOT_ID","HEADER_METADATA_SLOT_ID","DEFAULT_THEMES","UNSAFE_CSS_ATTRIBUTE","CORE_CSS_ATTRIBUTE","DEFAULT_COLLAPSED_CONTEXT_THRESHOLD","DEFAULT_VIRTUAL_FILE_METRICS","DEFAULT_EXPANDED_REGION","DEFAULT_RENDER_RANGE","EMPTY_RENDER_RANGE"],"sources":["../src/constants.d.ts"],"sourcesContent":["import type { HunkExpansionRegion, RenderRange, ThemesType, VirtualFileMetrics } from './types';\nexport declare const DIFFS_TAG_NAME: \"diffs-container\";\nexport declare const COMMIT_METADATA_SPLIT: RegExp;\nexport declare const GIT_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp;\nexport declare const FILE_CONTEXT_BLOB: RegExp;\nexport declare const HUNK_HEADER: RegExp;\nexport declare const SPLIT_WITH_NEWLINES: RegExp;\nexport declare const FILENAME_HEADER_REGEX: RegExp;\nexport declare const FILENAME_HEADER_REGEX_GIT: RegExp;\nexport declare const ALTERNATE_FILE_NAMES_GIT: RegExp;\nexport declare const INDEX_LINE_METADATA: RegExp;\nexport declare const MERGE_CONFLICT_START_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp;\nexport declare const MERGE_CONFLICT_END_MARKER_REGEX: RegExp;\nexport declare const HEADER_PREFIX_SLOT_ID = \"header-prefix\";\nexport declare const HEADER_METADATA_SLOT_ID = \"header-metadata\";\nexport declare const DEFAULT_THEMES: ThemesType;\nexport declare const UNSAFE_CSS_ATTRIBUTE = \"data-unsafe-css\";\nexport declare const CORE_CSS_ATTRIBUTE = \"data-core-css\";\nexport declare const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport declare const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics;\nexport declare const DEFAULT_EXPANDED_REGION: HunkExpansionRegion;\nexport declare const DEFAULT_RENDER_RANGE: RenderRange;\nexport declare const EMPTY_RENDER_RANGE: RenderRange;\n//# sourceMappingURL=constants.d.ts.map"],"mappings":";;;cACqBI;cACAC,uBAAuBC;AADvBF,cAEAG,yBAFiC,EAEND,MAFM;AACjCD,cAEAG,6BAF6B,EAEEF,MAFF;AAC7BC,cAEAE,iBAFiC,EAEdH,MAFQA;AAC3BE,cAEAE,WAFAF,EAEaF,MAFwB;AACrCG,cAEAE,mBAFmBL,EAEEA,MAFI;AACzBI,cAEAE,qBAFmB,EAEIN,MAFJ;AACnBK,cAEAE,yBAF2B,EAEAP,MAFA;AAC3BM,cAEAE,wBAFuBR,EAEGA,MAFG;AAC7BO,cAEAE,mBAFiC,EAEZT,MAFMA;AAC3BQ,cAEAE,iCAFgC,EAEGV,MAFH;AAChCS,cAEAE,gCAF2B,EAEOX,MAFP;AAC3BU,cAEAE,qCAFmCZ,EAEIA,MAFE;AACzCW,cAEAE,+BAFkCb,EAEDA,MAFO;AACxCY,cAEAE,qBAAAA,GAF6C,eAANd;AACvCa,cAEAE,uBAAAA,GAFuC,iBAAA;AACvCD,cAEAE,cAFqB,EAELpB,UAFK;AACrBmB,cAEAE,oBAAAA,GAFuB,iBAAA;AACvBD,cAEAE,kBAAAA,GAFgBtB,eAAU;AAC1BqB,cAEAE,mCAAAA,GAFoB,CAAA;AACpBD,cAEAE,4BAFkB,EAEYvB,kBAFZ;AAClBsB,cAEAE,uBAFmC,EAEV3B,mBAFU;AACnC0B,cAEAE,oBAFgD,EAE1B3B,WAFQE;AAC9BwB,cAEAE,kBAF4C,EAExB5B,WAFKD"}
|
package/dist/constants.js
CHANGED
|
@@ -10,6 +10,10 @@ const FILENAME_HEADER_REGEX = /^(---|\+\+\+)\s+([^\t\r\n]+)/;
|
|
|
10
10
|
const FILENAME_HEADER_REGEX_GIT = /^(---|\+\+\+)\s+[ab]\/([^\t\r\n]+)/;
|
|
11
11
|
const ALTERNATE_FILE_NAMES_GIT = /^diff --git (?:"a\/(.+?)"|a\/(.+?)) (?:"b\/(.+?)"|b\/(.+?))$/;
|
|
12
12
|
const INDEX_LINE_METADATA = /^index ([0-9a-f]+)\.\.([0-9a-f]+)(?: (\d+))?$/i;
|
|
13
|
+
const MERGE_CONFLICT_START_MARKER_REGEX = /^<{7,}(?:\s.*)?$/;
|
|
14
|
+
const MERGE_CONFLICT_BASE_MARKER_REGEX = /^\|{7,}(?:\s.*)?$/;
|
|
15
|
+
const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX = /^={7,}$/;
|
|
16
|
+
const MERGE_CONFLICT_END_MARKER_REGEX = /^>{7,}(?:\s.*)?$/;
|
|
13
17
|
const HEADER_PREFIX_SLOT_ID = "header-prefix";
|
|
14
18
|
const HEADER_METADATA_SLOT_ID = "header-metadata";
|
|
15
19
|
const DEFAULT_THEMES = {
|
|
@@ -44,5 +48,5 @@ const EMPTY_RENDER_RANGE = {
|
|
|
44
48
|
};
|
|
45
49
|
|
|
46
50
|
//#endregion
|
|
47
|
-
export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, EMPTY_RENDER_RANGE, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID, HUNK_HEADER, INDEX_LINE_METADATA, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
|
|
51
|
+
export { ALTERNATE_FILE_NAMES_GIT, COMMIT_METADATA_SPLIT, CORE_CSS_ATTRIBUTE, DEFAULT_COLLAPSED_CONTEXT_THRESHOLD, DEFAULT_EXPANDED_REGION, DEFAULT_RENDER_RANGE, DEFAULT_THEMES, DEFAULT_VIRTUAL_FILE_METRICS, DIFFS_TAG_NAME, EMPTY_RENDER_RANGE, FILENAME_HEADER_REGEX, FILENAME_HEADER_REGEX_GIT, FILE_CONTEXT_BLOB, GIT_DIFF_FILE_BREAK_REGEX, HEADER_METADATA_SLOT_ID, HEADER_PREFIX_SLOT_ID, HUNK_HEADER, INDEX_LINE_METADATA, MERGE_CONFLICT_BASE_MARKER_REGEX, MERGE_CONFLICT_END_MARKER_REGEX, MERGE_CONFLICT_SEPARATOR_MARKER_REGEX, MERGE_CONFLICT_START_MARKER_REGEX, SPLIT_WITH_NEWLINES, UNIFIED_DIFF_FILE_BREAK_REGEX, UNSAFE_CSS_ATTRIBUTE };
|
|
48
52
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics","DEFAULT_EXPANDED_REGION: HunkExpansionRegion","DEFAULT_RENDER_RANGE: RenderRange","EMPTY_RENDER_RANGE: RenderRange"],"sources":["../src/constants.ts"],"sourcesContent":["import type {\n HunkExpansionRegion,\n RenderRange,\n ThemesType,\n VirtualFileMetrics,\n} from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const INDEX_LINE_METADATA: RegExp =\n /^index ([0-9a-f]+)\\.\\.([0-9a-f]+)(?: (\\d+))?$/i;\n\nexport const HEADER_PREFIX_SLOT_ID = 'header-prefix';\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n\nexport const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics = {\n hunkLineCount: 50,\n lineHeight: 20,\n diffHeaderHeight: 44,\n hunkSeparatorHeight: 32,\n fileGap: 8,\n};\n\nexport const DEFAULT_EXPANDED_REGION: HunkExpansionRegion = Object.freeze({\n fromStart: 0,\n fromEnd: 0,\n});\n\nexport const DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\nexport const EMPTY_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n"],"mappings":";AAOA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,sBACX;AAEF,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAElC,MAAa,sCAAsC;AACnD,MAAaC,+BAAmD;CAC9D,eAAe;CACf,YAAY;CACZ,kBAAkB;CAClB,qBAAqB;CACrB,SAAS;CACV;AAED,MAAaC,0BAA+C,OAAO,OAAO;CACxE,WAAW;CACX,SAAS;CACV,CAAC;AAEF,MAAaC,uBAAoC;CAC/C,cAAc;CACd,YAAY;CACZ,cAAc;CACd,aAAa;CACd;AAED,MAAaC,qBAAkC;CAC7C,cAAc;CACd,YAAY;CACZ,cAAc;CACd,aAAa;CACd"}
|
|
1
|
+
{"version":3,"file":"constants.js","names":["COMMIT_METADATA_SPLIT: RegExp","GIT_DIFF_FILE_BREAK_REGEX: RegExp","UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp","FILE_CONTEXT_BLOB: RegExp","HUNK_HEADER: RegExp","SPLIT_WITH_NEWLINES: RegExp","FILENAME_HEADER_REGEX: RegExp","FILENAME_HEADER_REGEX_GIT: RegExp","ALTERNATE_FILE_NAMES_GIT: RegExp","INDEX_LINE_METADATA: RegExp","MERGE_CONFLICT_START_MARKER_REGEX: RegExp","MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp","MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp","MERGE_CONFLICT_END_MARKER_REGEX: RegExp","DEFAULT_THEMES: ThemesType","DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics","DEFAULT_EXPANDED_REGION: HunkExpansionRegion","DEFAULT_RENDER_RANGE: RenderRange","EMPTY_RENDER_RANGE: RenderRange"],"sources":["../src/constants.ts"],"sourcesContent":["import type {\n HunkExpansionRegion,\n RenderRange,\n ThemesType,\n VirtualFileMetrics,\n} from './types';\n\nexport const DIFFS_TAG_NAME = 'diffs-container' as const;\n\n// Misc patch/content parsing regexes\nexport const COMMIT_METADATA_SPLIT: RegExp = /(?=^From [a-f0-9]+ .+$)/m;\nexport const GIT_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^diff --git)/gm;\nexport const UNIFIED_DIFF_FILE_BREAK_REGEX: RegExp = /(?=^---\\s+\\S)/gm;\nexport const FILE_CONTEXT_BLOB: RegExp = /(?=^@@ )/gm;\nexport const HUNK_HEADER: RegExp =\n /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@(?: (.*))?/m;\nexport const SPLIT_WITH_NEWLINES: RegExp = /(?<=\\n)/;\nexport const FILENAME_HEADER_REGEX: RegExp = /^(---|\\+\\+\\+)\\s+([^\\t\\r\\n]+)/;\nexport const FILENAME_HEADER_REGEX_GIT: RegExp =\n /^(---|\\+\\+\\+)\\s+[ab]\\/([^\\t\\r\\n]+)/;\nexport const ALTERNATE_FILE_NAMES_GIT: RegExp =\n /^diff --git (?:\"a\\/(.+?)\"|a\\/(.+?)) (?:\"b\\/(.+?)\"|b\\/(.+?))$/;\nexport const INDEX_LINE_METADATA: RegExp =\n /^index ([0-9a-f]+)\\.\\.([0-9a-f]+)(?: (\\d+))?$/i;\n\nexport const MERGE_CONFLICT_START_MARKER_REGEX: RegExp = /^<{7,}(?:\\s.*)?$/;\nexport const MERGE_CONFLICT_BASE_MARKER_REGEX: RegExp = /^\\|{7,}(?:\\s.*)?$/;\nexport const MERGE_CONFLICT_SEPARATOR_MARKER_REGEX: RegExp = /^={7,}$/;\nexport const MERGE_CONFLICT_END_MARKER_REGEX: RegExp = /^>{7,}(?:\\s.*)?$/;\n\nexport const HEADER_PREFIX_SLOT_ID = 'header-prefix';\nexport const HEADER_METADATA_SLOT_ID = 'header-metadata';\n\nexport const DEFAULT_THEMES: ThemesType = {\n dark: 'pierre-dark',\n light: 'pierre-light',\n};\n\nexport const UNSAFE_CSS_ATTRIBUTE = 'data-unsafe-css';\nexport const CORE_CSS_ATTRIBUTE = 'data-core-css';\n\nexport const DEFAULT_COLLAPSED_CONTEXT_THRESHOLD = 1;\nexport const DEFAULT_VIRTUAL_FILE_METRICS: VirtualFileMetrics = {\n hunkLineCount: 50,\n lineHeight: 20,\n diffHeaderHeight: 44,\n hunkSeparatorHeight: 32,\n fileGap: 8,\n};\n\nexport const DEFAULT_EXPANDED_REGION: HunkExpansionRegion = Object.freeze({\n fromStart: 0,\n fromEnd: 0,\n});\n\nexport const DEFAULT_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: Infinity,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n\nexport const EMPTY_RENDER_RANGE: RenderRange = {\n startingLine: 0,\n totalLines: 0,\n bufferBefore: 0,\n bufferAfter: 0,\n};\n"],"mappings":";AAOA,MAAa,iBAAiB;AAG9B,MAAaA,wBAAgC;AAC7C,MAAaC,4BAAoC;AACjD,MAAaC,gCAAwC;AACrD,MAAaC,oBAA4B;AACzC,MAAaC,cACX;AACF,MAAaC,sBAA8B;AAC3C,MAAaC,wBAAgC;AAC7C,MAAaC,4BACX;AACF,MAAaC,2BACX;AACF,MAAaC,sBACX;AAEF,MAAaC,oCAA4C;AACzD,MAAaC,mCAA2C;AACxD,MAAaC,wCAAgD;AAC7D,MAAaC,kCAA0C;AAEvD,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AAEvC,MAAaC,iBAA6B;CACxC,MAAM;CACN,OAAO;CACR;AAED,MAAa,uBAAuB;AACpC,MAAa,qBAAqB;AAElC,MAAa,sCAAsC;AACnD,MAAaC,+BAAmD;CAC9D,eAAe;CACf,YAAY;CACZ,kBAAkB;CAClB,qBAAqB;CACrB,SAAS;CACV;AAED,MAAaC,0BAA+C,OAAO,OAAO;CACxE,WAAW;CACX,SAAS;CACV,CAAC;AAEF,MAAaC,uBAAoC;CAC/C,cAAc;CACd,YAAY;CACZ,cAAc;CACd,aAAa;CACd;AAED,MAAaC,qBAAkC;CAC7C,cAAc;CACd,YAAY;CACZ,cAAc;CACd,aAAa;CACd"}
|