@pierre/diffs 1.0.6 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/components/File.d.ts +4 -2
  2. package/dist/components/File.d.ts.map +1 -1
  3. package/dist/components/File.js +80 -34
  4. package/dist/components/File.js.map +1 -1
  5. package/dist/components/FileDiff.d.ts +50 -28
  6. package/dist/components/FileDiff.d.ts.map +1 -1
  7. package/dist/components/FileDiff.js +222 -80
  8. package/dist/components/FileDiff.js.map +1 -1
  9. package/dist/components/FileStream.d.ts +1 -0
  10. package/dist/components/FileStream.d.ts.map +1 -1
  11. package/dist/components/FileStream.js +10 -6
  12. package/dist/components/FileStream.js.map +1 -1
  13. package/dist/components/web-components.d.ts.map +1 -1
  14. package/dist/components/web-components.js +1 -1
  15. package/dist/components/web-components.js.map +1 -1
  16. package/dist/constants.d.ts +8 -2
  17. package/dist/constants.d.ts.map +1 -1
  18. package/dist/constants.js +10 -1
  19. package/dist/constants.js.map +1 -1
  20. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +1 -1
  21. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  22. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  23. package/dist/highlighter/languages/resolveLanguage.d.ts +1 -1
  24. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  25. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  26. package/dist/highlighter/languages/resolveLanguages.js +1 -1
  27. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  28. package/dist/highlighter/shared_highlighter.js +1 -1
  29. package/dist/highlighter/shared_highlighter.js.map +1 -1
  30. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -1
  31. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  32. package/dist/index.d.ts +19 -10
  33. package/dist/index.js +14 -5
  34. package/dist/managers/LineSelectionManager.d.ts.map +1 -1
  35. package/dist/managers/LineSelectionManager.js +8 -9
  36. package/dist/managers/LineSelectionManager.js.map +1 -1
  37. package/dist/managers/ScrollSyncManager.d.ts +1 -0
  38. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  39. package/dist/managers/ScrollSyncManager.js +14 -6
  40. package/dist/managers/ScrollSyncManager.js.map +1 -1
  41. package/dist/react/MultiFileDiff.js +2 -2
  42. package/dist/react/MultiFileDiff.js.map +1 -1
  43. package/dist/react/index.d.ts +2 -2
  44. package/dist/react/utils/renderDiffChildren.d.ts +4 -4
  45. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  46. package/dist/react/utils/renderDiffChildren.js +3 -3
  47. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  48. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  49. package/dist/renderers/DiffHunksRenderer.d.ts +7 -6
  50. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  51. package/dist/renderers/DiffHunksRenderer.js +263 -337
  52. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  53. package/dist/renderers/FileRenderer.d.ts +1 -0
  54. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  55. package/dist/renderers/FileRenderer.js +11 -4
  56. package/dist/renderers/FileRenderer.js.map +1 -1
  57. package/dist/ssr/index.d.ts +2 -2
  58. package/dist/style.js +1 -1
  59. package/dist/style.js.map +1 -1
  60. package/dist/types.d.ts +247 -43
  61. package/dist/types.d.ts.map +1 -1
  62. package/dist/utils/areDiffLineAnnotationsEqual.d.ts +7 -0
  63. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -0
  64. package/dist/utils/areDiffLineAnnotationsEqual.js +8 -0
  65. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -0
  66. package/dist/utils/areHunkDataEqual.d.ts +7 -0
  67. package/dist/utils/areHunkDataEqual.d.ts.map +1 -0
  68. package/dist/utils/areHunkDataEqual.js +8 -0
  69. package/dist/utils/areHunkDataEqual.js.map +1 -0
  70. package/dist/utils/areLineAnnotationsEqual.d.ts +7 -0
  71. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -0
  72. package/dist/utils/areLineAnnotationsEqual.js +8 -0
  73. package/dist/utils/areLineAnnotationsEqual.js.map +1 -0
  74. package/dist/utils/arePrePropertiesEqual.d.ts +7 -0
  75. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -0
  76. package/dist/utils/arePrePropertiesEqual.js +9 -0
  77. package/dist/utils/arePrePropertiesEqual.js.map +1 -0
  78. package/dist/utils/areRenderRangesEqual.d.ts +7 -0
  79. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -0
  80. package/dist/utils/areRenderRangesEqual.js +9 -0
  81. package/dist/utils/areRenderRangesEqual.js.map +1 -0
  82. package/dist/utils/areVirtualWindowSpecsEqual.d.ts +7 -0
  83. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -0
  84. package/dist/utils/areVirtualWindowSpecsEqual.js +9 -0
  85. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -0
  86. package/dist/utils/areWorkerStatsEqual.d.ts +8 -0
  87. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -0
  88. package/dist/utils/areWorkerStatsEqual.js +9 -0
  89. package/dist/utils/areWorkerStatsEqual.js.map +1 -0
  90. package/dist/utils/createTransformerWithState.js +1 -1
  91. package/dist/utils/createTransformerWithState.js.map +1 -1
  92. package/dist/utils/createWindowFromScrollPosition.d.ts +22 -0
  93. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -0
  94. package/dist/utils/createWindowFromScrollPosition.js +26 -0
  95. package/dist/utils/createWindowFromScrollPosition.js.map +1 -0
  96. package/dist/utils/diffAcceptRejectHunk.js +36 -21
  97. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  98. package/dist/utils/formatCSSVariablePrefix.d.ts +1 -1
  99. package/dist/utils/formatCSSVariablePrefix.js +2 -2
  100. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  101. package/dist/utils/getHighlighterThemeStyles.js +12 -12
  102. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  103. package/dist/utils/getOrCreateCodeNode.d.ts +14 -0
  104. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -0
  105. package/dist/utils/getOrCreateCodeNode.js +13 -0
  106. package/dist/utils/getOrCreateCodeNode.js.map +1 -0
  107. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  108. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  109. package/dist/utils/hast_utils.d.ts +2 -1
  110. package/dist/utils/hast_utils.d.ts.map +1 -1
  111. package/dist/utils/hast_utils.js +10 -1
  112. package/dist/utils/hast_utils.js.map +1 -1
  113. package/dist/utils/isDefaultRenderRange.d.ts +7 -0
  114. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -0
  115. package/dist/utils/isDefaultRenderRange.js +8 -0
  116. package/dist/utils/isDefaultRenderRange.js.map +1 -0
  117. package/dist/utils/iterateOverDiff.d.ts +39 -0
  118. package/dist/utils/iterateOverDiff.d.ts.map +1 -0
  119. package/dist/utils/iterateOverDiff.js +356 -0
  120. package/dist/utils/iterateOverDiff.js.map +1 -0
  121. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  122. package/dist/utils/parseDiffFromFile.js +8 -6
  123. package/dist/utils/parseDiffFromFile.js.map +1 -1
  124. package/dist/utils/parsePatchFiles.d.ts +15 -3
  125. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  126. package/dist/utils/parsePatchFiles.js +207 -158
  127. package/dist/utils/parsePatchFiles.js.map +1 -1
  128. package/dist/utils/processLine.js +4 -3
  129. package/dist/utils/processLine.js.map +1 -1
  130. package/dist/utils/renderDiffWithHighlighter.d.ts +7 -2
  131. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  132. package/dist/utils/renderDiffWithHighlighter.js +151 -229
  133. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  134. package/dist/utils/renderFileWithHighlighter.js +2 -2
  135. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  136. package/dist/utils/setWrapperNodeProps.d.ts +3 -7
  137. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  138. package/dist/utils/setWrapperNodeProps.js +1 -1
  139. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  140. package/dist/worker/WorkerPoolManager.d.ts +9 -2
  141. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  142. package/dist/worker/WorkerPoolManager.js +124 -45
  143. package/dist/worker/WorkerPoolManager.js.map +1 -1
  144. package/dist/worker/types.d.ts +7 -0
  145. package/dist/worker/types.d.ts.map +1 -1
  146. package/dist/worker/worker-portable.js +652 -260
  147. package/dist/worker/worker-portable.js.map +1 -1
  148. package/dist/worker/worker.js +529 -249
  149. package/dist/worker/worker.js.map +1 -1
  150. package/package.json +21 -2
  151. package/dist/utils/createCodeNode.d.ts +0 -12
  152. package/dist/utils/createCodeNode.d.ts.map +0 -1
  153. package/dist/utils/createCodeNode.js +0 -12
  154. package/dist/utils/createCodeNode.js.map +0 -1
@@ -5,11 +5,21 @@ import { createTransformerWithState } from "./createTransformerWithState.js";
5
5
  import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js";
6
6
  import { getHighlighterThemeStyles } from "./getHighlighterThemeStyles.js";
7
7
  import { getLineNodes } from "./getLineNodes.js";
8
+ import { iterateOverDiff } from "./iterateOverDiff.js";
8
9
  import { createDiffSpanDecoration, pushOrJoinSpan } from "./parseDiffDecorations.js";
9
10
  import { diffChars, diffWordsWithSpace } from "diff";
10
11
 
11
12
  //#region src/utils/renderDiffWithHighlighter.ts
12
- function renderDiffWithHighlighter(diff, highlighter, options, forcePlainText = false) {
13
+ const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
14
+ function renderDiffWithHighlighter(diff, highlighter, options, { forcePlainText, startingLine, totalLines, expandedHunks } = DEFAULT_PLAIN_TEXT_OPTIONS) {
15
+ if (forcePlainText) {
16
+ startingLine ??= 0;
17
+ totalLines ??= Infinity;
18
+ } else {
19
+ startingLine = 0;
20
+ totalLines = Infinity;
21
+ }
22
+ const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;
13
23
  const baseThemeType = (() => {
14
24
  const theme = options.theme ?? DEFAULT_THEMES;
15
25
  if (typeof theme === "string") return highlighter.getTheme(theme).type;
@@ -18,92 +28,120 @@ function renderDiffWithHighlighter(diff, highlighter, options, forcePlainText =
18
28
  theme: options.theme,
19
29
  highlighter
20
30
  });
21
- if (diff.newLines != null && diff.oldLines != null) {
22
- const { oldContent, newContent, oldInfo, newInfo, oldDecorations, newDecorations } = processLines({
23
- hunks: diff.hunks,
24
- oldLines: diff.oldLines,
25
- newLines: diff.newLines,
26
- lineDiffType: options.lineDiffType
27
- });
28
- return {
29
- code: renderTwoFiles({
30
- oldFile: {
31
- name: diff.prevName ?? diff.name,
32
- contents: oldContent
33
- },
34
- oldInfo,
35
- oldDecorations,
36
- newFile: {
37
- name: diff.name,
38
- contents: newContent
39
- },
40
- newInfo,
41
- newDecorations,
42
- highlighter,
43
- options,
44
- languageOverride: forcePlainText ? "text" : diff.lang
45
- }),
46
- themeStyles,
47
- baseThemeType
48
- };
31
+ const lineDiffType = forcePlainText && !isWindowedHighlight && (diff.unifiedLineCount > 1e3 || diff.splitLineCount > 1e3) ? "none" : options.lineDiffType;
32
+ const code = {
33
+ deletionLines: [],
34
+ additionLines: []
35
+ };
36
+ const shouldGroupAll = !forcePlainText && !diff.isPartial;
37
+ const expandedHunksForIteration = forcePlainText ? expandedHunks : void 0;
38
+ const buckets = /* @__PURE__ */ new Map();
39
+ function getBucketForHunk(hunkIndex) {
40
+ const index = shouldGroupAll ? 0 : hunkIndex;
41
+ const bucket = buckets.get(index) ?? createBucket();
42
+ buckets.set(index, bucket);
43
+ return bucket;
49
44
  }
50
- const hunks = [];
51
- let splitLineIndex = 0;
52
- let unifiedLineIndex = 0;
53
- for (const hunk of diff.hunks) {
54
- const { oldContent, newContent, oldInfo, newInfo, oldDecorations, newDecorations, splitLineIndex: newSplitLineIndex, unifiedLineIndex: newUnifiedLineIndex } = processLines({
55
- hunks: [hunk],
56
- splitLineIndex,
57
- unifiedLineIndex,
58
- lineDiffType: options.lineDiffType
59
- });
60
- const oldFile = {
45
+ function appendContent(lineContent, lineIndex, segments, contentWrapper) {
46
+ if (isWindowedHighlight) {
47
+ let segment = segments.at(-1);
48
+ if (segment == null || segment.targetIndex + segment.count !== lineIndex) {
49
+ segment = {
50
+ targetIndex: lineIndex,
51
+ originalOffset: contentWrapper.length,
52
+ count: 0
53
+ };
54
+ segments.push(segment);
55
+ }
56
+ segment.count++;
57
+ }
58
+ contentWrapper.push(lineContent);
59
+ }
60
+ iterateOverDiff({
61
+ diff,
62
+ diffStyle: "both",
63
+ startingLine,
64
+ totalLines,
65
+ expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,
66
+ callback: ({ hunkIndex, additionLineIndex, deletionLineIndex, additionLineNumber, deletionLineNumber, unifiedAdditionLineIndex, unifiedDeletionLineIndex, splitLineIndex, type }) => {
67
+ const bucket = getBucketForHunk(hunkIndex);
68
+ if (type === "change" && lineDiffType !== "none" && additionLineIndex != null && deletionLineIndex != null) computeLineDiffDecorations({
69
+ additionLine: diff.additionLines[additionLineIndex],
70
+ deletionLine: diff.deletionLines[deletionLineIndex],
71
+ deletionLineIndex: bucket.deletionContent.length,
72
+ additionLineIndex: bucket.additionContent.length,
73
+ deletionDecorations: bucket.deletionDecorations,
74
+ additionDecorations: bucket.additionDecorations,
75
+ lineDiffType
76
+ });
77
+ if (deletionLineIndex != null && deletionLineNumber != null && unifiedDeletionLineIndex != null) {
78
+ appendContent(diff.deletionLines[deletionLineIndex], deletionLineIndex, bucket.deletionSegments, bucket.deletionContent);
79
+ bucket.deletionInfo.push({
80
+ type: type === "change" ? "change-deletion" : type,
81
+ lineNumber: deletionLineNumber,
82
+ altLineNumber: type === "change" ? void 0 : additionLineNumber ?? void 0,
83
+ lineIndex: `${unifiedDeletionLineIndex},${splitLineIndex}`
84
+ });
85
+ }
86
+ if (additionLineIndex != null && additionLineNumber != null && unifiedAdditionLineIndex != null) {
87
+ appendContent(diff.additionLines[additionLineIndex], additionLineIndex, bucket.additionSegments, bucket.additionContent);
88
+ bucket.additionInfo.push({
89
+ type: type === "change" ? "change-addition" : type,
90
+ lineNumber: additionLineNumber,
91
+ altLineNumber: type === "change" ? void 0 : deletionLineNumber ?? void 0,
92
+ lineIndex: `${unifiedAdditionLineIndex},${splitLineIndex}`
93
+ });
94
+ }
95
+ }
96
+ });
97
+ for (const bucket of buckets.values()) {
98
+ if (bucket.deletionContent.length === 0 && bucket.additionContent.length === 0) continue;
99
+ const deletionFile = {
61
100
  name: diff.prevName ?? diff.name,
62
- contents: oldContent
101
+ contents: bucket.deletionContent.value
63
102
  };
64
- const newFile = {
103
+ const additionFile = {
65
104
  name: diff.name,
66
- contents: newContent
105
+ contents: bucket.additionContent.value
67
106
  };
68
- hunks.push(renderTwoFiles({
69
- oldFile,
70
- oldInfo,
71
- oldDecorations,
72
- newFile,
73
- newInfo,
74
- newDecorations,
107
+ const { deletionLines, additionLines } = renderTwoFiles({
108
+ deletionFile,
109
+ deletionInfo: bucket.deletionInfo,
110
+ deletionDecorations: bucket.deletionDecorations,
111
+ additionFile,
112
+ additionInfo: bucket.additionInfo,
113
+ additionDecorations: bucket.additionDecorations,
75
114
  highlighter,
76
115
  options,
77
116
  languageOverride: forcePlainText ? "text" : diff.lang
78
- }));
79
- splitLineIndex = newSplitLineIndex;
80
- unifiedLineIndex = newUnifiedLineIndex;
117
+ });
118
+ if (shouldGroupAll) {
119
+ code.deletionLines = deletionLines;
120
+ code.additionLines = additionLines;
121
+ continue;
122
+ }
123
+ if (bucket.deletionSegments.length > 0) for (const seg of bucket.deletionSegments) for (let i = 0; i < seg.count; i++) code.deletionLines[seg.targetIndex + i] = deletionLines[seg.originalOffset + i];
124
+ else code.deletionLines.push(...deletionLines);
125
+ if (bucket.additionSegments.length > 0) for (const seg of bucket.additionSegments) for (let i = 0; i < seg.count; i++) code.additionLines[seg.targetIndex + i] = additionLines[seg.originalOffset + i];
126
+ else code.additionLines.push(...additionLines);
81
127
  }
82
128
  return {
83
- code: (() => {
84
- if (hunks.length <= 1) {
85
- const hunk = hunks[0] ?? {
86
- oldLines: [],
87
- newLines: []
88
- };
89
- if (hunk.newLines.length === 0 || hunk.oldLines.length === 0) return hunk;
90
- }
91
- return { hunks };
92
- })(),
129
+ code,
93
130
  themeStyles,
94
131
  baseThemeType
95
132
  };
96
133
  }
97
- function computeLineDiffDecorations({ oldLine, newLine, oldLineIndex, newLineIndex, oldDecorations, newDecorations, lineDiffType }) {
98
- if (oldLine == null || newLine == null || lineDiffType === "none") return;
99
- oldLine = cleanLastNewline(oldLine);
100
- newLine = cleanLastNewline(newLine);
101
- const lineDiff = lineDiffType === "char" ? diffChars(oldLine, newLine) : diffWordsWithSpace(oldLine, newLine);
134
+ function computeLineDiffDecorations({ deletionLine, additionLine, deletionLineIndex, additionLineIndex, deletionDecorations, additionDecorations, lineDiffType }) {
135
+ if (deletionLine == null || additionLine == null || lineDiffType === "none") return;
136
+ deletionLine = cleanLastNewline(deletionLine);
137
+ additionLine = cleanLastNewline(additionLine);
138
+ const lineDiff = lineDiffType === "char" ? diffChars(deletionLine, additionLine) : diffWordsWithSpace(deletionLine, additionLine);
102
139
  const deletionSpans = [];
103
140
  const additionSpans = [];
104
141
  const enableJoin = lineDiffType === "word-alt";
142
+ const lastItem = lineDiff.at(-1);
105
143
  for (const item of lineDiff) {
106
- const isLastItem = item === lineDiff[lineDiff.length - 1];
144
+ const isLastItem = item === lastItem;
107
145
  if (!item.added && !item.removed) {
108
146
  pushOrJoinSpan({
109
147
  item,
@@ -134,8 +172,8 @@ function computeLineDiffDecorations({ oldLine, newLine, oldLineIndex, newLineInd
134
172
  }
135
173
  let spanIndex = 0;
136
174
  for (const span of deletionSpans) {
137
- if (span[0] === 1) oldDecorations.push(createDiffSpanDecoration({
138
- line: oldLineIndex - 1,
175
+ if (span[0] === 1) deletionDecorations.push(createDiffSpanDecoration({
176
+ line: deletionLineIndex,
139
177
  spanStart: spanIndex,
140
178
  spanLength: span[1].length
141
179
  }));
@@ -143,159 +181,43 @@ function computeLineDiffDecorations({ oldLine, newLine, oldLineIndex, newLineInd
143
181
  }
144
182
  spanIndex = 0;
145
183
  for (const span of additionSpans) {
146
- if (span[0] === 1) newDecorations.push(createDiffSpanDecoration({
147
- line: newLineIndex - 1,
184
+ if (span[0] === 1) additionDecorations.push(createDiffSpanDecoration({
185
+ line: additionLineIndex,
148
186
  spanStart: spanIndex,
149
187
  spanLength: span[1].length
150
188
  }));
151
189
  spanIndex += span[1].length;
152
190
  }
153
191
  }
154
- function processLines({ hunks, oldLines, newLines, splitLineIndex = 0, unifiedLineIndex = 0, lineDiffType }) {
155
- const oldInfo = {};
156
- const newInfo = {};
157
- const oldDecorations = [];
158
- const newDecorations = [];
159
- let newLineIndex = 1;
160
- let oldLineIndex = 1;
161
- let newLineNumber = 1;
162
- let oldLineNumber = 1;
163
- let oldContent = "";
164
- let newContent = "";
165
- for (const hunk of hunks) {
166
- while (oldLines != null && newLines != null && newLineIndex < hunk.additionStart && oldLineIndex < hunk.deletionStart) {
167
- oldInfo[oldLineIndex] = {
168
- type: "context-expanded",
169
- lineNumber: oldLineNumber,
170
- altLineNumber: newLineNumber,
171
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
172
- };
173
- newInfo[newLineIndex] = {
174
- type: "context-expanded",
175
- lineNumber: newLineNumber,
176
- altLineNumber: oldLineNumber,
177
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
178
- };
179
- oldContent += oldLines[oldLineIndex - 1];
180
- newContent += newLines[newLineIndex - 1];
181
- oldLineIndex++;
182
- newLineIndex++;
183
- oldLineNumber++;
184
- newLineNumber++;
185
- splitLineIndex++;
186
- unifiedLineIndex++;
187
- }
188
- oldLineNumber = hunk.deletionStart;
189
- newLineNumber = hunk.additionStart;
190
- for (const hunkContent of hunk.hunkContent) if (hunkContent.type === "context") for (const line of hunkContent.lines) {
191
- oldInfo[oldLineIndex] = {
192
- type: "context",
193
- lineNumber: oldLineNumber,
194
- altLineNumber: newLineNumber,
195
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
196
- };
197
- newInfo[newLineIndex] = {
198
- type: "context",
199
- lineNumber: newLineNumber,
200
- altLineNumber: oldLineNumber,
201
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
202
- };
203
- oldContent += line;
204
- newContent += line;
205
- oldLineIndex++;
206
- newLineIndex++;
207
- newLineNumber++;
208
- oldLineNumber++;
209
- splitLineIndex++;
210
- unifiedLineIndex++;
211
- }
212
- else {
213
- const len = Math.max(hunkContent.additions.length, hunkContent.deletions.length);
214
- let i = 0;
215
- let _unifiedLineIndex = unifiedLineIndex;
216
- while (i < len) {
217
- const oldLine = hunkContent.deletions[i];
218
- const newLine = hunkContent.additions[i];
219
- computeLineDiffDecorations({
220
- newLine,
221
- oldLine,
222
- oldLineIndex,
223
- newLineIndex,
224
- oldDecorations,
225
- newDecorations,
226
- lineDiffType
227
- });
228
- if (oldLine != null) {
229
- oldInfo[oldLineIndex] = {
230
- type: "change-deletion",
231
- lineNumber: oldLineNumber,
232
- lineIndex: `${_unifiedLineIndex},${splitLineIndex}`
233
- };
234
- oldContent += oldLine;
235
- oldLineIndex++;
236
- oldLineNumber++;
237
- }
238
- if (newLine != null) {
239
- newInfo[newLineIndex] = {
240
- type: "change-addition",
241
- lineNumber: newLineNumber,
242
- lineIndex: `${_unifiedLineIndex + hunkContent.deletions.length},${splitLineIndex}`
243
- };
244
- newContent += newLine;
245
- newLineIndex++;
246
- newLineNumber++;
247
- }
248
- splitLineIndex++;
249
- _unifiedLineIndex++;
250
- i++;
251
- }
252
- unifiedLineIndex += hunkContent.additions.length + hunkContent.deletions.length;
253
- }
254
- if (oldLines == null || newLines == null || hunk !== hunks[hunks.length - 1]) continue;
255
- while (oldLineIndex <= oldLines.length || newLineIndex <= oldLines.length) {
256
- const oldLine = oldLines[oldLineIndex - 1];
257
- const newLine = newLines[newLineIndex - 1];
258
- if (oldLine == null && newLine == null) break;
259
- if (oldLine != null) {
260
- oldInfo[oldLineIndex] = {
261
- type: "context-expanded",
262
- lineNumber: oldLineNumber,
263
- altLineNumber: newLineNumber,
264
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
265
- };
266
- oldContent += oldLine;
267
- oldLineIndex++;
268
- oldLineNumber++;
269
- }
270
- if (newLine != null) {
271
- newInfo[newLineIndex] = {
272
- type: "context-expanded",
273
- lineNumber: newLineNumber,
274
- altLineNumber: oldLineNumber,
275
- lineIndex: `${unifiedLineIndex},${splitLineIndex}`
276
- };
277
- newContent += newLine;
278
- newLineIndex++;
279
- newLineNumber++;
280
- }
281
- splitLineIndex++;
282
- unifiedLineIndex++;
283
- }
284
- }
192
+ function createBucket() {
285
193
  return {
286
- oldContent,
287
- newContent,
288
- oldInfo,
289
- newInfo,
290
- oldDecorations,
291
- newDecorations,
292
- splitLineIndex,
293
- unifiedLineIndex
194
+ deletionContent: {
195
+ push(value) {
196
+ this.value += value;
197
+ this.length++;
198
+ },
199
+ value: "",
200
+ length: 0
201
+ },
202
+ additionContent: {
203
+ push(value) {
204
+ this.value += value;
205
+ this.length++;
206
+ },
207
+ value: "",
208
+ length: 0
209
+ },
210
+ deletionInfo: [],
211
+ additionInfo: [],
212
+ deletionDecorations: [],
213
+ additionDecorations: [],
214
+ deletionSegments: [],
215
+ additionSegments: []
294
216
  };
295
217
  }
296
- function renderTwoFiles({ oldFile, newFile, oldInfo, newInfo, highlighter, oldDecorations, newDecorations, languageOverride, options: { theme: themeOrThemes = DEFAULT_THEMES,...options } }) {
297
- const oldLang = languageOverride ?? getFiletypeFromFileName(oldFile.name);
298
- const newLang = languageOverride ?? getFiletypeFromFileName(newFile.name);
218
+ function renderTwoFiles({ deletionFile, additionFile, deletionInfo, additionInfo, highlighter, deletionDecorations, additionDecorations, languageOverride, options: { theme: themeOrThemes = DEFAULT_THEMES,...options } }) {
219
+ const deletionLang = languageOverride ?? getFiletypeFromFileName(deletionFile.name);
220
+ const additionLang = languageOverride ?? getFiletypeFromFileName(additionFile.name);
299
221
  const { state, transformers } = createTransformerWithState();
300
222
  const hastConfig = (() => {
301
223
  return typeof themeOrThemes === "string" ? {
@@ -305,7 +227,7 @@ function renderTwoFiles({ oldFile, newFile, oldInfo, newInfo, highlighter, oldDe
305
227
  transformers,
306
228
  decorations: void 0,
307
229
  defaultColor: false,
308
- cssVariablePrefix: formatCSSVariablePrefix()
230
+ cssVariablePrefix: formatCSSVariablePrefix("token")
309
231
  } : {
310
232
  ...options,
311
233
  lang: "text",
@@ -313,23 +235,23 @@ function renderTwoFiles({ oldFile, newFile, oldInfo, newInfo, highlighter, oldDe
313
235
  transformers,
314
236
  decorations: void 0,
315
237
  defaultColor: false,
316
- cssVariablePrefix: formatCSSVariablePrefix()
238
+ cssVariablePrefix: formatCSSVariablePrefix("token")
317
239
  };
318
240
  })();
319
241
  return {
320
- oldLines: (() => {
321
- if (oldFile.contents === "") return [];
322
- hastConfig.lang = oldLang;
323
- state.lineInfo = oldInfo;
324
- hastConfig.decorations = oldDecorations;
325
- return getLineNodes(highlighter.codeToHast(cleanLastNewline(oldFile.contents), hastConfig));
242
+ deletionLines: (() => {
243
+ if (deletionFile.contents === "") return [];
244
+ hastConfig.lang = deletionLang;
245
+ state.lineInfo = deletionInfo;
246
+ hastConfig.decorations = deletionDecorations;
247
+ return getLineNodes(highlighter.codeToHast(cleanLastNewline(deletionFile.contents), hastConfig));
326
248
  })(),
327
- newLines: (() => {
328
- if (newFile.contents === "") return [];
329
- hastConfig.lang = newLang;
330
- hastConfig.decorations = newDecorations;
331
- state.lineInfo = newInfo;
332
- return getLineNodes(highlighter.codeToHast(cleanLastNewline(newFile.contents), hastConfig));
249
+ additionLines: (() => {
250
+ if (additionFile.contents === "") return [];
251
+ hastConfig.lang = additionLang;
252
+ hastConfig.decorations = additionDecorations;
253
+ state.lineInfo = additionInfo;
254
+ return getLineNodes(highlighter.codeToHast(cleanLastNewline(additionFile.contents), hastConfig));
333
255
  })()
334
256
  };
335
257
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderDiffWithHighlighter.js","names":["hunks: RenderDiffFilesResult[]","deletionSpans: [0 | 1, string][]","additionSpans: [0 | 1, string][]","oldInfo: Record<number, LineInfo | undefined>","newInfo: Record<number, LineInfo | undefined>","oldDecorations: DecorationItem[]","newDecorations: DecorationItem[]","hastConfig: CodeToHastOptions<DiffsThemeNames>"],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"sourcesContent":["import { diffChars, diffWordsWithSpace } from 'diff';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DecorationItem,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n FileDiffMetadata,\n Hunk,\n LineDiffTypes,\n LineInfo,\n RenderDiffFilesResult,\n RenderDiffOptions,\n SupportedLanguages,\n ThemedDiffResult,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\nimport {\n createDiffSpanDecoration,\n pushOrJoinSpan,\n} from './parseDiffDecorations';\n\nexport function renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n options: RenderDiffOptions,\n forcePlainText = false\n): ThemedDiffResult {\n const baseThemeType = (() => {\n const theme = options.theme ?? DEFAULT_THEMES;\n if (typeof theme === 'string') {\n return highlighter.getTheme(theme).type;\n }\n return undefined;\n })();\n const themeStyles = getHighlighterThemeStyles({\n theme: options.theme,\n highlighter,\n });\n // If we've received a diff with both files\n if (diff.newLines != null && diff.oldLines != null) {\n const {\n oldContent,\n newContent,\n oldInfo,\n newInfo,\n oldDecorations,\n newDecorations,\n } = processLines({\n hunks: diff.hunks,\n oldLines: diff.oldLines,\n newLines: diff.newLines,\n lineDiffType: options.lineDiffType,\n });\n const oldFile = {\n name: diff.prevName ?? diff.name,\n contents: oldContent,\n };\n const newFile = {\n name: diff.name,\n contents: newContent,\n };\n const code = renderTwoFiles({\n oldFile,\n oldInfo,\n oldDecorations,\n\n newFile,\n newInfo,\n newDecorations,\n\n highlighter,\n options,\n languageOverride: forcePlainText ? 'text' : diff.lang,\n });\n return { code, themeStyles, baseThemeType };\n }\n const hunks: RenderDiffFilesResult[] = [];\n let splitLineIndex = 0;\n let unifiedLineIndex = 0;\n for (const hunk of diff.hunks) {\n const {\n oldContent,\n newContent,\n oldInfo,\n newInfo,\n oldDecorations,\n newDecorations,\n splitLineIndex: newSplitLineIndex,\n unifiedLineIndex: newUnifiedLineIndex,\n } = processLines({\n hunks: [hunk],\n splitLineIndex,\n unifiedLineIndex,\n lineDiffType: options.lineDiffType,\n });\n const oldFile = {\n name: diff.prevName ?? diff.name,\n contents: oldContent,\n };\n const newFile = {\n name: diff.name,\n contents: newContent,\n };\n hunks.push(\n renderTwoFiles({\n oldFile,\n oldInfo,\n oldDecorations,\n\n newFile,\n newInfo,\n newDecorations,\n\n highlighter,\n options,\n languageOverride: forcePlainText ? 'text' : diff.lang,\n })\n );\n splitLineIndex = newSplitLineIndex;\n unifiedLineIndex = newUnifiedLineIndex;\n }\n\n const code = (() => {\n if (hunks.length <= 1) {\n const hunk = hunks[0] ?? { oldLines: [], newLines: [] };\n if (hunk.newLines.length === 0 || hunk.oldLines.length === 0) {\n return hunk;\n }\n }\n return { hunks };\n })();\n\n return { code, themeStyles, baseThemeType };\n}\n\ninterface ProcessLineDiffProps {\n oldLine: string | undefined;\n newLine: string | undefined;\n oldLineIndex: number;\n newLineIndex: number;\n oldDecorations: DecorationItem[];\n newDecorations: DecorationItem[];\n lineDiffType: LineDiffTypes;\n}\n\nfunction computeLineDiffDecorations({\n oldLine,\n newLine,\n oldLineIndex,\n newLineIndex,\n oldDecorations,\n newDecorations,\n lineDiffType,\n}: ProcessLineDiffProps) {\n if (oldLine == null || newLine == null || lineDiffType === 'none') {\n return;\n }\n oldLine = cleanLastNewline(oldLine);\n newLine = cleanLastNewline(newLine);\n // NOTE(amadeus): Because we visually trim trailing newlines when rendering,\n // we also gotta make sure the diff parsing doesn't include the newline\n // character that could be there...\n const lineDiff =\n lineDiffType === 'char'\n ? diffChars(oldLine, newLine)\n : diffWordsWithSpace(oldLine, newLine);\n const deletionSpans: [0 | 1, string][] = [];\n const additionSpans: [0 | 1, string][] = [];\n const enableJoin = lineDiffType === 'word-alt';\n for (const item of lineDiff) {\n const isLastItem = item === lineDiff[lineDiff.length - 1];\n if (!item.added && !item.removed) {\n pushOrJoinSpan({\n item,\n arr: deletionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n pushOrJoinSpan({\n item,\n arr: additionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n } else if (item.removed) {\n pushOrJoinSpan({ item, arr: deletionSpans, enableJoin, isLastItem });\n } else {\n pushOrJoinSpan({ item, arr: additionSpans, enableJoin, isLastItem });\n }\n }\n let spanIndex = 0;\n for (const span of deletionSpans) {\n if (span[0] === 1) {\n oldDecorations.push(\n createDiffSpanDecoration({\n // Decoration indexes start at 0\n line: oldLineIndex - 1,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n spanIndex = 0;\n for (const span of additionSpans) {\n if (span[0] === 1) {\n newDecorations.push(\n createDiffSpanDecoration({\n // Decoration indexes start at 0\n line: newLineIndex - 1,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n}\n\ninterface ProcessLinesProps {\n hunks: Hunk[];\n oldLines?: string[];\n newLines?: string[];\n splitLineIndex?: number;\n unifiedLineIndex?: number;\n newLineIndex?: number;\n oldLineIndex?: number;\n lineDiffType: LineDiffTypes;\n}\n\nfunction processLines({\n hunks,\n oldLines,\n newLines,\n splitLineIndex = 0,\n unifiedLineIndex = 0,\n lineDiffType,\n}: ProcessLinesProps) {\n const oldInfo: Record<number, LineInfo | undefined> = {};\n const newInfo: Record<number, LineInfo | undefined> = {};\n const oldDecorations: DecorationItem[] = [];\n const newDecorations: DecorationItem[] = [];\n let newLineIndex = 1;\n let oldLineIndex = 1;\n let newLineNumber = 1;\n let oldLineNumber = 1;\n let oldContent = '';\n let newContent = '';\n for (const hunk of hunks) {\n // If there's content prior to the hunk, lets fill it up\n while (\n oldLines != null &&\n newLines != null &&\n newLineIndex < hunk.additionStart &&\n oldLineIndex < hunk.deletionStart\n ) {\n oldInfo[oldLineIndex] = {\n type: 'context-expanded',\n lineNumber: oldLineNumber,\n altLineNumber: newLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n newInfo[newLineIndex] = {\n type: 'context-expanded',\n lineNumber: newLineNumber,\n altLineNumber: oldLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n oldContent += oldLines[oldLineIndex - 1];\n newContent += newLines[newLineIndex - 1];\n oldLineIndex++;\n newLineIndex++;\n oldLineNumber++;\n newLineNumber++;\n splitLineIndex++;\n unifiedLineIndex++;\n }\n oldLineNumber = hunk.deletionStart;\n newLineNumber = hunk.additionStart;\n\n // Lets process the actual hunk content\n for (const hunkContent of hunk.hunkContent) {\n if (hunkContent.type === 'context') {\n for (const line of hunkContent.lines) {\n oldInfo[oldLineIndex] = {\n type: 'context',\n lineNumber: oldLineNumber,\n altLineNumber: newLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n newInfo[newLineIndex] = {\n type: 'context',\n lineNumber: newLineNumber,\n altLineNumber: oldLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n oldContent += line;\n newContent += line;\n oldLineIndex++;\n newLineIndex++;\n newLineNumber++;\n oldLineNumber++;\n splitLineIndex++;\n unifiedLineIndex++;\n }\n } else {\n const len = Math.max(\n hunkContent.additions.length,\n hunkContent.deletions.length\n );\n let i = 0;\n // NOTE(amadeus): Since we iterate through deletions and additions\n // simultaneously, we have to create a secondary iterator for\n // unifiedLineIndex, and then when we're done, add the combined lengths\n // of additions/deletions to the main variable\n let _unifiedLineIndex = unifiedLineIndex;\n while (i < len) {\n const oldLine = hunkContent.deletions[i];\n const newLine = hunkContent.additions[i];\n computeLineDiffDecorations({\n newLine,\n oldLine,\n oldLineIndex,\n newLineIndex,\n oldDecorations,\n newDecorations,\n lineDiffType,\n });\n if (oldLine != null) {\n oldInfo[oldLineIndex] = {\n type: 'change-deletion',\n lineNumber: oldLineNumber,\n lineIndex: `${_unifiedLineIndex},${splitLineIndex}`,\n };\n oldContent += oldLine;\n oldLineIndex++;\n oldLineNumber++;\n }\n if (newLine != null) {\n newInfo[newLineIndex] = {\n type: 'change-addition',\n lineNumber: newLineNumber,\n lineIndex: `${_unifiedLineIndex + hunkContent.deletions.length},${splitLineIndex}`,\n };\n newContent += newLine;\n newLineIndex++;\n newLineNumber++;\n }\n splitLineIndex++;\n _unifiedLineIndex++;\n i++;\n }\n unifiedLineIndex +=\n hunkContent.additions.length + hunkContent.deletions.length;\n }\n }\n\n if (\n oldLines == null ||\n newLines == null ||\n hunk !== hunks[hunks.length - 1]\n )\n continue;\n // If we are on the last hunk, we should fully iterate through the rest\n // of the lines\n while (oldLineIndex <= oldLines.length || newLineIndex <= oldLines.length) {\n const oldLine = oldLines[oldLineIndex - 1];\n const newLine = newLines[newLineIndex - 1];\n if (oldLine == null && newLine == null) {\n break;\n }\n if (oldLine != null) {\n oldInfo[oldLineIndex] = {\n type: 'context-expanded',\n lineNumber: oldLineNumber,\n altLineNumber: newLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n oldContent += oldLine;\n oldLineIndex++;\n oldLineNumber++;\n }\n if (newLine != null) {\n newInfo[newLineIndex] = {\n type: 'context-expanded',\n lineNumber: newLineNumber,\n altLineNumber: oldLineNumber,\n lineIndex: `${unifiedLineIndex},${splitLineIndex}`,\n };\n newContent += newLine;\n newLineIndex++;\n newLineNumber++;\n }\n splitLineIndex++;\n unifiedLineIndex++;\n }\n }\n return {\n oldContent,\n newContent,\n oldInfo,\n newInfo,\n oldDecorations,\n newDecorations,\n splitLineIndex,\n unifiedLineIndex,\n };\n}\n\ninterface RenderTwoFilesProps {\n oldFile: FileContents;\n newFile: FileContents;\n oldInfo: Record<number, LineInfo | undefined>;\n newInfo: Record<number, LineInfo | undefined>;\n oldDecorations: DecorationItem[];\n newDecorations: DecorationItem[];\n options: RenderDiffOptions;\n highlighter: DiffsHighlighter;\n languageOverride: SupportedLanguages | undefined;\n}\n\nfunction renderTwoFiles({\n oldFile,\n newFile,\n oldInfo,\n newInfo,\n highlighter,\n oldDecorations,\n newDecorations,\n languageOverride,\n options: { theme: themeOrThemes = DEFAULT_THEMES, ...options },\n}: RenderTwoFilesProps) {\n const oldLang = languageOverride ?? getFiletypeFromFileName(oldFile.name);\n const newLang = languageOverride ?? getFiletypeFromFileName(newFile.name);\n const { state, transformers } = createTransformerWithState();\n const hastConfig: CodeToHastOptions<DiffsThemeNames> = (() => {\n return typeof themeOrThemes === 'string'\n ? {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n theme: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n }\n : {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n themes: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n };\n })();\n\n const oldLines = (() => {\n if (oldFile.contents === '') {\n return [];\n }\n hastConfig.lang = oldLang;\n state.lineInfo = oldInfo;\n hastConfig.decorations = oldDecorations;\n return getLineNodes(\n highlighter.codeToHast(cleanLastNewline(oldFile.contents), hastConfig)\n );\n })();\n const newLines = (() => {\n if (newFile.contents === '') {\n return [];\n }\n hastConfig.lang = newLang;\n hastConfig.decorations = newDecorations;\n state.lineInfo = newInfo;\n return getLineNodes(\n highlighter.codeToHast(cleanLastNewline(newFile.contents), hastConfig)\n );\n })();\n\n return { oldLines, newLines };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"renderDiffWithHighlighter.js","names":["DEFAULT_PLAIN_TEXT_OPTIONS: ForcePlainTextOptions","code: RenderDiffFilesResult","deletionSpans: [0 | 1, string][]","additionSpans: [0 | 1, string][]","hastConfig: CodeToHastOptions<DiffsThemeNames>"],"sources":["../../src/utils/renderDiffWithHighlighter.ts"],"sourcesContent":["import { diffChars, diffWordsWithSpace } from 'diff';\n\nimport { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DecorationItem,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n FileDiffMetadata,\n ForcePlainTextOptions,\n LineDiffTypes,\n LineInfo,\n RenderDiffFilesResult,\n RenderDiffOptions,\n SupportedLanguages,\n ThemedDiffResult,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\nimport { iterateOverDiff } from './iterateOverDiff';\nimport {\n createDiffSpanDecoration,\n pushOrJoinSpan,\n} from './parseDiffDecorations';\n\nconst DEFAULT_PLAIN_TEXT_OPTIONS: ForcePlainTextOptions = {\n forcePlainText: false,\n};\n\nexport function renderDiffWithHighlighter(\n diff: FileDiffMetadata,\n highlighter: DiffsHighlighter,\n options: RenderDiffOptions,\n {\n forcePlainText,\n startingLine,\n totalLines,\n expandedHunks,\n }: ForcePlainTextOptions = DEFAULT_PLAIN_TEXT_OPTIONS\n): ThemedDiffResult {\n if (forcePlainText) {\n startingLine ??= 0;\n totalLines ??= Infinity;\n } else {\n // If we aren't forcing plain text, then we intentionally do not support\n // ranges for highlighting as that could break the syntax highlighting, we\n // we override any values that may have been passed in. Maybe one day we\n // warn about this?\n startingLine = 0;\n totalLines = Infinity;\n }\n const isWindowedHighlight = startingLine > 0 || totalLines < Infinity;\n const baseThemeType = (() => {\n const theme = options.theme ?? DEFAULT_THEMES;\n if (typeof theme === 'string') {\n return highlighter.getTheme(theme).type;\n }\n return undefined;\n })();\n const themeStyles = getHighlighterThemeStyles({\n theme: options.theme,\n highlighter,\n });\n\n // If we have a large file and we are rendering the WHOLE plain diff ast,\n // then we should remove the lineDiffType to make sure things render quickly.\n // For highlighted ASTs or windowed highlights, we should just inherit the\n // setting\n const lineDiffType =\n forcePlainText &&\n !isWindowedHighlight &&\n (diff.unifiedLineCount > 1000 || diff.splitLineCount > 1000)\n ? 'none'\n : options.lineDiffType;\n\n const code: RenderDiffFilesResult = {\n deletionLines: [],\n additionLines: [],\n };\n\n const shouldGroupAll = !forcePlainText && !diff.isPartial;\n const expandedHunksForIteration = forcePlainText ? expandedHunks : undefined;\n const buckets = new Map<number, RenderBucket>();\n function getBucketForHunk(hunkIndex: number) {\n const index = shouldGroupAll ? 0 : hunkIndex;\n const bucket = buckets.get(index) ?? createBucket();\n buckets.set(index, bucket);\n return bucket;\n }\n\n function appendContent(\n lineContent: string,\n lineIndex: number,\n segments: HighlightSegment[],\n contentWrapper: FakeArrayType\n ) {\n if (isWindowedHighlight) {\n let segment = segments.at(-1);\n if (\n segment == null ||\n segment.targetIndex + segment.count !== lineIndex\n ) {\n segment = {\n targetIndex: lineIndex,\n originalOffset: contentWrapper.length,\n count: 0,\n };\n segments.push(segment);\n }\n segment.count++;\n }\n contentWrapper.push(lineContent);\n }\n\n iterateOverDiff({\n diff,\n diffStyle: 'both',\n startingLine,\n totalLines,\n expandedHunks: isWindowedHighlight ? expandedHunksForIteration : true,\n callback: ({\n hunkIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n unifiedAdditionLineIndex,\n unifiedDeletionLineIndex,\n splitLineIndex,\n type,\n }) => {\n const bucket = getBucketForHunk(hunkIndex);\n\n if (\n type === 'change' &&\n lineDiffType !== 'none' &&\n additionLineIndex != null &&\n deletionLineIndex != null\n ) {\n computeLineDiffDecorations({\n additionLine: diff.additionLines[additionLineIndex],\n deletionLine: diff.deletionLines[deletionLineIndex],\n deletionLineIndex: bucket.deletionContent.length,\n additionLineIndex: bucket.additionContent.length,\n deletionDecorations: bucket.deletionDecorations,\n additionDecorations: bucket.additionDecorations,\n lineDiffType,\n });\n }\n\n if (\n deletionLineIndex != null &&\n deletionLineNumber != null &&\n unifiedDeletionLineIndex != null\n ) {\n appendContent(\n diff.deletionLines[deletionLineIndex],\n deletionLineIndex,\n bucket.deletionSegments,\n bucket.deletionContent\n );\n bucket.deletionInfo.push({\n type: type === 'change' ? 'change-deletion' : type,\n lineNumber: deletionLineNumber,\n altLineNumber:\n type === 'change' ? undefined : (additionLineNumber ?? undefined),\n lineIndex: `${unifiedDeletionLineIndex},${splitLineIndex}`,\n });\n }\n\n if (\n additionLineIndex != null &&\n additionLineNumber != null &&\n unifiedAdditionLineIndex != null\n ) {\n appendContent(\n diff.additionLines[additionLineIndex],\n additionLineIndex,\n bucket.additionSegments,\n bucket.additionContent\n );\n bucket.additionInfo.push({\n type: type === 'change' ? 'change-addition' : type,\n lineNumber: additionLineNumber,\n altLineNumber:\n type === 'change' ? undefined : (deletionLineNumber ?? undefined),\n lineIndex: `${unifiedAdditionLineIndex},${splitLineIndex}`,\n });\n }\n },\n });\n\n for (const bucket of buckets.values()) {\n if (\n bucket.deletionContent.length === 0 &&\n bucket.additionContent.length === 0\n ) {\n continue;\n }\n\n const deletionFile = {\n name: diff.prevName ?? diff.name,\n contents: bucket.deletionContent.value,\n };\n const additionFile = {\n name: diff.name,\n contents: bucket.additionContent.value,\n };\n const { deletionLines, additionLines } = renderTwoFiles({\n deletionFile,\n deletionInfo: bucket.deletionInfo,\n deletionDecorations: bucket.deletionDecorations,\n\n additionFile,\n additionInfo: bucket.additionInfo,\n additionDecorations: bucket.additionDecorations,\n\n highlighter,\n options,\n languageOverride: forcePlainText ? 'text' : diff.lang,\n });\n\n if (shouldGroupAll) {\n code.deletionLines = deletionLines;\n code.additionLines = additionLines;\n continue;\n }\n\n if (bucket.deletionSegments.length > 0) {\n for (const seg of bucket.deletionSegments) {\n for (let i = 0; i < seg.count; i++) {\n code.deletionLines[seg.targetIndex + i] =\n deletionLines[seg.originalOffset + i];\n }\n }\n } else {\n code.deletionLines.push(...deletionLines);\n }\n if (bucket.additionSegments.length > 0) {\n for (const seg of bucket.additionSegments) {\n for (let i = 0; i < seg.count; i++) {\n code.additionLines[seg.targetIndex + i] =\n additionLines[seg.originalOffset + i];\n }\n }\n } else {\n code.additionLines.push(...additionLines);\n }\n }\n\n return { code, themeStyles, baseThemeType };\n}\n\ninterface ProcessLineDiffProps {\n deletionLine: string | undefined;\n additionLine: string | undefined;\n deletionLineIndex: number;\n additionLineIndex: number;\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n lineDiffType: LineDiffTypes;\n}\n\nfunction computeLineDiffDecorations({\n deletionLine,\n additionLine,\n deletionLineIndex,\n additionLineIndex,\n deletionDecorations,\n additionDecorations,\n lineDiffType,\n}: ProcessLineDiffProps) {\n if (deletionLine == null || additionLine == null || lineDiffType === 'none') {\n return;\n }\n deletionLine = cleanLastNewline(deletionLine);\n additionLine = cleanLastNewline(additionLine);\n // NOTE(amadeus): Because we visually trim trailing newlines when rendering,\n // we also gotta make sure the diff parsing doesn't include the newline\n // character that could be there...\n const lineDiff =\n lineDiffType === 'char'\n ? diffChars(deletionLine, additionLine)\n : diffWordsWithSpace(deletionLine, additionLine);\n const deletionSpans: [0 | 1, string][] = [];\n const additionSpans: [0 | 1, string][] = [];\n const enableJoin = lineDiffType === 'word-alt';\n const lastItem = lineDiff.at(-1);\n for (const item of lineDiff) {\n const isLastItem = item === lastItem;\n if (!item.added && !item.removed) {\n pushOrJoinSpan({\n item,\n arr: deletionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n pushOrJoinSpan({\n item,\n arr: additionSpans,\n enableJoin,\n isNeutral: true,\n isLastItem,\n });\n } else if (item.removed) {\n pushOrJoinSpan({ item, arr: deletionSpans, enableJoin, isLastItem });\n } else {\n pushOrJoinSpan({ item, arr: additionSpans, enableJoin, isLastItem });\n }\n }\n let spanIndex = 0;\n for (const span of deletionSpans) {\n if (span[0] === 1) {\n deletionDecorations.push(\n createDiffSpanDecoration({\n line: deletionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n spanIndex = 0;\n for (const span of additionSpans) {\n if (span[0] === 1) {\n additionDecorations.push(\n createDiffSpanDecoration({\n line: additionLineIndex,\n spanStart: spanIndex,\n spanLength: span[1].length,\n })\n );\n }\n spanIndex += span[1].length;\n }\n}\n\ninterface HighlightSegment {\n // The where the highlighted region starts\n originalOffset: number;\n // Where to place the highlighted line in RenderDiffFilesResult\n targetIndex: number;\n // Number of highlighted lines\n count: number;\n}\n\ninterface FakeArrayType {\n push(value: string): void;\n value: string;\n length: number;\n}\n\ninterface RenderBucket {\n deletionContent: FakeArrayType;\n additionContent: FakeArrayType;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n deletionSegments: HighlightSegment[];\n additionSegments: HighlightSegment[];\n}\n\nfunction createBucket(): RenderBucket {\n return {\n deletionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n additionContent: {\n push(value: string) {\n this.value += value;\n this.length++;\n },\n value: '',\n length: 0,\n },\n deletionInfo: [],\n additionInfo: [],\n deletionDecorations: [],\n additionDecorations: [],\n deletionSegments: [],\n additionSegments: [],\n };\n}\n\ninterface RenderTwoFilesProps {\n deletionFile: FileContents;\n additionFile: FileContents;\n deletionInfo: (LineInfo | undefined)[];\n additionInfo: (LineInfo | undefined)[];\n deletionDecorations: DecorationItem[];\n additionDecorations: DecorationItem[];\n options: RenderDiffOptions;\n highlighter: DiffsHighlighter;\n languageOverride: SupportedLanguages | undefined;\n}\n\nfunction renderTwoFiles({\n deletionFile,\n additionFile,\n deletionInfo,\n additionInfo,\n highlighter,\n deletionDecorations,\n additionDecorations,\n languageOverride,\n options: { theme: themeOrThemes = DEFAULT_THEMES, ...options },\n}: RenderTwoFilesProps): RenderDiffFilesResult {\n const deletionLang =\n languageOverride ?? getFiletypeFromFileName(deletionFile.name);\n const additionLang =\n languageOverride ?? getFiletypeFromFileName(additionFile.name);\n const { state, transformers } = createTransformerWithState();\n const hastConfig: CodeToHastOptions<DiffsThemeNames> = (() => {\n return typeof themeOrThemes === 'string'\n ? {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n theme: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n }\n : {\n ...options,\n // language will be overwritten for each highlight\n lang: 'text',\n themes: themeOrThemes,\n transformers,\n decorations: undefined,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n };\n })();\n\n const deletionLines = (() => {\n if (deletionFile.contents === '') {\n return [];\n }\n hastConfig.lang = deletionLang;\n state.lineInfo = deletionInfo;\n hastConfig.decorations = deletionDecorations;\n return getLineNodes(\n highlighter.codeToHast(\n cleanLastNewline(deletionFile.contents),\n hastConfig\n )\n );\n })();\n const additionLines = (() => {\n if (additionFile.contents === '') {\n return [];\n }\n hastConfig.lang = additionLang;\n hastConfig.decorations = additionDecorations;\n state.lineInfo = additionInfo;\n return getLineNodes(\n highlighter.codeToHast(\n cleanLastNewline(additionFile.contents),\n hastConfig\n )\n );\n })();\n\n return { deletionLines, additionLines };\n}\n"],"mappings":";;;;;;;;;;;;AA8BA,MAAMA,6BAAoD,EACxD,gBAAgB,OACjB;AAED,SAAgB,0BACd,MACA,aACA,SACA,EACE,gBACA,cACA,YACA,kBACyB,4BACT;AAClB,KAAI,gBAAgB;AAClB,mBAAiB;AACjB,iBAAe;QACV;AAKL,iBAAe;AACf,eAAa;;CAEf,MAAM,sBAAsB,eAAe,KAAK,aAAa;CAC7D,MAAM,uBAAuB;EAC3B,MAAM,QAAQ,QAAQ,SAAS;AAC/B,MAAI,OAAO,UAAU,SACnB,QAAO,YAAY,SAAS,MAAM,CAAC;KAGnC;CACJ,MAAM,cAAc,0BAA0B;EAC5C,OAAO,QAAQ;EACf;EACD,CAAC;CAMF,MAAM,eACJ,kBACA,CAAC,wBACA,KAAK,mBAAmB,OAAQ,KAAK,iBAAiB,OACnD,SACA,QAAQ;CAEd,MAAMC,OAA8B;EAClC,eAAe,EAAE;EACjB,eAAe,EAAE;EAClB;CAED,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,KAAK;CAChD,MAAM,4BAA4B,iBAAiB,gBAAgB;CACnE,MAAM,0BAAU,IAAI,KAA2B;CAC/C,SAAS,iBAAiB,WAAmB;EAC3C,MAAM,QAAQ,iBAAiB,IAAI;EACnC,MAAM,SAAS,QAAQ,IAAI,MAAM,IAAI,cAAc;AACnD,UAAQ,IAAI,OAAO,OAAO;AAC1B,SAAO;;CAGT,SAAS,cACP,aACA,WACA,UACA,gBACA;AACA,MAAI,qBAAqB;GACvB,IAAI,UAAU,SAAS,GAAG,GAAG;AAC7B,OACE,WAAW,QACX,QAAQ,cAAc,QAAQ,UAAU,WACxC;AACA,cAAU;KACR,aAAa;KACb,gBAAgB,eAAe;KAC/B,OAAO;KACR;AACD,aAAS,KAAK,QAAQ;;AAExB,WAAQ;;AAEV,iBAAe,KAAK,YAAY;;AAGlC,iBAAgB;EACd;EACA,WAAW;EACX;EACA;EACA,eAAe,sBAAsB,4BAA4B;EACjE,WAAW,EACT,WACA,mBACA,mBACA,oBACA,oBACA,0BACA,0BACA,gBACA,WACI;GACJ,MAAM,SAAS,iBAAiB,UAAU;AAE1C,OACE,SAAS,YACT,iBAAiB,UACjB,qBAAqB,QACrB,qBAAqB,KAErB,4BAA2B;IACzB,cAAc,KAAK,cAAc;IACjC,cAAc,KAAK,cAAc;IACjC,mBAAmB,OAAO,gBAAgB;IAC1C,mBAAmB,OAAO,gBAAgB;IAC1C,qBAAqB,OAAO;IAC5B,qBAAqB,OAAO;IAC5B;IACD,CAAC;AAGJ,OACE,qBAAqB,QACrB,sBAAsB,QACtB,4BAA4B,MAC5B;AACA,kBACE,KAAK,cAAc,oBACnB,mBACA,OAAO,kBACP,OAAO,gBACR;AACD,WAAO,aAAa,KAAK;KACvB,MAAM,SAAS,WAAW,oBAAoB;KAC9C,YAAY;KACZ,eACE,SAAS,WAAW,SAAa,sBAAsB;KACzD,WAAW,GAAG,yBAAyB,GAAG;KAC3C,CAAC;;AAGJ,OACE,qBAAqB,QACrB,sBAAsB,QACtB,4BAA4B,MAC5B;AACA,kBACE,KAAK,cAAc,oBACnB,mBACA,OAAO,kBACP,OAAO,gBACR;AACD,WAAO,aAAa,KAAK;KACvB,MAAM,SAAS,WAAW,oBAAoB;KAC9C,YAAY;KACZ,eACE,SAAS,WAAW,SAAa,sBAAsB;KACzD,WAAW,GAAG,yBAAyB,GAAG;KAC3C,CAAC;;;EAGP,CAAC;AAEF,MAAK,MAAM,UAAU,QAAQ,QAAQ,EAAE;AACrC,MACE,OAAO,gBAAgB,WAAW,KAClC,OAAO,gBAAgB,WAAW,EAElC;EAGF,MAAM,eAAe;GACnB,MAAM,KAAK,YAAY,KAAK;GAC5B,UAAU,OAAO,gBAAgB;GAClC;EACD,MAAM,eAAe;GACnB,MAAM,KAAK;GACX,UAAU,OAAO,gBAAgB;GAClC;EACD,MAAM,EAAE,eAAe,kBAAkB,eAAe;GACtD;GACA,cAAc,OAAO;GACrB,qBAAqB,OAAO;GAE5B;GACA,cAAc,OAAO;GACrB,qBAAqB,OAAO;GAE5B;GACA;GACA,kBAAkB,iBAAiB,SAAS,KAAK;GAClD,CAAC;AAEF,MAAI,gBAAgB;AAClB,QAAK,gBAAgB;AACrB,QAAK,gBAAgB;AACrB;;AAGF,MAAI,OAAO,iBAAiB,SAAS,EACnC,MAAK,MAAM,OAAO,OAAO,iBACvB,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,IAC7B,MAAK,cAAc,IAAI,cAAc,KACnC,cAAc,IAAI,iBAAiB;MAIzC,MAAK,cAAc,KAAK,GAAG,cAAc;AAE3C,MAAI,OAAO,iBAAiB,SAAS,EACnC,MAAK,MAAM,OAAO,OAAO,iBACvB,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,IAC7B,MAAK,cAAc,IAAI,cAAc,KACnC,cAAc,IAAI,iBAAiB;MAIzC,MAAK,cAAc,KAAK,GAAG,cAAc;;AAI7C,QAAO;EAAE;EAAM;EAAa;EAAe;;AAa7C,SAAS,2BAA2B,EAClC,cACA,cACA,mBACA,mBACA,qBACA,qBACA,gBACuB;AACvB,KAAI,gBAAgB,QAAQ,gBAAgB,QAAQ,iBAAiB,OACnE;AAEF,gBAAe,iBAAiB,aAAa;AAC7C,gBAAe,iBAAiB,aAAa;CAI7C,MAAM,WACJ,iBAAiB,SACb,UAAU,cAAc,aAAa,GACrC,mBAAmB,cAAc,aAAa;CACpD,MAAMC,gBAAmC,EAAE;CAC3C,MAAMC,gBAAmC,EAAE;CAC3C,MAAM,aAAa,iBAAiB;CACpC,MAAM,WAAW,SAAS,GAAG,GAAG;AAChC,MAAK,MAAM,QAAQ,UAAU;EAC3B,MAAM,aAAa,SAAS;AAC5B,MAAI,CAAC,KAAK,SAAS,CAAC,KAAK,SAAS;AAChC,kBAAe;IACb;IACA,KAAK;IACL;IACA,WAAW;IACX;IACD,CAAC;AACF,kBAAe;IACb;IACA,KAAK;IACL;IACA,WAAW;IACX;IACD,CAAC;aACO,KAAK,QACd,gBAAe;GAAE;GAAM,KAAK;GAAe;GAAY;GAAY,CAAC;MAEpE,gBAAe;GAAE;GAAM,KAAK;GAAe;GAAY;GAAY,CAAC;;CAGxE,IAAI,YAAY;AAChB,MAAK,MAAM,QAAQ,eAAe;AAChC,MAAI,KAAK,OAAO,EACd,qBAAoB,KAClB,yBAAyB;GACvB,MAAM;GACN,WAAW;GACX,YAAY,KAAK,GAAG;GACrB,CAAC,CACH;AAEH,eAAa,KAAK,GAAG;;AAEvB,aAAY;AACZ,MAAK,MAAM,QAAQ,eAAe;AAChC,MAAI,KAAK,OAAO,EACd,qBAAoB,KAClB,yBAAyB;GACvB,MAAM;GACN,WAAW;GACX,YAAY,KAAK,GAAG;GACrB,CAAC,CACH;AAEH,eAAa,KAAK,GAAG;;;AA8BzB,SAAS,eAA6B;AACpC,QAAO;EACL,iBAAiB;GACf,KAAK,OAAe;AAClB,SAAK,SAAS;AACd,SAAK;;GAEP,OAAO;GACP,QAAQ;GACT;EACD,iBAAiB;GACf,KAAK,OAAe;AAClB,SAAK,SAAS;AACd,SAAK;;GAEP,OAAO;GACP,QAAQ;GACT;EACD,cAAc,EAAE;EAChB,cAAc,EAAE;EAChB,qBAAqB,EAAE;EACvB,qBAAqB,EAAE;EACvB,kBAAkB,EAAE;EACpB,kBAAkB,EAAE;EACrB;;AAeH,SAAS,eAAe,EACtB,cACA,cACA,cACA,cACA,aACA,qBACA,qBACA,kBACA,SAAS,EAAE,OAAO,gBAAgB,eAAgB,GAAG,aACR;CAC7C,MAAM,eACJ,oBAAoB,wBAAwB,aAAa,KAAK;CAChE,MAAM,eACJ,oBAAoB,wBAAwB,aAAa,KAAK;CAChE,MAAM,EAAE,OAAO,iBAAiB,4BAA4B;CAC5D,MAAMC,oBAAwD;AAC5D,SAAO,OAAO,kBAAkB,WAC5B;GACE,GAAG;GAEH,MAAM;GACN,OAAO;GACP;GACA,aAAa;GACb,cAAc;GACd,mBAAmB,wBAAwB,QAAQ;GACpD,GACD;GACE,GAAG;GAEH,MAAM;GACN,QAAQ;GACR;GACA,aAAa;GACb,cAAc;GACd,mBAAmB,wBAAwB,QAAQ;GACpD;KACH;AA+BJ,QAAO;EAAE,sBA7BoB;AAC3B,OAAI,aAAa,aAAa,GAC5B,QAAO,EAAE;AAEX,cAAW,OAAO;AAClB,SAAM,WAAW;AACjB,cAAW,cAAc;AACzB,UAAO,aACL,YAAY,WACV,iBAAiB,aAAa,SAAS,EACvC,WACD,CACF;MACC;EAgBoB,sBAfK;AAC3B,OAAI,aAAa,aAAa,GAC5B,QAAO,EAAE;AAEX,cAAW,OAAO;AAClB,cAAW,cAAc;AACzB,SAAM,WAAW;AACjB,UAAO,aACL,YAAY,WACV,iBAAiB,aAAa,SAAS,EACvC,WACD,CACF;MACC;EAEmC"}
@@ -28,7 +28,7 @@ function renderFileWithHighlighter(file, highlighter, { theme = DEFAULT_THEMES,
28
28
  theme,
29
29
  transformers,
30
30
  defaultColor: false,
31
- cssVariablePrefix: formatCSSVariablePrefix(),
31
+ cssVariablePrefix: formatCSSVariablePrefix("token"),
32
32
  tokenizeMaxLineLength
33
33
  };
34
34
  return {
@@ -36,7 +36,7 @@ function renderFileWithHighlighter(file, highlighter, { theme = DEFAULT_THEMES,
36
36
  themes: theme,
37
37
  transformers,
38
38
  defaultColor: false,
39
- cssVariablePrefix: formatCSSVariablePrefix(),
39
+ cssVariablePrefix: formatCSSVariablePrefix("token"),
40
40
  tokenizeMaxLineLength
41
41
  };
42
42
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"renderFileWithHighlighter.js","names":["hastConfig: CodeToHastOptions<DiffsThemeNames>"],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n RenderFileOptions,\n ThemedFileResult,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\n\nexport function renderFileWithHighlighter(\n file: FileContents,\n highlighter: DiffsHighlighter,\n { theme = DEFAULT_THEMES, tokenizeMaxLineLength }: RenderFileOptions,\n forcePlainText = false\n): ThemedFileResult {\n const { state, transformers } = createTransformerWithState();\n const lang = forcePlainText\n ? 'text'\n : (file.lang ?? getFiletypeFromFileName(file.name));\n const baseThemeType = (() => {\n if (typeof theme === 'string') {\n return highlighter.getTheme(theme).type;\n }\n return undefined;\n })();\n const themeStyles = getHighlighterThemeStyles({\n theme,\n highlighter,\n });\n state.lineInfo = (shikiLineNumber: number) => ({\n type: 'context',\n lineIndex: shikiLineNumber - 1,\n lineNumber: shikiLineNumber,\n });\n const hastConfig: CodeToHastOptions<DiffsThemeNames> = (() => {\n if (typeof theme === 'string') {\n return {\n lang,\n theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n tokenizeMaxLineLength,\n };\n }\n return {\n lang,\n themes: theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix(),\n tokenizeMaxLineLength,\n };\n })();\n return {\n code: getLineNodes(\n highlighter.codeToHast(cleanLastNewline(file.contents), hastConfig)\n ),\n themeStyles,\n baseThemeType: baseThemeType,\n };\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,0BACd,MACA,aACA,EAAE,QAAQ,gBAAgB,yBAC1B,iBAAiB,OACC;CAClB,MAAM,EAAE,OAAO,iBAAiB,4BAA4B;CAC5D,MAAM,OAAO,iBACT,SACC,KAAK,QAAQ,wBAAwB,KAAK,KAAK;CACpD,MAAM,uBAAuB;AAC3B,MAAI,OAAO,UAAU,SACnB,QAAO,YAAY,SAAS,MAAM,CAAC;KAGnC;CACJ,MAAM,cAAc,0BAA0B;EAC5C;EACA;EACD,CAAC;AACF,OAAM,YAAY,qBAA6B;EAC7C,MAAM;EACN,WAAW,kBAAkB;EAC7B,YAAY;EACb;CACD,MAAMA,oBAAwD;AAC5D,MAAI,OAAO,UAAU,SACnB,QAAO;GACL;GACA;GACA;GACA,cAAc;GACd,mBAAmB,yBAAyB;GAC5C;GACD;AAEH,SAAO;GACL;GACA,QAAQ;GACR;GACA,cAAc;GACd,mBAAmB,yBAAyB;GAC5C;GACD;KACC;AACJ,QAAO;EACL,MAAM,aACJ,YAAY,WAAW,iBAAiB,KAAK,SAAS,EAAE,WAAW,CACpE;EACD;EACe;EAChB"}
1
+ {"version":3,"file":"renderFileWithHighlighter.js","names":["hastConfig: CodeToHastOptions<DiffsThemeNames>"],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n RenderFileOptions,\n ThemedFileResult,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\n\nexport function renderFileWithHighlighter(\n file: FileContents,\n highlighter: DiffsHighlighter,\n { theme = DEFAULT_THEMES, tokenizeMaxLineLength }: RenderFileOptions,\n forcePlainText = false\n): ThemedFileResult {\n const { state, transformers } = createTransformerWithState();\n const lang = forcePlainText\n ? 'text'\n : (file.lang ?? getFiletypeFromFileName(file.name));\n const baseThemeType = (() => {\n if (typeof theme === 'string') {\n return highlighter.getTheme(theme).type;\n }\n return undefined;\n })();\n const themeStyles = getHighlighterThemeStyles({\n theme,\n highlighter,\n });\n state.lineInfo = (shikiLineNumber: number) => ({\n type: 'context',\n lineIndex: shikiLineNumber - 1,\n lineNumber: shikiLineNumber,\n });\n const hastConfig: CodeToHastOptions<DiffsThemeNames> = (() => {\n if (typeof theme === 'string') {\n return {\n lang,\n theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength,\n };\n }\n return {\n lang,\n themes: theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength,\n };\n })();\n return {\n code: getLineNodes(\n highlighter.codeToHast(cleanLastNewline(file.contents), hastConfig)\n ),\n themeStyles,\n baseThemeType: baseThemeType,\n };\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgB,0BACd,MACA,aACA,EAAE,QAAQ,gBAAgB,yBAC1B,iBAAiB,OACC;CAClB,MAAM,EAAE,OAAO,iBAAiB,4BAA4B;CAC5D,MAAM,OAAO,iBACT,SACC,KAAK,QAAQ,wBAAwB,KAAK,KAAK;CACpD,MAAM,uBAAuB;AAC3B,MAAI,OAAO,UAAU,SACnB,QAAO,YAAY,SAAS,MAAM,CAAC;KAGnC;CACJ,MAAM,cAAc,0BAA0B;EAC5C;EACA;EACD,CAAC;AACF,OAAM,YAAY,qBAA6B;EAC7C,MAAM;EACN,WAAW,kBAAkB;EAC7B,YAAY;EACb;CACD,MAAMA,oBAAwD;AAC5D,MAAI,OAAO,UAAU,SACnB,QAAO;GACL;GACA;GACA;GACA,cAAc;GACd,mBAAmB,wBAAwB,QAAQ;GACnD;GACD;AAEH,SAAO;GACL;GACA,QAAQ;GACR;GACA,cAAc;GACd,mBAAmB,wBAAwB,QAAQ;GACnD;GACD;KACC;AACJ,QAAO;EACL,MAAM,aACJ,YAAY,WAAW,iBAAiB,KAAK,SAAS,EAAE,WAAW,CACpE;EACD;EACe;EAChB"}
@@ -1,20 +1,16 @@
1
1
  import { PrePropertiesConfig } from "../types.js";
2
2
 
3
3
  //#region src/utils/setWrapperNodeProps.d.ts
4
- interface SetPreNodePropertiesProps extends PrePropertiesConfig {
5
- pre: HTMLPreElement;
6
- }
7
- declare function setPreNodeProperties({
4
+ declare function setPreNodeProperties(pre: HTMLPreElement, {
8
5
  diffIndicators,
9
6
  disableBackground,
10
7
  disableLineNumbers,
11
8
  overflow,
12
- pre,
13
9
  split,
14
10
  themeStyles,
15
11
  themeType,
16
12
  totalLines
17
- }: SetPreNodePropertiesProps): HTMLPreElement;
13
+ }: PrePropertiesConfig): HTMLPreElement;
18
14
  //#endregion
19
- export { SetPreNodePropertiesProps, setPreNodeProperties };
15
+ export { setPreNodeProperties };
20
16
  //# sourceMappingURL=setWrapperNodeProps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setWrapperNodeProps.d.ts","names":[],"sources":["../../src/utils/setWrapperNodeProps.ts"],"sourcesContent":[],"mappings":";;;UAEiB,yBAAA,SAAkC;OAC5C;AADP;AAIgB,iBAAA,oBAAA,CAAA;EAAA,cAAA;EAAA,iBAAA;EAAA,kBAAA;EAAA,QAAA;EAAA,GAAA;EAAA,KAAA;EAAA,WAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EAUb,yBAVa,CAAA,EAUe,cAVf"}
1
+ {"version":3,"file":"setWrapperNodeProps.d.ts","names":[],"sources":["../../src/utils/setWrapperNodeProps.ts"],"sourcesContent":[],"mappings":";;;iBAEgB,oBAAA,MACT;;;;;;;;;GAUF,sBACF"}
@@ -1,5 +1,5 @@
1
1
  //#region src/utils/setWrapperNodeProps.ts
2
- function setPreNodeProperties({ diffIndicators, disableBackground, disableLineNumbers, overflow, pre, split, themeStyles, themeType, totalLines }) {
2
+ function setPreNodeProperties(pre, { diffIndicators, disableBackground, disableLineNumbers, overflow, split, themeStyles, themeType, totalLines }) {
3
3
  if (themeType === "system") delete pre.dataset.themeType;
4
4
  else pre.dataset.themeType = themeType;
5
5
  switch (diffIndicators) {
@@ -1 +1 @@
1
- {"version":3,"file":"setWrapperNodeProps.js","names":[],"sources":["../../src/utils/setWrapperNodeProps.ts"],"sourcesContent":["import type { PrePropertiesConfig } from '../types';\n\nexport interface SetPreNodePropertiesProps extends PrePropertiesConfig {\n pre: HTMLPreElement;\n}\n\nexport function setPreNodeProperties({\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n pre,\n split,\n themeStyles,\n themeType,\n totalLines,\n}: SetPreNodePropertiesProps): HTMLPreElement {\n if (themeType === 'system') {\n delete pre.dataset.themeType;\n } else {\n pre.dataset.themeType = themeType;\n }\n switch (diffIndicators) {\n case 'bars':\n case 'classic':\n pre.dataset.indicators = diffIndicators;\n break;\n case 'none':\n delete pre.dataset.indicators;\n break;\n }\n if (disableLineNumbers) {\n pre.dataset.disableLineNumbers = '';\n } else {\n delete pre.dataset.disableLineNumbers;\n }\n if (disableBackground) {\n delete pre.dataset.background;\n } else {\n pre.dataset.background = '';\n }\n pre.dataset.type = split ? 'split' : 'file';\n pre.dataset.overflow = overflow;\n pre.dataset.diffs = '';\n pre.tabIndex = 0;\n // Set theme color custom properties as inline styles on pre element\n pre.style = themeStyles;\n // Set CSS custom property for line number column width\n pre.style.setProperty(\n '--diffs-min-number-column-width-default',\n `${`${totalLines}`.length}ch`\n );\n return pre;\n}\n"],"mappings":";AAMA,SAAgB,qBAAqB,EACnC,gBACA,mBACA,oBACA,UACA,KACA,OACA,aACA,WACA,cAC4C;AAC5C,KAAI,cAAc,SAChB,QAAO,IAAI,QAAQ;KAEnB,KAAI,QAAQ,YAAY;AAE1B,SAAQ,gBAAR;EACE,KAAK;EACL,KAAK;AACH,OAAI,QAAQ,aAAa;AACzB;EACF,KAAK;AACH,UAAO,IAAI,QAAQ;AACnB;;AAEJ,KAAI,mBACF,KAAI,QAAQ,qBAAqB;KAEjC,QAAO,IAAI,QAAQ;AAErB,KAAI,kBACF,QAAO,IAAI,QAAQ;KAEnB,KAAI,QAAQ,aAAa;AAE3B,KAAI,QAAQ,OAAO,QAAQ,UAAU;AACrC,KAAI,QAAQ,WAAW;AACvB,KAAI,QAAQ,QAAQ;AACpB,KAAI,WAAW;AAEf,KAAI,QAAQ;AAEZ,KAAI,MAAM,YACR,2CACA,GAAG,GAAG,aAAa,OAAO,IAC3B;AACD,QAAO"}
1
+ {"version":3,"file":"setWrapperNodeProps.js","names":[],"sources":["../../src/utils/setWrapperNodeProps.ts"],"sourcesContent":["import type { PrePropertiesConfig } from '../types';\n\nexport function setPreNodeProperties(\n pre: HTMLPreElement,\n {\n diffIndicators,\n disableBackground,\n disableLineNumbers,\n overflow,\n split,\n themeStyles,\n themeType,\n totalLines,\n }: PrePropertiesConfig\n): HTMLPreElement {\n if (themeType === 'system') {\n delete pre.dataset.themeType;\n } else {\n pre.dataset.themeType = themeType;\n }\n switch (diffIndicators) {\n case 'bars':\n case 'classic':\n pre.dataset.indicators = diffIndicators;\n break;\n case 'none':\n delete pre.dataset.indicators;\n break;\n }\n if (disableLineNumbers) {\n pre.dataset.disableLineNumbers = '';\n } else {\n delete pre.dataset.disableLineNumbers;\n }\n if (disableBackground) {\n delete pre.dataset.background;\n } else {\n pre.dataset.background = '';\n }\n pre.dataset.type = split ? 'split' : 'file';\n pre.dataset.overflow = overflow;\n pre.dataset.diffs = '';\n pre.tabIndex = 0;\n // Set theme color custom properties as inline styles on pre element\n pre.style = themeStyles;\n // Set CSS custom property for line number column width\n pre.style.setProperty(\n '--diffs-min-number-column-width-default',\n `${`${totalLines}`.length}ch`\n );\n return pre;\n}\n"],"mappings":";AAEA,SAAgB,qBACd,KACA,EACE,gBACA,mBACA,oBACA,UACA,OACA,aACA,WACA,cAEc;AAChB,KAAI,cAAc,SAChB,QAAO,IAAI,QAAQ;KAEnB,KAAI,QAAQ,YAAY;AAE1B,SAAQ,gBAAR;EACE,KAAK;EACL,KAAK;AACH,OAAI,QAAQ,aAAa;AACzB;EACF,KAAK;AACH,UAAO,IAAI,QAAQ;AACnB;;AAEJ,KAAI,mBACF,KAAI,QAAQ,qBAAqB;KAEjC,QAAO,IAAI,QAAQ;AAErB,KAAI,kBACF,QAAO,IAAI,QAAQ;KAEnB,KAAI,QAAQ,aAAa;AAE3B,KAAI,QAAQ,OAAO,QAAQ,UAAU;AACrC,KAAI,QAAQ,WAAW;AACvB,KAAI,QAAQ,QAAQ;AACpB,KAAI,WAAW;AAEf,KAAI,QAAQ;AAEZ,KAAI,MAAM,YACR,2CACA,GAAG,GAAG,aAAa,OAAO,IAC3B;AACD,QAAO"}