@pierre/diffs 1.1.20 → 1.2.0-beta.0
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/CodeView.d.ts +324 -0
- package/dist/components/CodeView.d.ts.map +1 -0
- package/dist/components/CodeView.js +1245 -0
- package/dist/components/CodeView.js.map +1 -0
- package/dist/components/File.d.ts +13 -12
- package/dist/components/File.d.ts.map +1 -1
- package/dist/components/File.js +68 -28
- package/dist/components/File.js.map +1 -1
- package/dist/components/FileDiff.d.ts +9 -10
- package/dist/components/FileDiff.d.ts.map +1 -1
- package/dist/components/FileDiff.js +57 -30
- package/dist/components/FileDiff.js.map +1 -1
- package/dist/components/FileStream.js +9 -3
- package/dist/components/FileStream.js.map +1 -1
- package/dist/components/UnresolvedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.d.ts +28 -5
- package/dist/components/VirtualizedFile.d.ts.map +1 -1
- package/dist/components/VirtualizedFile.js +225 -45
- package/dist/components/VirtualizedFile.js.map +1 -1
- package/dist/components/VirtualizedFileDiff.d.ts +28 -5
- package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
- package/dist/components/VirtualizedFileDiff.js +285 -49
- package/dist/components/VirtualizedFileDiff.js.map +1 -1
- package/dist/components/Virtualizer.d.ts +6 -3
- package/dist/components/Virtualizer.d.ts.map +1 -1
- package/dist/components/Virtualizer.js +4 -6
- package/dist/components/Virtualizer.js.map +1 -1
- package/dist/components/VirtulizerDevelopment.d.ts +2 -2
- package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
- package/dist/constants.d.ts +6 -2
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +17 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +11 -10
- package/dist/managers/InteractionManager.d.ts +11 -7
- package/dist/managers/InteractionManager.d.ts.map +1 -1
- package/dist/managers/InteractionManager.js +38 -25
- package/dist/managers/InteractionManager.js.map +1 -1
- package/dist/managers/ResizeManager.d.ts +4 -4
- package/dist/managers/ResizeManager.d.ts.map +1 -1
- package/dist/managers/ResizeManager.js +89 -54
- package/dist/managers/ResizeManager.js.map +1 -1
- package/dist/managers/UniversalRenderingManager.d.ts +2 -1
- package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
- package/dist/managers/UniversalRenderingManager.js +13 -16
- package/dist/managers/UniversalRenderingManager.js.map +1 -1
- package/dist/react/CodeView.d.ts +45 -0
- package/dist/react/CodeView.d.ts.map +1 -0
- package/dist/react/CodeView.js +241 -0
- package/dist/react/CodeView.js.map +1 -0
- package/dist/react/File.d.ts +0 -1
- package/dist/react/File.d.ts.map +1 -1
- package/dist/react/File.js +2 -3
- package/dist/react/File.js.map +1 -1
- package/dist/react/FileDiff.d.ts +0 -1
- package/dist/react/FileDiff.d.ts.map +1 -1
- package/dist/react/FileDiff.js +3 -4
- package/dist/react/FileDiff.js.map +1 -1
- package/dist/react/MultiFileDiff.d.ts +0 -1
- package/dist/react/MultiFileDiff.d.ts.map +1 -1
- package/dist/react/MultiFileDiff.js +3 -4
- package/dist/react/MultiFileDiff.js.map +1 -1
- package/dist/react/PatchDiff.d.ts +0 -1
- package/dist/react/PatchDiff.d.ts.map +1 -1
- package/dist/react/PatchDiff.js +3 -4
- package/dist/react/PatchDiff.js.map +1 -1
- package/dist/react/UnresolvedFile.d.ts +0 -1
- package/dist/react/UnresolvedFile.d.ts.map +1 -1
- package/dist/react/UnresolvedFile.js +3 -4
- package/dist/react/UnresolvedFile.js.map +1 -1
- package/dist/react/constants.d.ts.map +1 -1
- package/dist/react/index.d.ts +3 -2
- package/dist/react/index.js +5 -4
- package/dist/react/types.d.ts +0 -8
- package/dist/react/types.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.d.ts +0 -2
- package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
- package/dist/react/utils/renderDiffChildren.js +3 -4
- package/dist/react/utils/renderDiffChildren.js.map +1 -1
- package/dist/react/utils/renderFileChildren.d.ts +0 -2
- package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
- package/dist/react/utils/renderFileChildren.js +3 -4
- package/dist/react/utils/renderFileChildren.js.map +1 -1
- package/dist/react/utils/useFileDiffInstance.js +12 -7
- package/dist/react/utils/useFileDiffInstance.js.map +1 -1
- package/dist/react/utils/useFileInstance.js +12 -7
- package/dist/react/utils/useFileInstance.js.map +1 -1
- package/dist/react/utils/useUnresolvedFileInstance.js +6 -2
- package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
- package/dist/renderers/DiffHunksRenderer.d.ts +2 -1
- package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
- package/dist/renderers/DiffHunksRenderer.js +35 -20
- package/dist/renderers/DiffHunksRenderer.js.map +1 -1
- package/dist/renderers/FileRenderer.d.ts +2 -1
- package/dist/renderers/FileRenderer.d.ts.map +1 -1
- package/dist/renderers/FileRenderer.js +34 -20
- package/dist/renderers/FileRenderer.js.map +1 -1
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/preloadDiffs.js +1 -1
- package/dist/style.js +1 -1
- package/dist/style.js.map +1 -1
- package/dist/types.d.ts +98 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/areManagedSnapshotsEqual.d.ts +7 -0
- package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -0
- package/dist/utils/areManagedSnapshotsEqual.js +15 -0
- package/dist/utils/areManagedSnapshotsEqual.js.map +1 -0
- package/dist/utils/areOptionsEqual.d.ts +2 -1
- package/dist/utils/areOptionsEqual.d.ts.map +1 -1
- package/dist/utils/areOptionsEqual.js +1 -1
- package/dist/utils/areOptionsEqual.js.map +1 -1
- package/dist/utils/createFileHeaderElement.d.ts +3 -1
- package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
- package/dist/utils/createFileHeaderElement.js +3 -2
- package/dist/utils/createFileHeaderElement.js.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.d.ts +3 -3
- package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
- package/dist/utils/createWindowFromScrollPosition.js +6 -6
- package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
- package/dist/utils/iterateOverDiff.d.ts +2 -1
- package/dist/utils/iterateOverDiff.d.ts.map +1 -1
- package/dist/utils/iterateOverDiff.js +135 -7
- package/dist/utils/iterateOverDiff.js.map +1 -1
- package/dist/utils/renderFileWithHighlighter.js +1 -1
- package/dist/utils/resolveVirtualFileMetrics.d.ts +4 -1
- package/dist/utils/resolveVirtualFileMetrics.d.ts.map +1 -1
- package/dist/utils/resolveVirtualFileMetrics.js +11 -1
- package/dist/utils/resolveVirtualFileMetrics.js.map +1 -1
- package/dist/utils/roundToDevicePixel.d.ts +14 -0
- package/dist/utils/roundToDevicePixel.d.ts.map +1 -0
- package/dist/utils/roundToDevicePixel.js +18 -0
- package/dist/utils/roundToDevicePixel.js.map +1 -0
- package/dist/worker/worker-portable.js +195 -14
- package/dist/worker/worker-portable.js.map +1 -1
- package/dist/worker/worker.js +146 -7
- package/dist/worker/worker.js.map +1 -1
- package/package.json +7 -1
- package/dist/components/AdvancedVirtualizedFileDiff.d.ts +0 -40
- package/dist/components/AdvancedVirtualizedFileDiff.d.ts.map +0 -1
- package/dist/components/AdvancedVirtualizedFileDiff.js +0 -140
- package/dist/components/AdvancedVirtualizedFileDiff.js.map +0 -1
- package/dist/components/AdvancedVirtualizer.d.ts +0 -38
- package/dist/components/AdvancedVirtualizer.d.ts.map +0 -1
- package/dist/components/AdvancedVirtualizer.js +0 -201
- package/dist/components/AdvancedVirtualizer.js.map +0 -1
package/dist/components/File.js
CHANGED
|
@@ -2,6 +2,7 @@ import { CUSTOM_HEADER_SLOT_ID, DEFAULT_THEMES, DIFFS_TAG_NAME, EMPTY_RENDER_RAN
|
|
|
2
2
|
import { InteractionManager, pluckInteractionOptions } from "../managers/InteractionManager.js";
|
|
3
3
|
import { ResizeManager } from "../managers/ResizeManager.js";
|
|
4
4
|
import { areRenderRangesEqual } from "../utils/areRenderRangesEqual.js";
|
|
5
|
+
import { areThemesEqual } from "../utils/areThemesEqual.js";
|
|
5
6
|
import { getLineAnnotationName } from "../utils/getLineAnnotationName.js";
|
|
6
7
|
import { FileRenderer } from "../renderers/FileRenderer.js";
|
|
7
8
|
import { SVGSpriteSheet } from "../sprite.js";
|
|
@@ -50,8 +51,10 @@ var File = class {
|
|
|
50
51
|
interactionManager;
|
|
51
52
|
annotationCache = /* @__PURE__ */ new Map();
|
|
52
53
|
lineAnnotations = [];
|
|
54
|
+
managersDirty = false;
|
|
53
55
|
file;
|
|
54
56
|
renderRange;
|
|
57
|
+
enabled = true;
|
|
55
58
|
constructor(options = { theme: DEFAULT_THEMES }, workerManager, isContainerManaged = false) {
|
|
56
59
|
this.options = options;
|
|
57
60
|
this.workerManager = workerManager;
|
|
@@ -65,7 +68,7 @@ var File = class {
|
|
|
65
68
|
this.rerender();
|
|
66
69
|
};
|
|
67
70
|
rerender() {
|
|
68
|
-
if (this.file == null) return;
|
|
71
|
+
if (!this.enabled || this.file == null) return;
|
|
69
72
|
this.render({
|
|
70
73
|
file: this.file,
|
|
71
74
|
forceRender: true,
|
|
@@ -86,8 +89,17 @@ var File = class {
|
|
|
86
89
|
setThemeType(themeType) {
|
|
87
90
|
if ((this.options.themeType ?? "system") === themeType) return;
|
|
88
91
|
this.mergeOptions({ themeType });
|
|
89
|
-
|
|
92
|
+
this.applyCachedThemeState(themeType);
|
|
93
|
+
}
|
|
94
|
+
applyCachedThemeState(themeType) {
|
|
95
|
+
if (typeof this.options.theme === "string" || this.fileContainer == null || this.appliedThemeCSS == null) return false;
|
|
96
|
+
const effectiveThemeType = this.appliedThemeCSS.baseThemeType ?? themeType;
|
|
97
|
+
if (this.appliedThemeCSS.themeType === effectiveThemeType) return false;
|
|
90
98
|
this.applyThemeState(this.fileContainer, this.appliedThemeCSS.themeStyles, themeType, this.appliedThemeCSS.baseThemeType);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
hasThemeChanged() {
|
|
102
|
+
return this.appliedThemeCSS != null && !areThemesEqual(this.appliedThemeCSS.theme, this.options.theme ?? DEFAULT_THEMES);
|
|
91
103
|
}
|
|
92
104
|
getHoveredLine = () => {
|
|
93
105
|
return this.interactionManager.getHoveredLine();
|
|
@@ -95,20 +107,29 @@ var File = class {
|
|
|
95
107
|
setLineAnnotations(lineAnnotations) {
|
|
96
108
|
this.lineAnnotations = lineAnnotations;
|
|
97
109
|
}
|
|
98
|
-
setSelectedLines(range) {
|
|
99
|
-
this.interactionManager.setSelection(range);
|
|
110
|
+
setSelectedLines(range, options) {
|
|
111
|
+
this.interactionManager.setSelection(range, options);
|
|
100
112
|
}
|
|
101
|
-
|
|
102
|
-
this.
|
|
113
|
+
flushManagers() {
|
|
114
|
+
if (!this.managersDirty || this.pre == null) {
|
|
115
|
+
this.managersDirty = false;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const { overflow = "scroll" } = this.options;
|
|
119
|
+
this.interactionManager.setup(this.pre);
|
|
120
|
+
this.resizeManager.setup(this.pre, overflow === "wrap");
|
|
121
|
+
this.managersDirty = false;
|
|
122
|
+
}
|
|
123
|
+
cleanUp(recycle = false) {
|
|
103
124
|
this.resizeManager.cleanUp();
|
|
104
125
|
this.interactionManager.cleanUp();
|
|
126
|
+
this.managersDirty = false;
|
|
105
127
|
this.workerManager?.unsubscribeToThemeChanges(this);
|
|
106
|
-
this.workerManager = void 0;
|
|
107
128
|
this.renderRange = void 0;
|
|
108
|
-
this.file = void 0;
|
|
109
129
|
if (!this.isContainerManaged) this.fileContainer?.remove();
|
|
110
|
-
if (this.fileContainer?.shadowRoot != null) this.fileContainer.shadowRoot.innerHTML = "";
|
|
111
130
|
this.fileContainer = void 0;
|
|
131
|
+
this.lineAnnotations = [];
|
|
132
|
+
this.annotationCache.clear();
|
|
112
133
|
this.pre = void 0;
|
|
113
134
|
this.bufferBefore = void 0;
|
|
114
135
|
this.bufferAfter = void 0;
|
|
@@ -125,6 +146,17 @@ var File = class {
|
|
|
125
146
|
this.unsafeCSSStyle = void 0;
|
|
126
147
|
this.appliedUnsafeCSS = void 0;
|
|
127
148
|
this.placeHolder = void 0;
|
|
149
|
+
this.unsafeCSSStyle = void 0;
|
|
150
|
+
if (!recycle) {
|
|
151
|
+
this.fileRenderer.cleanUp();
|
|
152
|
+
this.workerManager = void 0;
|
|
153
|
+
this.file = void 0;
|
|
154
|
+
}
|
|
155
|
+
this.enabled = false;
|
|
156
|
+
}
|
|
157
|
+
virtualizedSetup() {
|
|
158
|
+
this.enabled = true;
|
|
159
|
+
this.workerManager?.subscribeToThemeChanges(this);
|
|
128
160
|
}
|
|
129
161
|
hydrate(props) {
|
|
130
162
|
const { fileContainer, prerenderedHTML, preventEmit = false, file, lineAnnotations } = props;
|
|
@@ -174,7 +206,6 @@ var File = class {
|
|
|
174
206
|
this.fileContainer = fileContainer;
|
|
175
207
|
}
|
|
176
208
|
hydrationSetup({ file, lineAnnotations }) {
|
|
177
|
-
const { overflow = "scroll" } = this.options;
|
|
178
209
|
this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;
|
|
179
210
|
this.file = file;
|
|
180
211
|
this.fileRenderer.setOptions({
|
|
@@ -186,19 +217,21 @@ var File = class {
|
|
|
186
217
|
this.renderAnnotations();
|
|
187
218
|
this.renderGutterUtility();
|
|
188
219
|
this.injectUnsafeCSS();
|
|
189
|
-
this.
|
|
190
|
-
this.
|
|
220
|
+
this.managersDirty = true;
|
|
221
|
+
this.flushManagers();
|
|
191
222
|
}
|
|
192
223
|
getOrCreateLineCache(file = this.file) {
|
|
193
224
|
return file != null ? this.fileRenderer.getOrCreateLineCache(file) : EMPTY_STRINGS;
|
|
194
225
|
}
|
|
195
|
-
render({ file, fileContainer, forceRender = false, preventEmit = false, containerWrapper, lineAnnotations, renderRange }) {
|
|
226
|
+
render({ file, fileContainer, forceRender = false, preventEmit = false, containerWrapper, deferManagers = false, lineAnnotations, renderRange }) {
|
|
196
227
|
const { collapsed = false, themeType = "system" } = this.options;
|
|
228
|
+
if (!this.enabled) throw new Error("File.render: attempting to call render after cleaned up");
|
|
197
229
|
const nextRenderRange = collapsed ? void 0 : renderRange;
|
|
198
230
|
const previousRenderRange = this.renderRange;
|
|
231
|
+
const themeChanged = this.hasThemeChanged();
|
|
199
232
|
const annotationsChanged = lineAnnotations != null && (lineAnnotations.length > 0 || this.lineAnnotations.length > 0) ? lineAnnotations !== this.lineAnnotations : false;
|
|
200
233
|
const didFileChange = !areFilesEqual(this.file, file);
|
|
201
|
-
if (!collapsed && !forceRender && areRenderRangesEqual(nextRenderRange, this.renderRange) && !didFileChange && !annotationsChanged) return
|
|
234
|
+
if (!collapsed && !forceRender && areRenderRangesEqual(nextRenderRange, this.renderRange) && !didFileChange && !annotationsChanged && !themeChanged) return this.applyCachedThemeState(themeType);
|
|
202
235
|
this.renderRange = nextRenderRange;
|
|
203
236
|
this.file = file;
|
|
204
237
|
this.fileRenderer.setOptions({
|
|
@@ -207,7 +240,7 @@ var File = class {
|
|
|
207
240
|
});
|
|
208
241
|
if (lineAnnotations != null) this.setLineAnnotations(lineAnnotations);
|
|
209
242
|
this.fileRenderer.setLineAnnotations(this.lineAnnotations);
|
|
210
|
-
const { disableErrorHandling = false, disableFileHeader = false
|
|
243
|
+
const { disableErrorHandling = false, disableFileHeader = false } = this.options;
|
|
211
244
|
if (disableFileHeader) {
|
|
212
245
|
if (this.headerElement != null) {
|
|
213
246
|
this.headerElement.remove();
|
|
@@ -217,6 +250,7 @@ var File = class {
|
|
|
217
250
|
this.clearHeaderSlots();
|
|
218
251
|
}
|
|
219
252
|
fileContainer = this.getOrCreateFileContainerNode(fileContainer, containerWrapper);
|
|
253
|
+
this.applyCachedThemeState(themeType);
|
|
220
254
|
if (collapsed) {
|
|
221
255
|
this.removeRenderedCode();
|
|
222
256
|
this.clearAuxiliaryNodes();
|
|
@@ -235,7 +269,7 @@ var File = class {
|
|
|
235
269
|
}
|
|
236
270
|
try {
|
|
237
271
|
const pre = this.getOrCreatePreNode(fileContainer);
|
|
238
|
-
if (!this.canPartiallyRender(forceRender, annotationsChanged, didFileChange) || !this.applyPartialRender(previousRenderRange, nextRenderRange)) {
|
|
272
|
+
if (!this.canPartiallyRender(forceRender, annotationsChanged, didFileChange || themeChanged) || !this.applyPartialRender(previousRenderRange, nextRenderRange)) {
|
|
239
273
|
const fileResult = this.fileRenderer.renderFile(file, nextRenderRange);
|
|
240
274
|
if (fileResult == null) {
|
|
241
275
|
if (this.workerManager?.isInitialized() === false) this.workerManager.initialize().then(() => this.rerender());
|
|
@@ -247,8 +281,8 @@ var File = class {
|
|
|
247
281
|
}
|
|
248
282
|
this.applyBuffers(pre, nextRenderRange);
|
|
249
283
|
this.injectUnsafeCSS();
|
|
250
|
-
this.
|
|
251
|
-
this.
|
|
284
|
+
this.managersDirty = true;
|
|
285
|
+
if (!deferManagers) this.flushManagers();
|
|
252
286
|
this.renderAnnotations();
|
|
253
287
|
this.renderGutterUtility();
|
|
254
288
|
} catch (error) {
|
|
@@ -363,7 +397,7 @@ var File = class {
|
|
|
363
397
|
}
|
|
364
398
|
}
|
|
365
399
|
renderGutterUtility() {
|
|
366
|
-
const renderGutterUtility = this.options
|
|
400
|
+
const { renderGutterUtility } = this.options;
|
|
367
401
|
if (this.fileContainer == null || renderGutterUtility == null) {
|
|
368
402
|
this.gutterUtilityContent?.remove();
|
|
369
403
|
this.gutterUtilityContent = void 0;
|
|
@@ -402,13 +436,19 @@ var File = class {
|
|
|
402
436
|
applyThemeState(container, themeStyles, themeType, baseThemeType) {
|
|
403
437
|
const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
|
|
404
438
|
const effectiveThemeType = baseThemeType ?? themeType;
|
|
405
|
-
|
|
439
|
+
const currentTheme = this.options.theme ?? DEFAULT_THEMES;
|
|
440
|
+
const theme = typeof currentTheme === "string" ? currentTheme : { ...currentTheme };
|
|
441
|
+
if (this.themeCSSStyle?.parentNode === shadowRoot && this.appliedThemeCSS?.themeStyles === themeStyles && this.appliedThemeCSS.themeType === effectiveThemeType) {
|
|
442
|
+
this.appliedThemeCSS.theme = theme;
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
406
445
|
this.themeCSSStyle = upsertHostThemeStyle({
|
|
407
446
|
shadowRoot,
|
|
408
447
|
currentNode: this.themeCSSStyle,
|
|
409
448
|
themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType)
|
|
410
449
|
});
|
|
411
450
|
this.appliedThemeCSS = this.themeCSSStyle != null ? {
|
|
451
|
+
theme,
|
|
412
452
|
themeStyles,
|
|
413
453
|
themeType: effectiveThemeType,
|
|
414
454
|
baseThemeType
|
|
@@ -515,8 +555,7 @@ var File = class {
|
|
|
515
555
|
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
516
556
|
}
|
|
517
557
|
applyBuffers(pre, renderRange) {
|
|
518
|
-
|
|
519
|
-
if (disableVirtualizationBuffers || renderRange == null) {
|
|
558
|
+
if (renderRange == null || this.shouldDisableVirtualizationBuffers()) {
|
|
520
559
|
if (this.bufferBefore != null) {
|
|
521
560
|
this.bufferBefore.remove();
|
|
522
561
|
this.bufferBefore = void 0;
|
|
@@ -552,6 +591,9 @@ var File = class {
|
|
|
552
591
|
this.bufferAfter = void 0;
|
|
553
592
|
}
|
|
554
593
|
}
|
|
594
|
+
shouldDisableVirtualizationBuffers() {
|
|
595
|
+
return this.options.disableVirtualizationBuffers ?? false;
|
|
596
|
+
}
|
|
555
597
|
applyHeaderToDOM(headerAST, container) {
|
|
556
598
|
const { file } = this;
|
|
557
599
|
if (file == null) return;
|
|
@@ -570,7 +612,7 @@ var File = class {
|
|
|
570
612
|
this.lastRenderedHeaderHTML = headerHTML;
|
|
571
613
|
}
|
|
572
614
|
if (this.isContainerManaged) return;
|
|
573
|
-
const { renderHeaderPrefix, renderCustomHeader,
|
|
615
|
+
const { renderHeaderPrefix, renderCustomHeader, renderHeaderMetadata } = this.options;
|
|
574
616
|
if (renderCustomHeader != null) {
|
|
575
617
|
const content = renderCustomHeader(file) ?? void 0;
|
|
576
618
|
this.headerCustom = this.upsertHeaderSlotElement(container, this.headerCustom, CUSTOM_HEADER_SLOT_ID, content);
|
|
@@ -580,7 +622,7 @@ var File = class {
|
|
|
580
622
|
this.headerMetadata = void 0;
|
|
581
623
|
} else {
|
|
582
624
|
const prefix = renderHeaderPrefix?.(file) ?? void 0;
|
|
583
|
-
const content =
|
|
625
|
+
const content = renderHeaderMetadata?.(file) ?? void 0;
|
|
584
626
|
this.headerPrefix = this.upsertHeaderSlotElement(container, this.headerPrefix, HEADER_PREFIX_SLOT_ID, prefix);
|
|
585
627
|
this.headerMetadata = this.upsertHeaderSlotElement(container, this.headerMetadata, HEADER_METADATA_SLOT_ID, content);
|
|
586
628
|
this.headerCustom?.remove();
|
|
@@ -676,15 +718,13 @@ var File = class {
|
|
|
676
718
|
}
|
|
677
719
|
applyErrorToDOM(error, container) {
|
|
678
720
|
this.cleanupErrorWrapper();
|
|
679
|
-
|
|
680
|
-
pre.innerHTML = "";
|
|
681
|
-
pre.remove();
|
|
721
|
+
this.pre?.remove();
|
|
682
722
|
this.pre = void 0;
|
|
683
723
|
this.appliedPreAttributes = void 0;
|
|
684
724
|
const shadowRoot = container.shadowRoot ?? container.attachShadow({ mode: "open" });
|
|
685
725
|
this.errorWrapper ??= document.createElement("div");
|
|
686
726
|
this.errorWrapper.dataset.errorWrapper = "";
|
|
687
|
-
this.errorWrapper.
|
|
727
|
+
this.errorWrapper.textContent = "";
|
|
688
728
|
shadowRoot.appendChild(this.errorWrapper);
|
|
689
729
|
const errorMessage = document.createElement("div");
|
|
690
730
|
errorMessage.dataset.errorMessage = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"File.js","names":["EMPTY_STRINGS: string[]","options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","preProperties: PrePropertiesConfig"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n CUSTOM_HEADER_SLOT_ID,\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n EMPTY_RENDER_RANGE,\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n type GetHoveredLineResult,\n InteractionManager,\n type InteractionManagerBaseOptions,\n pluckInteractionOptions,\n type SelectedLineRange,\n} from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer, type FileRenderResult } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n PrePropertiesConfig,\n RenderFileMetadata,\n RenderRange,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createGutterUtilityContentNode } from '../utils/createGutterUtilityContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapThemeCSS, wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nconst EMPTY_STRINGS: string[] = [];\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileHydrateProps<LAnnotation> extends Omit<\n FileRenderProps<LAnnotation>,\n 'fileContainer'\n> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n /**\n * @deprecated Use `enableGutterUtility` instead.\n */\n enableHoverUtility?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderCustomMetadata?: RenderFileMetadata;\n renderCustomHeader?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null | undefined;\n /**\n * @deprecated Use `renderGutterUtility` instead.\n */\n renderHoverUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null | undefined;\n\n onPostRender?(node: HTMLElement, instance: File<LAnnotation>): unknown;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\ninterface ColumnElements {\n gutter: HTMLElement;\n content: HTMLElement;\n}\n\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.interactionManager = new InteractionManager(\n 'file',\n pluckInteractionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n public rerender(): void {\n if (this.file == null) return;\n this.render({\n file: this.file,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n public setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.interactionManager.setOptions(pluckInteractionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n }\n\n public getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.interactionManager.getHoveredLine();\n };\n\n public setLineAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n public setSelectedLines(range: SelectedLineRange | null): void {\n this.interactionManager.setSelection(range);\n }\n\n public cleanUp(): void {\n this.fileRenderer.cleanUp();\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.workerManager = undefined;\n this.renderRange = undefined;\n\n // Clean up the data\n this.file = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.remove();\n }\n if (this.fileContainer?.shadowRoot != null) {\n this.fileContainer.shadowRoot.innerHTML = '';\n }\n this.fileContainer = undefined;\n this.pre = undefined;\n this.bufferBefore = undefined;\n this.bufferAfter = undefined;\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n this.placeHolder = undefined;\n }\n\n public hydrate(props: FileHydrateProps<LAnnotation>): void {\n const {\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n file,\n lineAnnotations,\n } = props;\n this.hydrateElements(fileContainer, prerenderedHTML);\n if (\n shouldRenderCode(this.pre, file, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n file,\n this.options.disableFileHeader\n )\n ) {\n this.render({ ...props, preventEmit: true });\n }\n // Otherwise orchestrate our setup.\n else {\n this.hydrationSetup({ file, lineAnnotations });\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n protected hydrateElements(\n fileContainer: HTMLElement,\n prerenderedHTML: string | undefined\n ): void {\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n this.appliedPreAttributes = undefined;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n this.appliedUnsafeCSS = element.textContent;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodeFromPre(this.pre);\n this.pre.removeAttribute('data-dehydrated');\n }\n this.fileContainer = fileContainer;\n }\n\n protected hydrationSetup({\n file,\n lineAnnotations,\n }: HydrationSetup<LAnnotation>): void {\n const { overflow = 'scroll' } = this.options;\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.setOptions({\n ...this.options,\n headerRenderMode:\n this.options.renderCustomHeader != null ? 'custom' : 'default',\n });\n if (this.pre == null) {\n return;\n }\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderGutterUtility();\n this.injectUnsafeCSS();\n this.interactionManager.setup(this.pre);\n this.resizeManager.setup(this.pre, overflow === 'wrap');\n }\n\n public getOrCreateLineCache(\n file: FileContents | undefined = this.file\n ): string[] {\n return file != null\n ? this.fileRenderer.getOrCreateLineCache(file)\n : EMPTY_STRINGS;\n }\n\n public render({\n file,\n fileContainer,\n forceRender = false,\n preventEmit = false,\n containerWrapper,\n lineAnnotations,\n renderRange,\n }: FileRenderProps<LAnnotation>): boolean {\n const { collapsed = false, themeType = 'system' } = this.options;\n const nextRenderRange = collapsed ? undefined : renderRange;\n const previousRenderRange = this.renderRange;\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n const didFileChange = !areFilesEqual(this.file, file);\n if (\n !collapsed &&\n !forceRender &&\n areRenderRangesEqual(nextRenderRange, this.renderRange) &&\n !didFileChange &&\n !annotationsChanged\n ) {\n return false;\n }\n\n this.renderRange = nextRenderRange;\n this.file = file;\n this.fileRenderer.setOptions({\n ...this.options,\n headerRenderMode:\n this.options.renderCustomHeader != null ? 'custom' : 'default',\n });\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const {\n disableErrorHandling = false,\n disableFileHeader = false,\n overflow = 'scroll',\n } = this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.remove();\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n this.clearHeaderSlots();\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n\n if (collapsed) {\n this.removeRenderedCode();\n this.clearAuxiliaryNodes();\n\n try {\n const fileResult = this.fileRenderer.renderFile(\n file,\n EMPTY_RENDER_RANGE\n );\n if (fileResult != null) {\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n }\n if (fileResult?.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n this.injectUnsafeCSS();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n try {\n const pre = this.getOrCreatePreNode(fileContainer);\n if (\n !this.canPartiallyRender(\n forceRender,\n annotationsChanged,\n didFileChange\n ) ||\n !this.applyPartialRender(previousRenderRange, nextRenderRange)\n ) {\n const fileResult = this.fileRenderer.renderFile(file, nextRenderRange);\n if (fileResult == null) {\n if (this.workerManager?.isInitialized() === false) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return false;\n }\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n this.applyFullRender(fileResult, pre);\n }\n\n this.applyBuffers(pre, nextRenderRange);\n this.injectUnsafeCSS();\n this.interactionManager.setup(pre);\n this.resizeManager.setup(pre, overflow === 'wrap');\n this.renderAnnotations();\n this.renderGutterUtility();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n private emitPostRender() {\n if (this.fileContainer != null) {\n this.options.onPostRender?.(this.fileContainer, this);\n }\n }\n\n private removeRenderedCode(): void {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n\n this.code?.remove();\n this.code = undefined;\n\n this.pre?.remove();\n this.pre = undefined;\n\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n }\n\n private clearAuxiliaryNodes(): void {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n }\n\n private canPartiallyRender(\n forceRender: boolean,\n annotationsChanged: boolean,\n didContentChange: boolean\n ): boolean {\n if (forceRender || annotationsChanged || didContentChange) {\n return false;\n }\n return true;\n }\n\n public renderPlaceholder(height: number): boolean {\n if (this.fileContainer == null) {\n return false;\n }\n this.cleanChildNodes();\n\n if (this.placeHolder == null) {\n const shadowRoot =\n this.fileContainer.shadowRoot ??\n this.fileContainer.attachShadow({ mode: 'open' });\n this.placeHolder = document.createElement('div');\n this.placeHolder.dataset.placeholder = '';\n shadowRoot.appendChild(this.placeHolder);\n }\n this.placeHolder.style.setProperty('height', `${height}px`);\n return true;\n }\n\n private cleanChildNodes() {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferAfter?.remove();\n this.bufferBefore?.remove();\n this.code?.remove();\n this.errorWrapper?.remove();\n this.headerElement?.remove();\n this.gutterUtilityContent?.remove();\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.pre?.remove();\n this.spriteSVG?.remove();\n this.themeCSSStyle?.remove();\n this.unsafeCSSStyle?.remove();\n\n this.bufferAfter = undefined;\n this.bufferBefore = undefined;\n this.code = undefined;\n this.errorWrapper = undefined;\n this.headerElement = undefined;\n this.gutterUtilityContent = undefined;\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.pre = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n\n this.lastRenderedHeaderHTML = undefined;\n this.lastRowCount = undefined;\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.remove();\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.remove();\n }\n }\n\n private renderGutterUtility() {\n const renderGutterUtility =\n this.options.renderGutterUtility ?? this.options.renderHoverUtility;\n if (this.fileContainer == null || renderGutterUtility == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const element = renderGutterUtility(this.interactionManager.getHoveredLine);\n if (element != null && this.gutterUtilityContent != null) {\n return;\n } else if (element == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const gutterUtilityContent = createGutterUtilityContentNode();\n gutterUtilityContent.appendChild(element);\n this.fileContainer.appendChild(gutterUtilityContent);\n this.gutterUtilityContent = gutterUtilityContent;\n }\n\n private injectUnsafeCSS(): void {\n const { unsafeCSS } = this.options;\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null) {\n return;\n }\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.remove();\n this.unsafeCSSStyle = undefined;\n }\n this.appliedUnsafeCSS = undefined;\n return;\n }\n\n if (\n this.unsafeCSSStyle?.parentNode === shadowRoot &&\n this.appliedUnsafeCSS === unsafeCSS\n ) {\n return;\n }\n\n // Create or update the style element\n this.unsafeCSSStyle ??= createUnsafeCSSStyleNode();\n if (this.unsafeCSSStyle.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.textContent = wrapUnsafeCSS(unsafeCSS);\n this.appliedUnsafeCSS = unsafeCSS;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType\n ) {\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n }\n : undefined;\n }\n\n private applyFullRender(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n this.code = getOrCreateCodeNode({ code: this.code });\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(\n this.fileRenderer.renderCodeAST(result)\n );\n pre.replaceChildren(this.code);\n this.lastRowCount = result.rowCount;\n }\n\n private applyPartialRender(\n previousRenderRange: RenderRange | undefined,\n renderRange: RenderRange | undefined\n ): boolean {\n if (previousRenderRange == null || renderRange == null) {\n return false;\n }\n const { file, code } = this;\n const columns = code != null ? this.getColumns(code) : undefined;\n if (file == null || code == null || columns == null) {\n return false;\n }\n\n const previousStart = previousRenderRange.startingLine;\n const nextStart = renderRange.startingLine;\n const previousEnd =\n previousRenderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : previousStart + previousRenderRange.totalLines;\n const nextEnd =\n renderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : nextStart + renderRange.totalLines;\n\n const overlapStart = Math.max(previousStart, nextStart);\n const overlapEnd = Math.min(previousEnd, nextEnd);\n if (overlapEnd <= overlapStart) {\n return false;\n }\n\n if (\n !this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) ||\n !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)\n ) {\n return false;\n }\n\n let { length: rowCount } = columns.content.children;\n\n const renderChunk = (\n startingLine: number,\n totalLines: number\n ): FileRenderResult | undefined => {\n if (totalLines <= 0) {\n return undefined;\n }\n return this.fileRenderer.renderFile(file, {\n startingLine,\n totalLines,\n bufferBefore: 0,\n bufferAfter: 0,\n });\n };\n\n const prependResult =\n nextStart < overlapStart\n ? renderChunk(nextStart, overlapStart - nextStart)\n : undefined;\n if (prependResult === undefined && nextStart < overlapStart) {\n return false;\n }\n\n const appendTotalLines =\n nextEnd === Number.POSITIVE_INFINITY\n ? Number.POSITIVE_INFINITY\n : Math.max(0, nextEnd - overlapEnd);\n const appendResult =\n nextEnd > overlapEnd\n ? renderChunk(overlapEnd, appendTotalLines)\n : undefined;\n if (appendResult === undefined && nextEnd > overlapEnd) {\n return false;\n }\n\n this.cleanupErrorWrapper();\n if (prependResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.contentAST)\n );\n rowCount += prependResult.rowCount;\n }\n\n if (appendResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.contentAST)\n );\n rowCount += appendResult.rowCount;\n }\n\n if (this.lastRowCount !== rowCount) {\n columns.gutter.style.setProperty('grid-row', `span ${rowCount}`);\n columns.content.style.setProperty('grid-row', `span ${rowCount}`);\n this.lastRowCount = rowCount;\n }\n\n return true;\n }\n\n private getColumns(code: HTMLElement): ColumnElements | undefined {\n const gutter = code.children[0];\n const content = code.children[1];\n if (\n !(gutter instanceof HTMLElement) ||\n !(content instanceof HTMLElement) ||\n gutter.dataset.gutter == null ||\n content.dataset.content == null\n ) {\n return undefined;\n }\n return { gutter, content };\n }\n\n private trimDOMToOverlap(\n container: HTMLElement,\n overlapStart: number,\n overlapEnd: number\n ): boolean {\n const boundaryIndices = this.getDOMBoundaryIndices(container, [\n overlapStart,\n overlapEnd,\n ]);\n const startIndex =\n boundaryIndices.get(overlapStart) ?? container.children.length;\n const endIndex =\n boundaryIndices.get(overlapEnd) ?? container.children.length;\n\n if (startIndex > endIndex) {\n return false;\n }\n\n for (let i = container.children.length - 1; i >= endIndex; i -= 1) {\n container.children[i]?.remove();\n }\n for (let i = startIndex - 1; i >= 0; i -= 1) {\n container.children[i]?.remove();\n }\n return true;\n }\n\n private getDOMBoundaryIndices(\n container: HTMLElement,\n boundaries: number[]\n ): Map<number, number> {\n const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);\n const boundaryIndices = new Map<number, number>();\n if (sortedBoundaries.length === 0) {\n return boundaryIndices;\n }\n let boundaryIndex = 0;\n let nextBoundary = sortedBoundaries[boundaryIndex];\n const { children } = container;\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const lineIndex = this.getLineIndexFromDOMNode(child);\n if (lineIndex == null) {\n continue;\n }\n while (nextBoundary != null && lineIndex >= nextBoundary) {\n boundaryIndices.set(nextBoundary, i);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n if (boundaryIndex >= sortedBoundaries.length) {\n break;\n }\n }\n\n for (const boundary of sortedBoundaries) {\n if (!boundaryIndices.has(boundary)) {\n boundaryIndices.set(boundary, children.length);\n }\n }\n return boundaryIndices;\n }\n\n private getLineIndexFromDOMNode(node: HTMLElement): number | undefined {\n const lineIndexAttr = node.dataset.lineIndex;\n if (lineIndexAttr == null) {\n return undefined;\n }\n const parsed = Number(lineIndexAttr);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private applyBuffers(\n pre: HTMLPreElement,\n renderRange: RenderRange | undefined\n ) {\n const { disableVirtualizationBuffers = false } = this.options;\n if (disableVirtualizationBuffers || renderRange == null) {\n if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n return;\n }\n\n if (renderRange.bufferBefore > 0) {\n if (this.bufferBefore == null) {\n this.bufferBefore = document.createElement('div');\n this.bufferBefore.dataset.virtualizerBuffer = 'before';\n pre.before(this.bufferBefore);\n }\n this.bufferBefore.style.setProperty(\n 'height',\n `${renderRange.bufferBefore}px`\n );\n this.bufferBefore.style.setProperty('contain', 'strict');\n } else if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n\n if (renderRange.bufferAfter > 0) {\n if (this.bufferAfter == null) {\n this.bufferAfter = document.createElement('div');\n this.bufferAfter.dataset.virtualizerBuffer = 'after';\n pre.after(this.bufferAfter);\n }\n this.bufferAfter.style.setProperty(\n 'height',\n `${renderRange.bufferAfter}px`\n );\n this.bufferAfter.style.setProperty('contain', 'strict');\n } else if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderPrefix, renderCustomHeader, renderCustomMetadata } =\n this.options;\n\n if (renderCustomHeader != null) {\n const content = renderCustomHeader(file) ?? undefined;\n this.headerCustom = this.upsertHeaderSlotElement(\n container,\n this.headerCustom,\n CUSTOM_HEADER_SLOT_ID,\n content\n );\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n } else {\n const prefix = renderHeaderPrefix?.(file) ?? undefined;\n const content = renderCustomMetadata?.(file) ?? undefined;\n this.headerPrefix = this.upsertHeaderSlotElement(\n container,\n this.headerPrefix,\n HEADER_PREFIX_SLOT_ID,\n prefix\n );\n this.headerMetadata = this.upsertHeaderSlotElement(\n container,\n this.headerMetadata,\n HEADER_METADATA_SLOT_ID,\n content\n );\n this.headerCustom?.remove();\n this.headerCustom = undefined;\n }\n }\n\n private clearHeaderSlots(): void {\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n }\n\n // Header slot callbacks are presence-based render hooks, not reactive views.\n private upsertHeaderSlotElement(\n container: HTMLElement,\n current: HTMLElement | undefined,\n slot: string,\n content: Element | string | number | undefined\n ): HTMLElement | undefined {\n if (content == null) {\n current?.remove();\n return undefined;\n }\n const element = current ?? this.createHeaderSlotElement(slot);\n if (current == null) {\n container.appendChild(element);\n }\n this.replaceHeaderSlotContent(element, content);\n return element;\n }\n\n private replaceHeaderSlotContent(\n element: HTMLElement,\n content: Element | string | number\n ): void {\n element.replaceChildren();\n if (content instanceof Element) {\n element.appendChild(content);\n } else {\n element.innerText = `${content}`;\n }\n }\n\n private createHeaderSlotElement(slot: string): HTMLElement {\n const element = document.createElement('div');\n element.slot = slot;\n return element;\n }\n\n protected getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n this.appliedPreAttributes = undefined;\n this.code = undefined;\n shadowRoot.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== shadowRoot) {\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n return this.pre;\n }\n\n private syncCodeNodeFromPre(pre: HTMLPreElement): void {\n this.code = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if (child.hasAttribute('data-code')) {\n this.code = child;\n return;\n }\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines }: FileRenderResult\n ): void {\n const { overflow = 'scroll', disableLineNumbers = false } = this.options;\n const preProperties: PrePropertiesConfig = {\n type: 'file',\n split: false,\n overflow,\n disableLineNumbers,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n const pre = this.getOrCreatePreNode(container);\n pre.innerHTML = '';\n pre.remove();\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.innerHTML = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.remove();\n this.errorWrapper = undefined;\n }\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n file: FileContents | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && file != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n file: FileContents | undefined,\n disableFileHeader: boolean = false\n): boolean {\n return headerElement == null && file != null && !disableFileHeader;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"File.js","names":["EMPTY_STRINGS: string[]","options: FileOptions<LAnnotation>","workerManager?: WorkerPoolManager | undefined","error: unknown","preProperties: PrePropertiesConfig"],"sources":["../../src/components/File.ts"],"sourcesContent":["import type { Element as HASTElement } from 'hast';\nimport { toHtml } from 'hast-util-to-html';\n\nimport {\n CUSTOM_HEADER_SLOT_ID,\n DEFAULT_THEMES,\n DIFFS_TAG_NAME,\n EMPTY_RENDER_RANGE,\n HEADER_METADATA_SLOT_ID,\n HEADER_PREFIX_SLOT_ID,\n THEME_CSS_ATTRIBUTE,\n UNSAFE_CSS_ATTRIBUTE,\n} from '../constants';\nimport {\n type GetHoveredLineResult,\n InteractionManager,\n type InteractionManagerBaseOptions,\n pluckInteractionOptions,\n type SelectedLineRange,\n type SelectionWriteOptions,\n} from '../managers/InteractionManager';\nimport { ResizeManager } from '../managers/ResizeManager';\nimport { FileRenderer, type FileRenderResult } from '../renderers/FileRenderer';\nimport { SVGSpriteSheet } from '../sprite';\nimport type {\n AppliedThemeStyleCache,\n BaseCodeOptions,\n FileContents,\n LineAnnotation,\n PrePropertiesConfig,\n RenderFileMetadata,\n RenderRange,\n ThemeTypes,\n} from '../types';\nimport { areFilesEqual } from '../utils/areFilesEqual';\nimport { areLineAnnotationsEqual } from '../utils/areLineAnnotationsEqual';\nimport { arePrePropertiesEqual } from '../utils/arePrePropertiesEqual';\nimport { areRenderRangesEqual } from '../utils/areRenderRangesEqual';\nimport { areThemesEqual } from '../utils/areThemesEqual';\nimport { createAnnotationWrapperNode } from '../utils/createAnnotationWrapperNode';\nimport { createGutterUtilityContentNode } from '../utils/createGutterUtilityContentNode';\nimport { createUnsafeCSSStyleNode } from '../utils/createUnsafeCSSStyleNode';\nimport { wrapThemeCSS, wrapUnsafeCSS } from '../utils/cssWrappers';\nimport { getLineAnnotationName } from '../utils/getLineAnnotationName';\nimport { getOrCreateCodeNode } from '../utils/getOrCreateCodeNode';\nimport { upsertHostThemeStyle } from '../utils/hostTheme';\nimport { prerenderHTMLIfNecessary } from '../utils/prerenderHTMLIfNecessary';\nimport { setPreNodeProperties } from '../utils/setWrapperNodeProps';\nimport type { WorkerPoolManager } from '../worker';\nimport { DiffsContainerLoaded } from './web-components';\n\nconst EMPTY_STRINGS: string[] = [];\n\nexport interface FileRenderProps<LAnnotation> {\n file: FileContents;\n fileContainer?: HTMLElement;\n containerWrapper?: HTMLElement;\n deferManagers?: boolean;\n forceRender?: boolean;\n preventEmit?: boolean;\n lineAnnotations?: LineAnnotation<LAnnotation>[];\n renderRange?: RenderRange;\n}\n\nexport interface FileHydrateProps<LAnnotation> extends Omit<\n FileRenderProps<LAnnotation>,\n 'fileContainer'\n> {\n fileContainer: HTMLElement;\n prerenderedHTML?: string;\n}\n\nexport interface FileOptions<LAnnotation>\n extends BaseCodeOptions, InteractionManagerBaseOptions<'file'> {\n disableFileHeader?: boolean;\n renderHeaderPrefix?: RenderFileMetadata;\n renderHeaderMetadata?: RenderFileMetadata;\n renderCustomHeader?: RenderFileMetadata;\n /**\n * When true, errors during rendering are rethrown instead of being caught\n * and displayed in the DOM. Useful for testing or when you want to handle\n * errors yourself.\n */\n disableErrorHandling?: boolean;\n renderAnnotation?(\n annotation: LineAnnotation<LAnnotation>\n ): HTMLElement | undefined;\n renderGutterUtility?(\n getHoveredRow: () => GetHoveredLineResult<'file'> | undefined\n ): HTMLElement | null | undefined;\n\n onPostRender?(node: HTMLElement, instance: File<LAnnotation>): unknown;\n}\n\ninterface AnnotationElementCache<LAnnotation> {\n element: HTMLElement;\n annotation: LineAnnotation<LAnnotation>;\n}\n\ninterface ColumnElements {\n gutter: HTMLElement;\n content: HTMLElement;\n}\n\ninterface HydrationSetup<LAnnotation> {\n file: FileContents;\n lineAnnotations: LineAnnotation<LAnnotation>[] | undefined;\n}\n\nlet instanceId = -1;\n\nexport class File<LAnnotation = undefined> {\n static LoadedCustomComponent: boolean = DiffsContainerLoaded;\n\n readonly __id: string = `file:${++instanceId}`;\n\n protected fileContainer: HTMLElement | undefined;\n protected spriteSVG: SVGElement | undefined;\n protected pre: HTMLPreElement | undefined;\n protected code: HTMLElement | undefined;\n protected bufferBefore: HTMLElement | undefined;\n protected bufferAfter: HTMLElement | undefined;\n protected themeCSSStyle: HTMLStyleElement | undefined;\n protected appliedThemeCSS: AppliedThemeStyleCache | undefined;\n protected unsafeCSSStyle: HTMLStyleElement | undefined;\n protected appliedUnsafeCSS: string | undefined;\n protected gutterUtilityContent: HTMLElement | undefined;\n protected errorWrapper: HTMLElement | undefined;\n protected placeHolder: HTMLElement | undefined;\n protected lastRenderedHeaderHTML: string | undefined;\n protected appliedPreAttributes: PrePropertiesConfig | undefined;\n protected lastRowCount: number | undefined;\n\n protected headerElement: HTMLElement | undefined;\n protected headerCustom: HTMLElement | undefined;\n protected headerPrefix: HTMLElement | undefined;\n protected headerMetadata: HTMLElement | undefined;\n\n protected fileRenderer: FileRenderer<LAnnotation>;\n protected resizeManager: ResizeManager;\n protected interactionManager: InteractionManager<'file'>;\n\n protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>> =\n new Map();\n protected lineAnnotations: LineAnnotation<LAnnotation>[] = [];\n protected managersDirty = false;\n\n protected file: FileContents | undefined;\n protected renderRange: RenderRange | undefined;\n protected enabled = true;\n\n constructor(\n public options: FileOptions<LAnnotation> = { theme: DEFAULT_THEMES },\n private workerManager?: WorkerPoolManager | undefined,\n private isContainerManaged = false\n ) {\n this.fileRenderer = new FileRenderer<LAnnotation>(\n options,\n this.handleHighlightRender,\n this.workerManager\n );\n this.resizeManager = new ResizeManager();\n this.interactionManager = new InteractionManager(\n 'file',\n pluckInteractionOptions(options)\n );\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n private handleHighlightRender = (): void => {\n this.rerender();\n };\n\n public rerender(): void {\n if (!this.enabled || this.file == null) return;\n this.render({\n file: this.file,\n forceRender: true,\n renderRange: this.renderRange,\n });\n }\n\n public setOptions(options: FileOptions<LAnnotation> | undefined): void {\n if (options == null) return;\n this.options = options;\n this.interactionManager.setOptions(pluckInteractionOptions(options));\n }\n\n private mergeOptions(options: Partial<FileOptions<LAnnotation>>): void {\n this.options = { ...this.options, ...options };\n }\n\n public setThemeType(themeType: ThemeTypes): void {\n if ((this.options.themeType ?? 'system') === themeType) {\n return;\n }\n this.mergeOptions({ themeType });\n this.applyCachedThemeState(themeType);\n }\n\n private applyCachedThemeState(themeType: ThemeTypes): boolean {\n if (\n typeof this.options.theme === 'string' ||\n this.fileContainer == null ||\n this.appliedThemeCSS == null\n ) {\n return false;\n }\n const effectiveThemeType = this.appliedThemeCSS.baseThemeType ?? themeType;\n if (this.appliedThemeCSS.themeType === effectiveThemeType) {\n return false;\n }\n this.applyThemeState(\n this.fileContainer,\n this.appliedThemeCSS.themeStyles,\n themeType,\n this.appliedThemeCSS.baseThemeType\n );\n return true;\n }\n\n private hasThemeChanged(): boolean {\n return (\n this.appliedThemeCSS != null &&\n !areThemesEqual(\n this.appliedThemeCSS.theme,\n this.options.theme ?? DEFAULT_THEMES\n )\n );\n }\n\n public getHoveredLine = (): GetHoveredLineResult<'file'> | undefined => {\n return this.interactionManager.getHoveredLine();\n };\n\n public setLineAnnotations(\n lineAnnotations: LineAnnotation<LAnnotation>[]\n ): void {\n this.lineAnnotations = lineAnnotations;\n }\n\n public setSelectedLines(\n range: SelectedLineRange | null,\n options?: SelectionWriteOptions\n ): void {\n this.interactionManager.setSelection(range, options);\n }\n\n public flushManagers(): void {\n if (!this.managersDirty || this.pre == null) {\n this.managersDirty = false;\n return;\n }\n\n const { overflow = 'scroll' } = this.options;\n this.interactionManager.setup(this.pre);\n this.resizeManager.setup(this.pre, overflow === 'wrap');\n this.managersDirty = false;\n }\n\n public cleanUp(recycle = false): void {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n this.managersDirty = false;\n this.workerManager?.unsubscribeToThemeChanges(this);\n this.renderRange = undefined;\n\n // Clean up the elements\n if (!this.isContainerManaged) {\n this.fileContainer?.remove();\n }\n this.fileContainer = undefined;\n this.lineAnnotations = [];\n this.annotationCache.clear();\n this.pre = undefined;\n this.bufferBefore = undefined;\n this.bufferAfter = undefined;\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n this.headerElement = undefined;\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.lastRenderedHeaderHTML = undefined;\n this.errorWrapper = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n this.placeHolder = undefined;\n this.unsafeCSSStyle = undefined;\n\n if (!recycle) {\n this.fileRenderer.cleanUp();\n this.workerManager = undefined;\n this.file = undefined;\n }\n\n this.enabled = false;\n }\n\n public virtualizedSetup(): void {\n this.enabled = true;\n this.workerManager?.subscribeToThemeChanges(this);\n }\n\n public hydrate(props: FileHydrateProps<LAnnotation>): void {\n const {\n fileContainer,\n prerenderedHTML,\n preventEmit = false,\n file,\n lineAnnotations,\n } = props;\n this.hydrateElements(fileContainer, prerenderedHTML);\n if (\n shouldRenderCode(this.pre, file, this.options.collapsed) ||\n shouldRenderHeader(\n this.headerElement,\n file,\n this.options.disableFileHeader\n )\n ) {\n this.render({ ...props, preventEmit: true });\n }\n // Otherwise orchestrate our setup.\n else {\n this.hydrationSetup({ file, lineAnnotations });\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n }\n\n protected hydrateElements(\n fileContainer: HTMLElement,\n prerenderedHTML: string | undefined\n ): void {\n prerenderHTMLIfNecessary(fileContainer, prerenderedHTML);\n for (const element of Array.from(\n fileContainer.shadowRoot?.children ?? []\n )) {\n if (element instanceof SVGElement) {\n this.spriteSVG = element;\n continue;\n }\n if (!(element instanceof HTMLElement)) {\n continue;\n }\n if (element instanceof HTMLPreElement) {\n this.pre = element;\n this.appliedPreAttributes = undefined;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(THEME_CSS_ATTRIBUTE)\n ) {\n this.themeCSSStyle = element;\n continue;\n }\n if (\n element instanceof HTMLStyleElement &&\n element.hasAttribute(UNSAFE_CSS_ATTRIBUTE)\n ) {\n this.unsafeCSSStyle = element;\n this.appliedUnsafeCSS = element.textContent;\n continue;\n }\n if ('diffsHeader' in element.dataset) {\n this.headerElement = element;\n this.lastRenderedHeaderHTML = undefined;\n continue;\n }\n }\n if (this.pre != null) {\n this.syncCodeNodeFromPre(this.pre);\n this.pre.removeAttribute('data-dehydrated');\n }\n this.fileContainer = fileContainer;\n }\n\n protected hydrationSetup({\n file,\n lineAnnotations,\n }: HydrationSetup<LAnnotation>): void {\n this.lineAnnotations = lineAnnotations ?? this.lineAnnotations;\n this.file = file;\n this.fileRenderer.setOptions({\n ...this.options,\n headerRenderMode:\n this.options.renderCustomHeader != null ? 'custom' : 'default',\n });\n if (this.pre == null) {\n return;\n }\n this.fileRenderer.hydrate(file);\n this.renderAnnotations();\n this.renderGutterUtility();\n this.injectUnsafeCSS();\n this.managersDirty = true;\n this.flushManagers();\n }\n\n public getOrCreateLineCache(\n file: FileContents | undefined = this.file\n ): string[] {\n return file != null\n ? this.fileRenderer.getOrCreateLineCache(file)\n : EMPTY_STRINGS;\n }\n\n public render({\n file,\n fileContainer,\n forceRender = false,\n preventEmit = false,\n containerWrapper,\n deferManagers = false,\n lineAnnotations,\n renderRange,\n }: FileRenderProps<LAnnotation>): boolean {\n const { collapsed = false, themeType = 'system' } = this.options;\n if (!this.enabled) {\n throw new Error(\n 'File.render: attempting to call render after cleaned up'\n );\n }\n const nextRenderRange = collapsed ? undefined : renderRange;\n const previousRenderRange = this.renderRange;\n const themeChanged = this.hasThemeChanged();\n const annotationsChanged =\n lineAnnotations != null &&\n (lineAnnotations.length > 0 || this.lineAnnotations.length > 0)\n ? lineAnnotations !== this.lineAnnotations\n : false;\n const didFileChange = !areFilesEqual(this.file, file);\n if (\n !collapsed &&\n !forceRender &&\n areRenderRangesEqual(nextRenderRange, this.renderRange) &&\n !didFileChange &&\n !annotationsChanged &&\n !themeChanged\n ) {\n return this.applyCachedThemeState(themeType);\n }\n\n this.renderRange = nextRenderRange;\n this.file = file;\n this.fileRenderer.setOptions({\n ...this.options,\n headerRenderMode:\n this.options.renderCustomHeader != null ? 'custom' : 'default',\n });\n if (lineAnnotations != null) {\n this.setLineAnnotations(lineAnnotations);\n }\n this.fileRenderer.setLineAnnotations(this.lineAnnotations);\n\n const { disableErrorHandling = false, disableFileHeader = false } =\n this.options;\n if (disableFileHeader) {\n // Remove existing header from DOM\n if (this.headerElement != null) {\n this.headerElement.remove();\n this.headerElement = undefined;\n this.lastRenderedHeaderHTML = undefined;\n }\n this.clearHeaderSlots();\n }\n\n fileContainer = this.getOrCreateFileContainerNode(\n fileContainer,\n containerWrapper\n );\n this.applyCachedThemeState(themeType);\n\n if (collapsed) {\n this.removeRenderedCode();\n this.clearAuxiliaryNodes();\n\n try {\n const fileResult = this.fileRenderer.renderFile(\n file,\n EMPTY_RENDER_RANGE\n );\n if (fileResult != null) {\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n }\n if (fileResult?.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n this.injectUnsafeCSS();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n try {\n const pre = this.getOrCreatePreNode(fileContainer);\n if (\n !this.canPartiallyRender(\n forceRender,\n annotationsChanged,\n didFileChange || themeChanged\n ) ||\n !this.applyPartialRender(previousRenderRange, nextRenderRange)\n ) {\n const fileResult = this.fileRenderer.renderFile(file, nextRenderRange);\n if (fileResult == null) {\n if (this.workerManager?.isInitialized() === false) {\n void this.workerManager.initialize().then(() => this.rerender());\n }\n return false;\n }\n this.applyThemeState(\n fileContainer,\n fileResult.themeStyles,\n themeType,\n fileResult.baseThemeType\n );\n if (fileResult.headerAST != null) {\n this.applyHeaderToDOM(fileResult.headerAST, fileContainer);\n }\n this.applyFullRender(fileResult, pre);\n }\n\n this.applyBuffers(pre, nextRenderRange);\n this.injectUnsafeCSS();\n this.managersDirty = true;\n if (!deferManagers) {\n this.flushManagers();\n }\n this.renderAnnotations();\n this.renderGutterUtility();\n } catch (error: unknown) {\n if (disableErrorHandling) {\n throw error;\n }\n console.error(error);\n if (error instanceof Error) {\n this.applyErrorToDOM(error, fileContainer);\n }\n }\n if (!preventEmit) {\n this.emitPostRender();\n }\n return true;\n }\n\n private emitPostRender() {\n if (this.fileContainer != null) {\n this.options.onPostRender?.(this.fileContainer, this);\n }\n }\n\n private removeRenderedCode(): void {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferBefore?.remove();\n this.bufferBefore = undefined;\n this.bufferAfter?.remove();\n this.bufferAfter = undefined;\n\n this.code?.remove();\n this.code = undefined;\n\n this.pre?.remove();\n this.pre = undefined;\n\n this.appliedPreAttributes = undefined;\n this.lastRowCount = undefined;\n }\n\n private clearAuxiliaryNodes(): void {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n }\n\n private canPartiallyRender(\n forceRender: boolean,\n annotationsChanged: boolean,\n didContentChange: boolean\n ): boolean {\n if (forceRender || annotationsChanged || didContentChange) {\n return false;\n }\n return true;\n }\n\n public renderPlaceholder(height: number): boolean {\n if (this.fileContainer == null) {\n return false;\n }\n this.cleanChildNodes();\n\n if (this.placeHolder == null) {\n const shadowRoot =\n this.fileContainer.shadowRoot ??\n this.fileContainer.attachShadow({ mode: 'open' });\n this.placeHolder = document.createElement('div');\n this.placeHolder.dataset.placeholder = '';\n shadowRoot.appendChild(this.placeHolder);\n }\n this.placeHolder.style.setProperty('height', `${height}px`);\n return true;\n }\n\n private cleanChildNodes() {\n this.resizeManager.cleanUp();\n this.interactionManager.cleanUp();\n\n this.bufferAfter?.remove();\n this.bufferBefore?.remove();\n this.code?.remove();\n this.errorWrapper?.remove();\n this.headerElement?.remove();\n this.gutterUtilityContent?.remove();\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.pre?.remove();\n this.spriteSVG?.remove();\n this.themeCSSStyle?.remove();\n this.unsafeCSSStyle?.remove();\n\n this.bufferAfter = undefined;\n this.bufferBefore = undefined;\n this.code = undefined;\n this.errorWrapper = undefined;\n this.headerElement = undefined;\n this.gutterUtilityContent = undefined;\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n this.pre = undefined;\n this.spriteSVG = undefined;\n this.themeCSSStyle = undefined;\n this.appliedThemeCSS = undefined;\n this.unsafeCSSStyle = undefined;\n this.appliedUnsafeCSS = undefined;\n\n this.lastRenderedHeaderHTML = undefined;\n this.lastRowCount = undefined;\n }\n\n private renderAnnotations(): void {\n if (this.isContainerManaged || this.fileContainer == null) {\n for (const { element } of this.annotationCache.values()) {\n element.remove();\n }\n this.annotationCache.clear();\n return;\n }\n const staleAnnotations = new Map(this.annotationCache);\n const { renderAnnotation } = this.options;\n if (renderAnnotation != null && this.lineAnnotations.length > 0) {\n for (const [index, annotation] of this.lineAnnotations.entries()) {\n const id = `${index}-${getLineAnnotationName(annotation)}`;\n let cache = this.annotationCache.get(id);\n if (\n cache == null ||\n !areLineAnnotationsEqual(annotation, cache.annotation)\n ) {\n cache?.element.remove();\n const content = renderAnnotation(annotation);\n // If we can't render anything, then we should not render anything\n // and clear the annotation cache if necessary.\n if (content == null) {\n continue;\n }\n cache = {\n element: createAnnotationWrapperNode(\n getLineAnnotationName(annotation)\n ),\n annotation,\n };\n cache.element.appendChild(content);\n this.fileContainer.appendChild(cache.element);\n this.annotationCache.set(id, cache);\n }\n staleAnnotations.delete(id);\n }\n }\n for (const [id, { element }] of staleAnnotations.entries()) {\n this.annotationCache.delete(id);\n element.remove();\n }\n }\n\n private renderGutterUtility() {\n const { renderGutterUtility } = this.options;\n if (this.fileContainer == null || renderGutterUtility == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const element = renderGutterUtility(this.interactionManager.getHoveredLine);\n if (element != null && this.gutterUtilityContent != null) {\n return;\n } else if (element == null) {\n this.gutterUtilityContent?.remove();\n this.gutterUtilityContent = undefined;\n return;\n }\n const gutterUtilityContent = createGutterUtilityContentNode();\n gutterUtilityContent.appendChild(element);\n this.fileContainer.appendChild(gutterUtilityContent);\n this.gutterUtilityContent = gutterUtilityContent;\n }\n\n private injectUnsafeCSS(): void {\n const { unsafeCSS } = this.options;\n const shadowRoot = this.fileContainer?.shadowRoot;\n if (shadowRoot == null) {\n return;\n }\n\n if (unsafeCSS == null || unsafeCSS === '') {\n if (this.unsafeCSSStyle != null) {\n this.unsafeCSSStyle.remove();\n this.unsafeCSSStyle = undefined;\n }\n this.appliedUnsafeCSS = undefined;\n return;\n }\n\n if (\n this.unsafeCSSStyle?.parentNode === shadowRoot &&\n this.appliedUnsafeCSS === unsafeCSS\n ) {\n return;\n }\n\n // Create or update the style element\n this.unsafeCSSStyle ??= createUnsafeCSSStyleNode();\n if (this.unsafeCSSStyle.parentNode !== shadowRoot) {\n shadowRoot.appendChild(this.unsafeCSSStyle);\n }\n // Wrap in @layer unsafe to match SSR behavior\n this.unsafeCSSStyle.textContent = wrapUnsafeCSS(unsafeCSS);\n this.appliedUnsafeCSS = unsafeCSS;\n }\n\n private applyThemeState(\n container: HTMLElement,\n themeStyles: string,\n themeType: ThemeTypes,\n baseThemeType?: 'light' | 'dark'\n ): void {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n const effectiveThemeType = baseThemeType ?? themeType;\n const currentTheme = this.options.theme ?? DEFAULT_THEMES;\n const theme =\n typeof currentTheme === 'string' ? currentTheme : { ...currentTheme };\n if (\n this.themeCSSStyle?.parentNode === shadowRoot &&\n this.appliedThemeCSS?.themeStyles === themeStyles &&\n this.appliedThemeCSS.themeType === effectiveThemeType\n ) {\n this.appliedThemeCSS.theme = theme;\n return;\n }\n this.themeCSSStyle = upsertHostThemeStyle({\n shadowRoot,\n currentNode: this.themeCSSStyle,\n themeCSS: wrapThemeCSS(themeStyles, effectiveThemeType),\n });\n this.appliedThemeCSS =\n this.themeCSSStyle != null\n ? {\n theme,\n themeStyles,\n themeType: effectiveThemeType,\n baseThemeType,\n }\n : undefined;\n }\n\n private applyFullRender(result: FileRenderResult, pre: HTMLPreElement): void {\n this.cleanupErrorWrapper();\n this.applyPreNodeAttributes(pre, result);\n this.code = getOrCreateCodeNode({ code: this.code });\n this.code.innerHTML = this.fileRenderer.renderPartialHTML(\n this.fileRenderer.renderCodeAST(result)\n );\n pre.replaceChildren(this.code);\n this.lastRowCount = result.rowCount;\n }\n\n private applyPartialRender(\n previousRenderRange: RenderRange | undefined,\n renderRange: RenderRange | undefined\n ): boolean {\n if (previousRenderRange == null || renderRange == null) {\n return false;\n }\n const { file, code } = this;\n const columns = code != null ? this.getColumns(code) : undefined;\n if (file == null || code == null || columns == null) {\n return false;\n }\n\n const previousStart = previousRenderRange.startingLine;\n const nextStart = renderRange.startingLine;\n const previousEnd =\n previousRenderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : previousStart + previousRenderRange.totalLines;\n const nextEnd =\n renderRange.totalLines === Infinity\n ? Number.POSITIVE_INFINITY\n : nextStart + renderRange.totalLines;\n\n const overlapStart = Math.max(previousStart, nextStart);\n const overlapEnd = Math.min(previousEnd, nextEnd);\n if (overlapEnd <= overlapStart) {\n return false;\n }\n\n if (\n !this.trimDOMToOverlap(columns.gutter, overlapStart, overlapEnd) ||\n !this.trimDOMToOverlap(columns.content, overlapStart, overlapEnd)\n ) {\n return false;\n }\n\n let { length: rowCount } = columns.content.children;\n\n const renderChunk = (\n startingLine: number,\n totalLines: number\n ): FileRenderResult | undefined => {\n if (totalLines <= 0) {\n return undefined;\n }\n return this.fileRenderer.renderFile(file, {\n startingLine,\n totalLines,\n bufferBefore: 0,\n bufferAfter: 0,\n });\n };\n\n const prependResult =\n nextStart < overlapStart\n ? renderChunk(nextStart, overlapStart - nextStart)\n : undefined;\n if (prependResult === undefined && nextStart < overlapStart) {\n return false;\n }\n\n const appendTotalLines =\n nextEnd === Number.POSITIVE_INFINITY\n ? Number.POSITIVE_INFINITY\n : Math.max(0, nextEnd - overlapEnd);\n const appendResult =\n nextEnd > overlapEnd\n ? renderChunk(overlapEnd, appendTotalLines)\n : undefined;\n if (appendResult === undefined && nextEnd > overlapEnd) {\n return false;\n }\n\n this.cleanupErrorWrapper();\n if (prependResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'afterbegin',\n this.fileRenderer.renderPartialHTML(prependResult.contentAST)\n );\n rowCount += prependResult.rowCount;\n }\n\n if (appendResult != null) {\n columns.gutter.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.gutterAST)\n );\n columns.content.insertAdjacentHTML(\n 'beforeend',\n this.fileRenderer.renderPartialHTML(appendResult.contentAST)\n );\n rowCount += appendResult.rowCount;\n }\n\n if (this.lastRowCount !== rowCount) {\n columns.gutter.style.setProperty('grid-row', `span ${rowCount}`);\n columns.content.style.setProperty('grid-row', `span ${rowCount}`);\n this.lastRowCount = rowCount;\n }\n\n return true;\n }\n\n private getColumns(code: HTMLElement): ColumnElements | undefined {\n const gutter = code.children[0];\n const content = code.children[1];\n if (\n !(gutter instanceof HTMLElement) ||\n !(content instanceof HTMLElement) ||\n gutter.dataset.gutter == null ||\n content.dataset.content == null\n ) {\n return undefined;\n }\n return { gutter, content };\n }\n\n private trimDOMToOverlap(\n container: HTMLElement,\n overlapStart: number,\n overlapEnd: number\n ): boolean {\n const boundaryIndices = this.getDOMBoundaryIndices(container, [\n overlapStart,\n overlapEnd,\n ]);\n const startIndex =\n boundaryIndices.get(overlapStart) ?? container.children.length;\n const endIndex =\n boundaryIndices.get(overlapEnd) ?? container.children.length;\n\n if (startIndex > endIndex) {\n return false;\n }\n\n for (let i = container.children.length - 1; i >= endIndex; i -= 1) {\n container.children[i]?.remove();\n }\n for (let i = startIndex - 1; i >= 0; i -= 1) {\n container.children[i]?.remove();\n }\n return true;\n }\n\n private getDOMBoundaryIndices(\n container: HTMLElement,\n boundaries: number[]\n ): Map<number, number> {\n const sortedBoundaries = [...new Set(boundaries)].sort((a, b) => a - b);\n const boundaryIndices = new Map<number, number>();\n if (sortedBoundaries.length === 0) {\n return boundaryIndices;\n }\n let boundaryIndex = 0;\n let nextBoundary = sortedBoundaries[boundaryIndex];\n const { children } = container;\n\n for (let i = 0; i < children.length; i += 1) {\n const child = children[i];\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n const lineIndex = this.getLineIndexFromDOMNode(child);\n if (lineIndex == null) {\n continue;\n }\n while (nextBoundary != null && lineIndex >= nextBoundary) {\n boundaryIndices.set(nextBoundary, i);\n boundaryIndex += 1;\n nextBoundary = sortedBoundaries[boundaryIndex];\n }\n if (boundaryIndex >= sortedBoundaries.length) {\n break;\n }\n }\n\n for (const boundary of sortedBoundaries) {\n if (!boundaryIndices.has(boundary)) {\n boundaryIndices.set(boundary, children.length);\n }\n }\n return boundaryIndices;\n }\n\n private getLineIndexFromDOMNode(node: HTMLElement): number | undefined {\n const lineIndexAttr = node.dataset.lineIndex;\n if (lineIndexAttr == null) {\n return undefined;\n }\n const parsed = Number(lineIndexAttr);\n return Number.isNaN(parsed) ? undefined : parsed;\n }\n\n private applyBuffers(\n pre: HTMLPreElement,\n renderRange: RenderRange | undefined\n ) {\n if (renderRange == null || this.shouldDisableVirtualizationBuffers()) {\n if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n return;\n }\n\n if (renderRange.bufferBefore > 0) {\n if (this.bufferBefore == null) {\n this.bufferBefore = document.createElement('div');\n this.bufferBefore.dataset.virtualizerBuffer = 'before';\n pre.before(this.bufferBefore);\n }\n this.bufferBefore.style.setProperty(\n 'height',\n `${renderRange.bufferBefore}px`\n );\n this.bufferBefore.style.setProperty('contain', 'strict');\n } else if (this.bufferBefore != null) {\n this.bufferBefore.remove();\n this.bufferBefore = undefined;\n }\n\n if (renderRange.bufferAfter > 0) {\n if (this.bufferAfter == null) {\n this.bufferAfter = document.createElement('div');\n this.bufferAfter.dataset.virtualizerBuffer = 'after';\n pre.after(this.bufferAfter);\n }\n this.bufferAfter.style.setProperty(\n 'height',\n `${renderRange.bufferAfter}px`\n );\n this.bufferAfter.style.setProperty('contain', 'strict');\n } else if (this.bufferAfter != null) {\n this.bufferAfter.remove();\n this.bufferAfter = undefined;\n }\n }\n\n protected shouldDisableVirtualizationBuffers(): boolean {\n return this.options.disableVirtualizationBuffers ?? false;\n }\n\n private applyHeaderToDOM(\n headerAST: HASTElement,\n container: HTMLElement\n ): void {\n const { file } = this;\n if (file == null) return;\n this.cleanupErrorWrapper();\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n const headerHTML = toHtml(headerAST);\n if (headerHTML !== this.lastRenderedHeaderHTML) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = headerHTML;\n const newHeader = tempDiv.firstElementChild;\n if (!(newHeader instanceof HTMLElement)) {\n return;\n }\n if (this.headerElement != null) {\n container.shadowRoot?.replaceChild(newHeader, this.headerElement);\n } else {\n container.shadowRoot?.prepend(newHeader);\n }\n this.headerElement = newHeader;\n this.lastRenderedHeaderHTML = headerHTML;\n }\n\n if (this.isContainerManaged) return;\n\n const { renderHeaderPrefix, renderCustomHeader, renderHeaderMetadata } =\n this.options;\n\n if (renderCustomHeader != null) {\n const content = renderCustomHeader(file) ?? undefined;\n this.headerCustom = this.upsertHeaderSlotElement(\n container,\n this.headerCustom,\n CUSTOM_HEADER_SLOT_ID,\n content\n );\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n } else {\n const prefix = renderHeaderPrefix?.(file) ?? undefined;\n const content = renderHeaderMetadata?.(file) ?? undefined;\n this.headerPrefix = this.upsertHeaderSlotElement(\n container,\n this.headerPrefix,\n HEADER_PREFIX_SLOT_ID,\n prefix\n );\n this.headerMetadata = this.upsertHeaderSlotElement(\n container,\n this.headerMetadata,\n HEADER_METADATA_SLOT_ID,\n content\n );\n this.headerCustom?.remove();\n this.headerCustom = undefined;\n }\n }\n\n private clearHeaderSlots(): void {\n this.headerPrefix?.remove();\n this.headerMetadata?.remove();\n this.headerCustom?.remove();\n this.headerPrefix = undefined;\n this.headerMetadata = undefined;\n this.headerCustom = undefined;\n }\n\n // Header slot callbacks are presence-based render hooks, not reactive views.\n private upsertHeaderSlotElement(\n container: HTMLElement,\n current: HTMLElement | undefined,\n slot: string,\n content: Element | string | number | undefined\n ): HTMLElement | undefined {\n if (content == null) {\n current?.remove();\n return undefined;\n }\n const element = current ?? this.createHeaderSlotElement(slot);\n if (current == null) {\n container.appendChild(element);\n }\n this.replaceHeaderSlotContent(element, content);\n return element;\n }\n\n private replaceHeaderSlotContent(\n element: HTMLElement,\n content: Element | string | number\n ): void {\n element.replaceChildren();\n if (content instanceof Element) {\n element.appendChild(content);\n } else {\n element.innerText = `${content}`;\n }\n }\n\n private createHeaderSlotElement(slot: string): HTMLElement {\n const element = document.createElement('div');\n element.slot = slot;\n return element;\n }\n\n protected getOrCreateFileContainerNode(\n fileContainer?: HTMLElement,\n parentNode?: HTMLElement\n ): HTMLElement {\n const previousContainer = this.fileContainer;\n this.fileContainer =\n fileContainer ??\n this.fileContainer ??\n document.createElement(DIFFS_TAG_NAME);\n if (previousContainer != null && previousContainer !== this.fileContainer) {\n this.lastRenderedHeaderHTML = undefined;\n this.headerElement = undefined;\n }\n if (parentNode != null && this.fileContainer.parentNode !== parentNode) {\n parentNode.appendChild(this.fileContainer);\n }\n if (this.spriteSVG == null) {\n const fragment = document.createElement('div');\n fragment.innerHTML = SVGSpriteSheet;\n const firstChild = fragment.firstChild;\n if (firstChild instanceof SVGElement) {\n this.spriteSVG = firstChild;\n this.fileContainer.shadowRoot?.appendChild(this.spriteSVG);\n }\n }\n return this.fileContainer;\n }\n\n private getOrCreatePreNode(container: HTMLElement): HTMLPreElement {\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n // If we haven't created a pre element yet, lets go ahead and do that\n if (this.pre == null) {\n this.pre = document.createElement('pre');\n this.appliedPreAttributes = undefined;\n this.code = undefined;\n shadowRoot.appendChild(this.pre);\n }\n // If we have a new parent container for the pre element, lets go ahead and\n // move it into the new container\n else if (this.pre.parentNode !== shadowRoot) {\n container.shadowRoot?.appendChild(this.pre);\n this.appliedPreAttributes = undefined;\n }\n\n this.placeHolder?.remove();\n this.placeHolder = undefined;\n\n return this.pre;\n }\n\n private syncCodeNodeFromPre(pre: HTMLPreElement): void {\n this.code = undefined;\n for (const child of Array.from(pre.children)) {\n if (!(child instanceof HTMLElement)) {\n continue;\n }\n if (child.hasAttribute('data-code')) {\n this.code = child;\n return;\n }\n }\n }\n\n private applyPreNodeAttributes(\n pre: HTMLPreElement,\n { totalLines }: FileRenderResult\n ): void {\n const { overflow = 'scroll', disableLineNumbers = false } = this.options;\n const preProperties: PrePropertiesConfig = {\n type: 'file',\n split: false,\n overflow,\n disableLineNumbers,\n diffIndicators: 'none',\n disableBackground: true,\n totalLines,\n };\n if (arePrePropertiesEqual(preProperties, this.appliedPreAttributes)) {\n return;\n }\n setPreNodeProperties(pre, preProperties);\n this.appliedPreAttributes = preProperties;\n }\n\n private applyErrorToDOM(error: Error, container: HTMLElement) {\n this.cleanupErrorWrapper();\n this.pre?.remove();\n this.pre = undefined;\n this.appliedPreAttributes = undefined;\n const shadowRoot =\n container.shadowRoot ?? container.attachShadow({ mode: 'open' });\n this.errorWrapper ??= document.createElement('div');\n this.errorWrapper.dataset.errorWrapper = '';\n this.errorWrapper.textContent = '';\n shadowRoot.appendChild(this.errorWrapper);\n const errorMessage = document.createElement('div');\n errorMessage.dataset.errorMessage = '';\n errorMessage.innerText = error.message;\n this.errorWrapper.appendChild(errorMessage);\n const errorStack = document.createElement('pre');\n errorStack.dataset.errorStack = '';\n errorStack.innerText = error.stack ?? 'No Error Stack';\n this.errorWrapper.appendChild(errorStack);\n }\n\n private cleanupErrorWrapper() {\n this.errorWrapper?.remove();\n this.errorWrapper = undefined;\n }\n}\n\nfunction shouldRenderCode(\n pre: HTMLPreElement | undefined,\n file: FileContents | undefined,\n collapsed = false\n): boolean {\n return !collapsed && pre == null && file != null;\n}\n\nfunction shouldRenderHeader(\n headerElement: HTMLElement | undefined,\n file: FileContents | undefined,\n disableFileHeader: boolean = false\n): boolean {\n return headerElement == null && file != null && !disableFileHeader;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AnnotationSide, AppliedThemeStyleCache, BaseDiffOptions, CustomPreProperties, DiffLineAnnotation, ExpansionDirections, FileContents, FileDiffMetadata, HunkData, HunkSeparators, PrePropertiesConfig, RenderHeaderMetadataCallback, RenderHeaderPrefixCallback, RenderRange, ThemeTypes } from "../types.js";
|
|
2
|
+
import { GetHoveredLineResult, GetLineIndexUtility, InteractionManager, InteractionManagerBaseOptions, SelectedLineRange, SelectionWriteOptions } from "../managers/InteractionManager.js";
|
|
2
3
|
import { WorkerPoolManager } from "../worker/WorkerPoolManager.js";
|
|
3
4
|
import "../worker/index.js";
|
|
4
|
-
import { GetHoveredLineResult, GetLineIndexUtility, InteractionManager, InteractionManagerBaseOptions, SelectedLineRange } from "../managers/InteractionManager.js";
|
|
5
5
|
import { ResizeManager } from "../managers/ResizeManager.js";
|
|
6
6
|
import { DiffHunksRenderer, DiffHunksRendererOptions, HunksRenderResult } from "../renderers/DiffHunksRenderer.js";
|
|
7
7
|
import { ScrollSyncManager } from "../managers/ScrollSyncManager.js";
|
|
@@ -12,6 +12,7 @@ interface FileDiffRenderProps<LAnnotation> {
|
|
|
12
12
|
fileDiff?: FileDiffMetadata;
|
|
13
13
|
oldFile?: FileContents;
|
|
14
14
|
newFile?: FileContents;
|
|
15
|
+
deferManagers?: boolean;
|
|
15
16
|
forceRender?: boolean;
|
|
16
17
|
preventEmit?: boolean;
|
|
17
18
|
fileContainer?: HTMLElement;
|
|
@@ -29,10 +30,6 @@ interface FileDiffOptions<LAnnotation> extends Omit<BaseDiffOptions, 'hunkSepara
|
|
|
29
30
|
* removed in a future version.
|
|
30
31
|
*/ | ((hunk: HunkData, instance: FileDiff<LAnnotation>) => HTMLElement | DocumentFragment | null | undefined);
|
|
31
32
|
disableFileHeader?: boolean;
|
|
32
|
-
/**
|
|
33
|
-
* @deprecated Use `enableGutterUtility` instead.
|
|
34
|
-
*/
|
|
35
|
-
enableHoverUtility?: boolean;
|
|
36
33
|
renderHeaderPrefix?: RenderHeaderPrefixCallback;
|
|
37
34
|
renderHeaderMetadata?: RenderHeaderMetadataCallback;
|
|
38
35
|
renderCustomHeader?: RenderHeaderMetadataCallback;
|
|
@@ -44,10 +41,6 @@ interface FileDiffOptions<LAnnotation> extends Omit<BaseDiffOptions, 'hunkSepara
|
|
|
44
41
|
disableErrorHandling?: boolean;
|
|
45
42
|
renderAnnotation?(annotation: DiffLineAnnotation<LAnnotation>): HTMLElement | undefined;
|
|
46
43
|
renderGutterUtility?(getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined): HTMLElement | null | undefined;
|
|
47
|
-
/**
|
|
48
|
-
* @deprecated Use `renderGutterUtility` instead.
|
|
49
|
-
*/
|
|
50
|
-
renderHoverUtility?(getHoveredRow: () => GetHoveredLineResult<'diff'> | undefined): HTMLElement | null | undefined;
|
|
51
44
|
onPostRender?(node: HTMLElement, instance: FileDiff<LAnnotation>): unknown;
|
|
52
45
|
}
|
|
53
46
|
interface AnnotationElementCache<LAnnotation> {
|
|
@@ -96,6 +89,7 @@ declare class FileDiff<LAnnotation = undefined> {
|
|
|
96
89
|
protected interactionManager: InteractionManager<'diff'>;
|
|
97
90
|
protected annotationCache: Map<string, AnnotationElementCache<LAnnotation>>;
|
|
98
91
|
protected lineAnnotations: DiffLineAnnotation<LAnnotation>[];
|
|
92
|
+
protected managersDirty: boolean;
|
|
99
93
|
protected deletionFile: FileContents | undefined;
|
|
100
94
|
protected additionFile: FileContents | undefined;
|
|
101
95
|
protected fileDiff: FileDiffMetadata | undefined;
|
|
@@ -112,13 +106,16 @@ declare class FileDiff<LAnnotation = undefined> {
|
|
|
112
106
|
setOptions(options: FileDiffOptions<LAnnotation> | undefined): void;
|
|
113
107
|
private mergeOptions;
|
|
114
108
|
setThemeType(themeType: ThemeTypes): void;
|
|
109
|
+
private applyCachedThemeState;
|
|
110
|
+
private hasThemeChanged;
|
|
115
111
|
getHoveredLine: () => {
|
|
116
112
|
lineNumber: number;
|
|
117
113
|
side: AnnotationSide;
|
|
118
114
|
} | undefined;
|
|
119
115
|
setLineAnnotations(lineAnnotations: DiffLineAnnotation<LAnnotation>[]): void;
|
|
120
116
|
private canPartiallyRender;
|
|
121
|
-
setSelectedLines(range: SelectedLineRange | null): void;
|
|
117
|
+
setSelectedLines(range: SelectedLineRange | null, options?: SelectionWriteOptions): void;
|
|
118
|
+
flushManagers(): void;
|
|
122
119
|
cleanUp(recycle?: boolean): void;
|
|
123
120
|
virtualizedSetup(): void;
|
|
124
121
|
hydrate(props: FileDiffHydrationProps<LAnnotation>): void;
|
|
@@ -136,6 +133,7 @@ declare class FileDiff<LAnnotation = undefined> {
|
|
|
136
133
|
oldFile,
|
|
137
134
|
newFile,
|
|
138
135
|
fileDiff,
|
|
136
|
+
deferManagers,
|
|
139
137
|
forceRender,
|
|
140
138
|
preventEmit,
|
|
141
139
|
lineAnnotations,
|
|
@@ -174,6 +172,7 @@ declare class FileDiff<LAnnotation = undefined> {
|
|
|
174
172
|
private updateBufferSize;
|
|
175
173
|
private getCodeColumns;
|
|
176
174
|
private applyBuffers;
|
|
175
|
+
protected shouldDisableVirtualizationBuffers(): boolean;
|
|
177
176
|
protected applyPreNodeAttributes(pre: HTMLPreElement, {
|
|
178
177
|
additionsContentAST,
|
|
179
178
|
deletionsContentAST,
|