@pierre/diffs 1.2.12 → 1.3.0-beta.10

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 (288) hide show
  1. package/dist/components/CodeView.d.ts +91 -6
  2. package/dist/components/CodeView.d.ts.map +1 -1
  3. package/dist/components/CodeView.js +300 -38
  4. package/dist/components/CodeView.js.map +1 -1
  5. package/dist/components/File.d.ts +14 -3
  6. package/dist/components/File.d.ts.map +1 -1
  7. package/dist/components/File.js +98 -12
  8. package/dist/components/File.js.map +1 -1
  9. package/dist/components/FileDiff.d.ts +68 -19
  10. package/dist/components/FileDiff.d.ts.map +1 -1
  11. package/dist/components/FileDiff.js +363 -25
  12. package/dist/components/FileDiff.js.map +1 -1
  13. package/dist/components/FileStream.d.ts.map +1 -1
  14. package/dist/components/FileStream.js +2 -1
  15. package/dist/components/FileStream.js.map +1 -1
  16. package/dist/components/UnresolvedFile.d.ts +2 -2
  17. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  18. package/dist/components/UnresolvedFile.js +2 -2
  19. package/dist/components/UnresolvedFile.js.map +1 -1
  20. package/dist/components/VirtualizedFile.d.ts +4 -2
  21. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  22. package/dist/components/VirtualizedFile.js +59 -47
  23. package/dist/components/VirtualizedFile.js.map +1 -1
  24. package/dist/components/VirtualizedFileDiff.d.ts +27 -5
  25. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.js +262 -56
  27. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  28. package/dist/components/Virtualizer.d.ts +4 -1
  29. package/dist/components/Virtualizer.d.ts.map +1 -1
  30. package/dist/components/Virtualizer.js +21 -4
  31. package/dist/components/Virtualizer.js.map +1 -1
  32. package/dist/constants.d.ts +4 -1
  33. package/dist/constants.d.ts.map +1 -1
  34. package/dist/constants.js +4 -1
  35. package/dist/constants.js.map +1 -1
  36. package/dist/editor/command.d.ts +7 -0
  37. package/dist/editor/command.d.ts.map +1 -0
  38. package/dist/editor/command.js +54 -0
  39. package/dist/editor/command.js.map +1 -0
  40. package/dist/editor/editStack.d.ts +71 -0
  41. package/dist/editor/editStack.d.ts.map +1 -0
  42. package/dist/editor/editStack.js +218 -0
  43. package/dist/editor/editStack.js.map +1 -0
  44. package/dist/editor/editor.d.ts +105 -0
  45. package/dist/editor/editor.d.ts.map +1 -0
  46. package/dist/editor/editor.js +2545 -0
  47. package/dist/editor/editor.js.map +1 -0
  48. package/dist/editor/editor2.js +6 -0
  49. package/dist/editor/editor2.js.map +1 -0
  50. package/dist/editor/index.d.ts +5 -0
  51. package/dist/editor/index.js +3 -0
  52. package/dist/editor/languages.d.ts +26 -0
  53. package/dist/editor/languages.d.ts.map +1 -0
  54. package/dist/editor/languages.js +363 -0
  55. package/dist/editor/languages.js.map +1 -0
  56. package/dist/editor/lineAnnotations.d.ts +9 -0
  57. package/dist/editor/lineAnnotations.d.ts.map +1 -0
  58. package/dist/editor/lineAnnotations.js +212 -0
  59. package/dist/editor/lineAnnotations.js.map +1 -0
  60. package/dist/editor/marker.d.ts +38 -0
  61. package/dist/editor/marker.d.ts.map +1 -0
  62. package/dist/editor/marker.js +245 -0
  63. package/dist/editor/marker.js.map +1 -0
  64. package/dist/editor/matchBrackets.d.ts +9 -0
  65. package/dist/editor/matchBrackets.d.ts.map +1 -0
  66. package/dist/editor/matchBrackets.js +138 -0
  67. package/dist/editor/matchBrackets.js.map +1 -0
  68. package/dist/editor/pieceTable.d.ts +41 -0
  69. package/dist/editor/pieceTable.d.ts.map +1 -0
  70. package/dist/editor/pieceTable.js +671 -0
  71. package/dist/editor/pieceTable.js.map +1 -0
  72. package/dist/editor/platform.d.ts +19 -0
  73. package/dist/editor/platform.d.ts.map +1 -0
  74. package/dist/editor/platform.js +57 -0
  75. package/dist/editor/platform.js.map +1 -0
  76. package/dist/editor/popover.d.ts +65 -0
  77. package/dist/editor/popover.d.ts.map +1 -0
  78. package/dist/editor/popover.js +187 -0
  79. package/dist/editor/popover.js.map +1 -0
  80. package/dist/editor/searchPanel.d.ts +40 -0
  81. package/dist/editor/searchPanel.d.ts.map +1 -0
  82. package/dist/editor/searchPanel.js +318 -0
  83. package/dist/editor/searchPanel.js.map +1 -0
  84. package/dist/editor/selection.d.ts +211 -0
  85. package/dist/editor/selection.d.ts.map +1 -0
  86. package/dist/editor/selection.js +1626 -0
  87. package/dist/editor/selection.js.map +1 -0
  88. package/dist/editor/selectionAction.d.ts +46 -0
  89. package/dist/editor/selectionAction.d.ts.map +1 -0
  90. package/dist/editor/selectionAction.js +64 -0
  91. package/dist/editor/selectionAction.js.map +1 -0
  92. package/dist/editor/sprite.d.ts +8 -0
  93. package/dist/editor/sprite.d.ts.map +1 -0
  94. package/dist/editor/sprite.js +45 -0
  95. package/dist/editor/sprite.js.map +1 -0
  96. package/dist/editor/stateStorage.d.ts +15 -0
  97. package/dist/editor/stateStorage.d.ts.map +1 -0
  98. package/dist/editor/stateStorage.js +65 -0
  99. package/dist/editor/stateStorage.js.map +1 -0
  100. package/dist/editor/textDocument.d.ts +77 -0
  101. package/dist/editor/textDocument.d.ts.map +1 -0
  102. package/dist/editor/textDocument.js +271 -0
  103. package/dist/editor/textDocument.js.map +1 -0
  104. package/dist/editor/textMeasure.d.ts +61 -0
  105. package/dist/editor/textMeasure.d.ts.map +1 -0
  106. package/dist/editor/textMeasure.js +209 -0
  107. package/dist/editor/textMeasure.js.map +1 -0
  108. package/dist/editor/tokenizer.d.ts +41 -0
  109. package/dist/editor/tokenizer.d.ts.map +1 -0
  110. package/dist/editor/tokenizer.js +513 -0
  111. package/dist/editor/tokenizer.js.map +1 -0
  112. package/dist/editor/utils.d.ts +21 -0
  113. package/dist/editor/utils.d.ts.map +1 -0
  114. package/dist/editor/utils.js +68 -0
  115. package/dist/editor/utils.js.map +1 -0
  116. package/dist/index.d.ts +10 -8
  117. package/dist/index.js +12 -10
  118. package/dist/managers/InteractionManager.d.ts +7 -0
  119. package/dist/managers/InteractionManager.d.ts.map +1 -1
  120. package/dist/managers/InteractionManager.js +22 -1
  121. package/dist/managers/InteractionManager.js.map +1 -1
  122. package/dist/managers/ResizeManager.d.ts +10 -2
  123. package/dist/managers/ResizeManager.d.ts.map +1 -1
  124. package/dist/managers/ResizeManager.js +33 -13
  125. package/dist/managers/ResizeManager.js.map +1 -1
  126. package/dist/managers/UniversalRenderingManager.d.ts +2 -1
  127. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  128. package/dist/managers/UniversalRenderingManager.js +6 -1
  129. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  130. package/dist/react/CodeView.d.ts +26 -1
  131. package/dist/react/CodeView.d.ts.map +1 -1
  132. package/dist/react/CodeView.js +82 -19
  133. package/dist/react/CodeView.js.map +1 -1
  134. package/dist/react/EditContext.d.ts +15 -0
  135. package/dist/react/EditContext.d.ts.map +1 -0
  136. package/dist/react/EditContext.js +23 -0
  137. package/dist/react/EditContext.js.map +1 -0
  138. package/dist/react/File.d.ts +3 -1
  139. package/dist/react/File.d.ts.map +1 -1
  140. package/dist/react/File.js +4 -2
  141. package/dist/react/File.js.map +1 -1
  142. package/dist/react/FileDiff.d.ts +4 -1
  143. package/dist/react/FileDiff.d.ts.map +1 -1
  144. package/dist/react/FileDiff.js +4 -2
  145. package/dist/react/FileDiff.js.map +1 -1
  146. package/dist/react/MultiFileDiff.d.ts +7 -5
  147. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  148. package/dist/react/MultiFileDiff.js +4 -2
  149. package/dist/react/MultiFileDiff.js.map +1 -1
  150. package/dist/react/PatchDiff.d.ts +4 -1
  151. package/dist/react/PatchDiff.d.ts.map +1 -1
  152. package/dist/react/PatchDiff.js +4 -2
  153. package/dist/react/PatchDiff.js.map +1 -1
  154. package/dist/react/UnresolvedFile.d.ts +1 -0
  155. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  156. package/dist/react/UnresolvedFile.js +2 -1
  157. package/dist/react/UnresolvedFile.js.map +1 -1
  158. package/dist/react/index.d.ts +3 -2
  159. package/dist/react/index.js +2 -1
  160. package/dist/react/types.d.ts +3 -0
  161. package/dist/react/types.d.ts.map +1 -1
  162. package/dist/react/utils/renderDiffChildren.d.ts +2 -0
  163. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  164. package/dist/react/utils/renderDiffChildren.js +16 -8
  165. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  166. package/dist/react/utils/renderFileChildren.d.ts +2 -0
  167. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  168. package/dist/react/utils/renderFileChildren.js +16 -8
  169. package/dist/react/utils/renderFileChildren.js.map +1 -1
  170. package/dist/react/utils/useFileDiffInstance.d.ts +3 -1
  171. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  172. package/dist/react/utils/useFileDiffInstance.js +30 -6
  173. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  174. package/dist/react/utils/useFileInstance.d.ts +4 -1
  175. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  176. package/dist/react/utils/useFileInstance.js +30 -5
  177. package/dist/react/utils/useFileInstance.js.map +1 -1
  178. package/dist/renderers/DiffHunksRenderer.d.ts +28 -2
  179. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  180. package/dist/renderers/DiffHunksRenderer.js +244 -22
  181. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  182. package/dist/renderers/FileRenderer.d.ts +8 -1
  183. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  184. package/dist/renderers/FileRenderer.js +155 -45
  185. package/dist/renderers/FileRenderer.js.map +1 -1
  186. package/dist/ssr/index.d.ts +2 -2
  187. package/dist/ssr/preloadDiffs.d.ts +11 -10
  188. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  189. package/dist/ssr/preloadDiffs.js +15 -7
  190. package/dist/ssr/preloadDiffs.js.map +1 -1
  191. package/dist/style.js +1 -1
  192. package/dist/types.d.ts +282 -5
  193. package/dist/types.d.ts.map +1 -1
  194. package/dist/utils/applyLineTextWithNewline.d.ts +5 -0
  195. package/dist/utils/applyLineTextWithNewline.d.ts.map +1 -0
  196. package/dist/utils/applyLineTextWithNewline.js +11 -0
  197. package/dist/utils/applyLineTextWithNewline.js.map +1 -0
  198. package/dist/utils/areHunkDataEqual.js +1 -1
  199. package/dist/utils/areHunkDataEqual.js.map +1 -1
  200. package/dist/utils/areManagedSnapshotsEqual.d.ts +2 -2
  201. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  202. package/dist/utils/areManagedSnapshotsEqual.js +5 -0
  203. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  204. package/dist/utils/awaitWithTimeout.d.ts +5 -0
  205. package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  206. package/dist/utils/awaitWithTimeout.js +15 -0
  207. package/dist/utils/awaitWithTimeout.js.map +1 -0
  208. package/dist/utils/cleanLastNewline.js +6 -1
  209. package/dist/utils/cleanLastNewline.js.map +1 -1
  210. package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  211. package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  212. package/dist/utils/cloneFileDiffMetadata.js +16 -0
  213. package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  214. package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  215. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  216. package/dist/utils/computeEstimatedDiffHeights.js +8 -1
  217. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  218. package/dist/utils/computeFileOffsets.d.ts +21 -0
  219. package/dist/utils/computeFileOffsets.d.ts.map +1 -0
  220. package/dist/utils/computeFileOffsets.js +51 -0
  221. package/dist/utils/computeFileOffsets.js.map +1 -0
  222. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts +5 -0
  223. package/dist/utils/createCodeViewHeaderFooterHostElement.d.ts.map +1 -0
  224. package/dist/utils/createCodeViewHeaderFooterHostElement.js +19 -0
  225. package/dist/utils/createCodeViewHeaderFooterHostElement.js.map +1 -0
  226. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  227. package/dist/utils/createFileHeaderElement.js +5 -1
  228. package/dist/utils/createFileHeaderElement.js.map +1 -1
  229. package/dist/utils/createTransformerWithState.js +9 -0
  230. package/dist/utils/createTransformerWithState.js.map +1 -1
  231. package/dist/utils/editSessionHunks.d.ts +84 -0
  232. package/dist/utils/editSessionHunks.d.ts.map +1 -0
  233. package/dist/utils/editSessionHunks.js +366 -0
  234. package/dist/utils/editSessionHunks.js.map +1 -0
  235. package/dist/utils/getDiffFileInput.d.ts +14 -0
  236. package/dist/utils/getDiffFileInput.d.ts.map +1 -0
  237. package/dist/utils/getDiffFileInput.js +24 -0
  238. package/dist/utils/getDiffFileInput.js.map +1 -0
  239. package/dist/utils/getDiffHunksRendererOptions.js +1 -0
  240. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  241. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  242. package/dist/utils/getFiletypeFromFileName.js +2 -0
  243. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  244. package/dist/utils/hydratePartialDiff.d.ts +10 -0
  245. package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  246. package/dist/utils/hydratePartialDiff.js +140 -0
  247. package/dist/utils/hydratePartialDiff.js.map +1 -0
  248. package/dist/utils/iterateOverDiff.js +3 -3
  249. package/dist/utils/iterateOverDiff.js.map +1 -1
  250. package/dist/utils/parseDiffFromFile.d.ts +1 -1
  251. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  252. package/dist/utils/parseDiffFromFile.js +26 -5
  253. package/dist/utils/parseDiffFromFile.js.map +1 -1
  254. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  255. package/dist/utils/parsePatchFiles.js +2 -0
  256. package/dist/utils/parsePatchFiles.js.map +1 -1
  257. package/dist/utils/realignChangeContent.d.ts +28 -0
  258. package/dist/utils/realignChangeContent.d.ts.map +1 -0
  259. package/dist/utils/realignChangeContent.js +142 -0
  260. package/dist/utils/realignChangeContent.js.map +1 -0
  261. package/dist/utils/renderDiffWithHighlighter.js +1 -1
  262. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  263. package/dist/utils/renderFileWithHighlighter.js +5 -14
  264. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  265. package/dist/utils/updateDiffHunks.d.ts +24 -0
  266. package/dist/utils/updateDiffHunks.d.ts.map +1 -0
  267. package/dist/utils/updateDiffHunks.js +235 -0
  268. package/dist/utils/updateDiffHunks.js.map +1 -0
  269. package/dist/utils/virtualDiffLayout.d.ts +40 -1
  270. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  271. package/dist/utils/virtualDiffLayout.js +96 -1
  272. package/dist/utils/virtualDiffLayout.js.map +1 -1
  273. package/dist/worker/WorkerPoolManager.d.ts +7 -2
  274. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  275. package/dist/worker/WorkerPoolManager.js +83 -18
  276. package/dist/worker/WorkerPoolManager.js.map +1 -1
  277. package/dist/worker/index.d.ts +2 -2
  278. package/dist/worker/types.d.ts +11 -1
  279. package/dist/worker/types.d.ts.map +1 -1
  280. package/dist/worker/worker-portable.js +46 -66
  281. package/dist/worker/worker-portable.js.map +1 -1
  282. package/dist/worker/worker.js +46 -66
  283. package/dist/worker/worker.js.map +1 -1
  284. package/package.json +12 -5
  285. package/dist/utils/iterateOverFile.d.ts +0 -50
  286. package/dist/utils/iterateOverFile.d.ts.map +0 -1
  287. package/dist/utils/iterateOverFile.js +0 -49
  288. package/dist/utils/iterateOverFile.js.map +0 -1
@@ -0,0 +1,366 @@
1
+ import { slideBlankBoundaryBlocksUp } from "./realignChangeContent.js";
2
+ import { parseDiffFromFile } from "./parseDiffFromFile.js";
3
+ import { getExpandedRegion, getTrailingExpandedRegion } from "./virtualDiffLayout.js";
4
+ import { offsetHunkContent, recomputeDiffHunksForEdit, recomputeDiffRenderLineCounts, recomputeHunkRenderLineCounts, syncHunkNoEOFCRFromFullFile } from "./updateDiffHunks.js";
5
+ //#region src/utils/editSessionHunks.ts
6
+ /**
7
+ * Drops the editor document's phantom trailing empty line (a document ending
8
+ * in a newline exposes one extra empty line the parsed diff never contains)
9
+ * so session line arrays compare like parse-derived ones.
10
+ */
11
+ function normalizeEditorLines(lines) {
12
+ if (lines.length > 1 && lines[lines.length - 1] === "") return lines.slice(0, -1);
13
+ return lines;
14
+ }
15
+ /**
16
+ * Common prefix/suffix scan between the last completed pass's lines and the
17
+ * rebuilt document lines. Returns undefined when nothing changed.
18
+ */
19
+ function findChangedLineWindow(previousLines, nextLines) {
20
+ const maxStart = Math.min(previousLines.length, nextLines.length);
21
+ let start = 0;
22
+ while (start < maxStart && previousLines[start] === nextLines[start]) start++;
23
+ let prevEnd = previousLines.length;
24
+ let nextEnd = nextLines.length;
25
+ while (prevEnd > start && nextEnd > start && previousLines[prevEnd - 1] === nextLines[nextEnd - 1]) {
26
+ prevEnd--;
27
+ nextEnd--;
28
+ }
29
+ if (start === prevEnd && start === nextEnd) return;
30
+ return {
31
+ start,
32
+ prevEnd,
33
+ nextEnd
34
+ };
35
+ }
36
+ /**
37
+ * Applies one contiguous changed window to the session skeleton: regions the
38
+ * window touches merge/grow to cover it (absorbing unchanged gap lines in
39
+ * paired old/new correspondence), a window wholly inside a gap synthesizes a
40
+ * new region, and regions after the window shift by the line delta. The
41
+ * covered region is re-diffed in place. Returns the structural change when
42
+ * the region set itself changed shape (merge/growth/synthesis).
43
+ */
44
+ function applySessionEditWindow(diff, window, parseDiffOptions) {
45
+ const { hunks } = diff;
46
+ const delta = window.nextEnd - window.prevEnd;
47
+ diff.editSessionDirty = true;
48
+ if (hunks.length === 0) {
49
+ const bounds = {
50
+ additionStart: 0,
51
+ additionEnd: diff.additionLines.length,
52
+ deletionStart: 0,
53
+ deletionEnd: diff.deletionLines.length
54
+ };
55
+ hunks.push(rediffRegion(diff, bounds, parseDiffOptions));
56
+ finalizeSessionHunks(diff, 0);
57
+ return {
58
+ type: "insert",
59
+ index: 0,
60
+ previousHunkCount: 0
61
+ };
62
+ }
63
+ let firstIndex = -1;
64
+ let lastIndex = -1;
65
+ for (let index = 0; index < hunks.length; index++) {
66
+ const hunk = hunks[index];
67
+ const regionStart = hunk.additionLineIndex;
68
+ const regionEnd = regionStart + hunk.additionCount;
69
+ if (regionStart > window.prevEnd) break;
70
+ if (window.start <= regionEnd) {
71
+ if (firstIndex === -1) firstIndex = index;
72
+ lastIndex = index;
73
+ }
74
+ }
75
+ if (firstIndex === -1) return synthesizeRegion(diff, window, delta, parseDiffOptions);
76
+ const firstHunk = hunks[firstIndex];
77
+ const lastHunk = hunks[lastIndex];
78
+ const lastHunkEnd = lastHunk.additionLineIndex + lastHunk.additionCount;
79
+ const additionStart = Math.min(firstHunk.additionLineIndex, window.start);
80
+ const additionEndBefore = Math.max(lastHunkEnd, window.prevEnd);
81
+ const regionHunk = rediffRegion(diff, {
82
+ additionStart,
83
+ additionEnd: additionEndBefore + delta,
84
+ deletionStart: firstHunk.deletionLineIndex - (firstHunk.additionLineIndex - additionStart),
85
+ deletionEnd: lastHunk.deletionLineIndex + lastHunk.deletionCount + (additionEndBefore - lastHunkEnd)
86
+ }, parseDiffOptions);
87
+ if (delta !== 0) for (let index = lastIndex + 1; index < hunks.length; index++) shiftHunkAdditionCoords(hunks[index], delta);
88
+ const previousHunkCount = hunks.length;
89
+ hunks.splice(firstIndex, lastIndex - firstIndex + 1, regionHunk);
90
+ finalizeSessionHunks(diff, firstIndex);
91
+ const regionGrew = additionStart < firstHunk.additionLineIndex || additionEndBefore > lastHunkEnd;
92
+ if (firstIndex === lastIndex && !regionGrew) return;
93
+ return {
94
+ type: "merge",
95
+ firstIndex,
96
+ lastIndex,
97
+ previousHunkCount
98
+ };
99
+ }
100
+ /**
101
+ * Applies a set of changed addition-line indexes from a pass with no line
102
+ * count change: lines inside a region re-diff that region in place; lines in
103
+ * a gap synthesize a region per gap (one window spanning that gap's changed
104
+ * lines). Returns the structural changes, if any, for escalation/remapping.
105
+ */
106
+ function applySessionChangedLines(diff, changedAdditionLineIndexes, parseDiffOptions) {
107
+ const lines = Array.from(new Set(changedAdditionLineIndexes)).filter((line) => line >= 0 && line < diff.additionLines.length).sort((a, b) => a - b);
108
+ if (lines.length === 0) return [];
109
+ const { hunks } = diff;
110
+ const regionIndexes = /* @__PURE__ */ new Set();
111
+ const gapWindows = [];
112
+ let hunkIndex = 0;
113
+ let currentGapKey = -1;
114
+ for (const line of lines) {
115
+ while (hunkIndex < hunks.length && line >= hunks[hunkIndex].additionLineIndex + hunks[hunkIndex].additionCount) hunkIndex++;
116
+ const hunk = hunks[hunkIndex];
117
+ if (hunk != null && line >= hunk.additionLineIndex) {
118
+ regionIndexes.add(hunkIndex);
119
+ continue;
120
+ }
121
+ const lastWindow = gapWindows[gapWindows.length - 1];
122
+ if (currentGapKey === hunkIndex && lastWindow != null) lastWindow[1] = line + 1;
123
+ else {
124
+ currentGapKey = hunkIndex;
125
+ gapWindows.push([line, line + 1]);
126
+ }
127
+ }
128
+ for (const index of regionIndexes) {
129
+ const hunk = hunks[index];
130
+ hunks[index] = rediffRegion(diff, {
131
+ additionStart: hunk.additionLineIndex,
132
+ additionEnd: hunk.additionLineIndex + hunk.additionCount,
133
+ deletionStart: hunk.deletionLineIndex,
134
+ deletionEnd: hunk.deletionLineIndex + hunk.deletionCount
135
+ }, parseDiffOptions);
136
+ syncHunkNoEOFCRFromFullFile(diff, index);
137
+ diff.editSessionDirty = true;
138
+ }
139
+ if (regionIndexes.size > 0) recomputeDiffRenderLineCounts(diff);
140
+ const changes = [];
141
+ for (let index = gapWindows.length - 1; index >= 0; index--) {
142
+ const [start, end] = gapWindows[index];
143
+ const change = applySessionEditWindow(diff, {
144
+ start,
145
+ prevEnd: end,
146
+ nextEnd: end
147
+ }, parseDiffOptions);
148
+ if (change != null) changes.push(change);
149
+ }
150
+ return changes;
151
+ }
152
+ /**
153
+ * Rebuilds hunk-gap expansion keys after a structural region change so
154
+ * expansion state stays anchored to the same gaps. Merged-away gap keys drop;
155
+ * a synthesized region splits its gap's expansion across the two new gaps.
156
+ * The trailing pseudo-key (old hunk count) follows the same shift.
157
+ */
158
+ function remapExpandedHunksForRegionChange(expandedHunks, change) {
159
+ const remapped = /* @__PURE__ */ new Map();
160
+ if (change.type === "merge") {
161
+ const removed = change.lastIndex - change.firstIndex;
162
+ for (const [key, region] of expandedHunks) if (key <= change.firstIndex) remapped.set(key, region);
163
+ else if (key > change.lastIndex) remapped.set(key - removed, region);
164
+ return remapped;
165
+ }
166
+ for (const [key, region] of expandedHunks) if (key < change.index) remapped.set(key, region);
167
+ else if (key > change.index) remapped.set(key + 1, region);
168
+ else {
169
+ if (region.fromStart > 0) remapped.set(key, {
170
+ fromStart: region.fromStart,
171
+ fromEnd: 0
172
+ });
173
+ if (region.fromEnd > 0) remapped.set(key + 1, {
174
+ fromStart: 0,
175
+ fromEnd: region.fromEnd
176
+ });
177
+ }
178
+ return remapped;
179
+ }
180
+ /** Snapshot the expanded gap-edge slices before the exit recompute. */
181
+ function captureExpansionAnchors(diff, expandedHunks, collapsedContextThreshold) {
182
+ const anchors = [];
183
+ if (diff.isPartial) return anchors;
184
+ for (const [hunkIndex, hunk] of diff.hunks.entries()) {
185
+ const region = getExpandedRegion({
186
+ isPartial: diff.isPartial,
187
+ rangeSize: hunk.collapsedBefore,
188
+ expandedHunks,
189
+ hunkIndex,
190
+ collapsedContextThreshold
191
+ });
192
+ if (region.rangeSize <= collapsedContextThreshold) continue;
193
+ const gapEnd = hunk.deletionLineIndex;
194
+ const gapStart = gapEnd - region.rangeSize;
195
+ if (region.fromStart > 0) anchors.push([gapStart, gapStart + region.fromStart]);
196
+ if (region.fromEnd > 0) anchors.push([gapEnd - region.fromEnd, gapEnd]);
197
+ }
198
+ const trailingRegion = getTrailingExpandedRegion({
199
+ fileDiff: diff,
200
+ hunkIndex: diff.hunks.length - 1,
201
+ expandedHunks,
202
+ collapsedContextThreshold,
203
+ errorPrefix: "captureExpansionAnchors"
204
+ });
205
+ if (trailingRegion != null && trailingRegion.fromStart > 0 && trailingRegion.rangeSize > collapsedContextThreshold) {
206
+ const lastHunk = diff.hunks[diff.hunks.length - 1];
207
+ const gapStart = lastHunk.deletionLineIndex + lastHunk.deletionCount;
208
+ anchors.push([gapStart, gapStart + trailingRegion.fromStart]);
209
+ }
210
+ return anchors;
211
+ }
212
+ /**
213
+ * Rebuild gap expansion state against the recomputed hunks: for each new
214
+ * gap, an anchor touching the gap's start edge restores `fromStart`, one
215
+ * touching its end edge restores `fromEnd`, and anchors for gaps that no
216
+ * longer exist drop.
217
+ */
218
+ function rebuildExpansionFromAnchors(diff, anchors) {
219
+ const rebuilt = /* @__PURE__ */ new Map();
220
+ if (anchors.length === 0) return rebuilt;
221
+ const applyGap = (key, gapStart, gapEnd) => {
222
+ if (gapEnd <= gapStart) return;
223
+ let fromStart = 0;
224
+ let fromEnd = 0;
225
+ for (const [start, end] of anchors) {
226
+ if (end <= gapStart || start >= gapEnd) continue;
227
+ if (start <= gapStart) fromStart = Math.max(fromStart, Math.min(end, gapEnd) - gapStart);
228
+ if (end >= gapEnd) fromEnd = Math.max(fromEnd, gapEnd - Math.max(start, gapStart));
229
+ }
230
+ if (fromStart > 0 || fromEnd > 0) rebuilt.set(key, {
231
+ fromStart,
232
+ fromEnd
233
+ });
234
+ };
235
+ for (const [hunkIndex, hunk] of diff.hunks.entries()) applyGap(hunkIndex, hunk.deletionLineIndex - Math.max(hunk.collapsedBefore, 0), hunk.deletionLineIndex);
236
+ const lastHunk = diff.hunks[diff.hunks.length - 1];
237
+ if (lastHunk != null && !diff.isPartial && diff.deletionLines.length > 0) applyGap(diff.hunks.length, lastHunk.deletionLineIndex + lastHunk.deletionCount, diff.deletionLines.length);
238
+ return rebuilt;
239
+ }
240
+ /**
241
+ * Genuine session exit: when session passes reshaped the hunks, run the real
242
+ * full recompute so exit state matches a non-session edit pipeline, and clear
243
+ * the marker. Returns true when a recompute ran.
244
+ */
245
+ function finishEditSessionForDiff(diff, parseDiffOptions) {
246
+ if (diff.editSessionDirty !== true) return false;
247
+ diff.editSessionDirty = void 0;
248
+ Object.assign(diff, recomputeDiffHunksForEdit(diff, parseDiffOptions));
249
+ return true;
250
+ }
251
+ function synthesizeRegion(diff, window, delta, parseDiffOptions) {
252
+ const { hunks } = diff;
253
+ let insertIndex = 0;
254
+ while (insertIndex < hunks.length && hunks[insertIndex].additionLineIndex < window.start) insertIndex++;
255
+ const pairOffset = insertIndex < hunks.length ? hunks[insertIndex].deletionLineIndex - hunks[insertIndex].additionLineIndex : hunks[insertIndex - 1].deletionLineIndex + hunks[insertIndex - 1].deletionCount - (hunks[insertIndex - 1].additionLineIndex + hunks[insertIndex - 1].additionCount);
256
+ let { start, prevEnd, nextEnd } = window;
257
+ if (start === prevEnd || start === nextEnd) {
258
+ if (start > 0) start--;
259
+ else if (nextEnd < diff.additionLines.length) {
260
+ prevEnd++;
261
+ nextEnd++;
262
+ }
263
+ }
264
+ const regionHunk = rediffRegion(diff, {
265
+ additionStart: start,
266
+ additionEnd: nextEnd,
267
+ deletionStart: start + pairOffset,
268
+ deletionEnd: prevEnd + pairOffset
269
+ }, parseDiffOptions);
270
+ if (delta !== 0) for (let index = insertIndex; index < hunks.length; index++) shiftHunkAdditionCoords(hunks[index], delta);
271
+ const previousHunkCount = hunks.length;
272
+ hunks.splice(insertIndex, 0, regionHunk);
273
+ finalizeSessionHunks(diff, insertIndex);
274
+ return {
275
+ type: "insert",
276
+ index: insertIndex,
277
+ previousHunkCount
278
+ };
279
+ }
280
+ function rediffRegion(diff, bounds, parseDiffOptions) {
281
+ const deletionSlice = diff.deletionLines.slice(bounds.deletionStart, bounds.deletionEnd);
282
+ const additionSlice = diff.additionLines.slice(bounds.additionStart, bounds.additionEnd);
283
+ const additionCount = additionSlice.length;
284
+ const deletionCount = deletionSlice.length;
285
+ const hunkContent = [];
286
+ let additionChangedLines = 0;
287
+ let deletionChangedLines = 0;
288
+ const pushContext = (lines, additionLineIndex, deletionLineIndex) => {
289
+ if (lines > 0) hunkContent.push({
290
+ type: "context",
291
+ lines,
292
+ additionLineIndex,
293
+ deletionLineIndex
294
+ });
295
+ };
296
+ if (deletionSlice.join("") === additionSlice.join("")) pushContext(additionCount, bounds.additionStart, bounds.deletionStart);
297
+ else {
298
+ const reparsed = parseDiffFromFile({
299
+ name: diff.prevName ?? diff.name,
300
+ contents: deletionSlice.join("")
301
+ }, {
302
+ name: diff.name,
303
+ contents: additionSlice.join(""),
304
+ lang: diff.lang
305
+ }, {
306
+ ...parseDiffOptions,
307
+ context: 0
308
+ });
309
+ let coveredAdditions = 0;
310
+ let coveredDeletions = 0;
311
+ for (const parsedHunk of reparsed.hunks) {
312
+ const contextLines = parsedHunk.additionCount > 0 ? parsedHunk.additionLineIndex - coveredAdditions : parsedHunk.deletionLineIndex - coveredDeletions;
313
+ pushContext(contextLines, bounds.additionStart + coveredAdditions, bounds.deletionStart + coveredDeletions);
314
+ coveredAdditions += contextLines;
315
+ coveredDeletions += contextLines;
316
+ for (const content of parsedHunk.hunkContent) {
317
+ const offset = offsetHunkContent(content, bounds.additionStart, bounds.deletionStart);
318
+ if (offset.type === "change") {
319
+ if (offset.additions === 0) offset.additionLineIndex = bounds.additionStart + coveredAdditions;
320
+ if (offset.deletions === 0) offset.deletionLineIndex = bounds.deletionStart + coveredDeletions;
321
+ }
322
+ hunkContent.push(offset);
323
+ }
324
+ additionChangedLines += parsedHunk.additionLines;
325
+ deletionChangedLines += parsedHunk.deletionLines;
326
+ coveredAdditions += parsedHunk.additionCount;
327
+ coveredDeletions += parsedHunk.deletionCount;
328
+ }
329
+ pushContext(additionCount - coveredAdditions, bounds.additionStart + coveredAdditions, bounds.deletionStart + coveredDeletions);
330
+ }
331
+ const hunk = {
332
+ collapsedBefore: 0,
333
+ additionStart: bounds.additionStart + 1,
334
+ additionCount,
335
+ additionLines: additionChangedLines,
336
+ additionLineIndex: bounds.additionStart,
337
+ deletionStart: bounds.deletionStart + 1,
338
+ deletionCount,
339
+ deletionLines: deletionChangedLines,
340
+ deletionLineIndex: bounds.deletionStart,
341
+ hunkContent,
342
+ hunkSpecs: `@@ -${bounds.deletionStart + 1},${deletionCount} +${bounds.additionStart + 1},${additionCount} @@`,
343
+ splitLineStart: 0,
344
+ splitLineCount: 0,
345
+ unifiedLineStart: 0,
346
+ unifiedLineCount: 0,
347
+ noEOFCRAdditions: false,
348
+ noEOFCRDeletions: false
349
+ };
350
+ slideBlankBoundaryBlocksUp(hunk, diff);
351
+ recomputeHunkRenderLineCounts(hunk);
352
+ return hunk;
353
+ }
354
+ function shiftHunkAdditionCoords(hunk, delta) {
355
+ hunk.additionLineIndex += delta;
356
+ hunk.additionStart += delta;
357
+ for (const content of hunk.hunkContent) content.additionLineIndex += delta;
358
+ }
359
+ function finalizeSessionHunks(diff, hunkIndex) {
360
+ recomputeDiffRenderLineCounts(diff);
361
+ syncHunkNoEOFCRFromFullFile(diff, hunkIndex);
362
+ }
363
+ //#endregion
364
+ export { applySessionChangedLines, applySessionEditWindow, captureExpansionAnchors, findChangedLineWindow, finishEditSessionForDiff, normalizeEditorLines, rebuildExpansionFromAnchors, remapExpandedHunksForRegionChange };
365
+
366
+ //# sourceMappingURL=editSessionHunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editSessionHunks.js","names":[],"sources":["../../src/utils/editSessionHunks.ts"],"sourcesContent":["import type { CreatePatchOptionsNonabortable } from 'diff';\n\nimport type {\n ChangeContent,\n ContextContent,\n FileDiffMetadata,\n Hunk,\n HunkExpansionRegion,\n} from '../types';\nimport { parseDiffFromFile } from './parseDiffFromFile';\nimport { slideBlankBoundaryBlocksUp } from './realignChangeContent';\nimport {\n offsetHunkContent,\n recomputeDiffHunksForEdit,\n recomputeDiffRenderLineCounts,\n recomputeHunkRenderLineCounts,\n syncHunkNoEOFCRFromFullFile,\n} from './updateDiffHunks';\nimport {\n getExpandedRegion,\n getTrailingExpandedRegion,\n} from './virtualDiffLayout';\n\n// While an editor is attached to a FileDiff, hunks are treated as a frozen\n// \"region skeleton\": each hunk is one region spanning its full range, regions\n// never merge/split/drop on their own, and each edit re-diffs only the region\n// it lands in. A region whose re-diff comes back empty persists as a\n// context-only hunk so its rows keep rendering. The functions here implement\n// that per-edit region math; the real hunk recompute runs once on genuine\n// session exit (finishEditSessionForDiff).\n\n/**\n * The addition-line span an edit changed, from a common prefix/suffix scan.\n * `start` is the first changed line (identical in pre/post-edit coordinates),\n * `prevEnd`/`nextEnd` are the exclusive ends in pre/post-edit lines.\n */\nexport interface ChangedLineWindow {\n start: number;\n prevEnd: number;\n nextEnd: number;\n}\n\n/** A structural change to the region skeleton (rendered row set changed). */\nexport type SessionRegionChange =\n | {\n type: 'merge';\n firstIndex: number;\n lastIndex: number;\n previousHunkCount: number;\n }\n | { type: 'insert'; index: number; previousHunkCount: number };\n\ninterface RegionBounds {\n additionStart: number;\n additionEnd: number;\n deletionStart: number;\n deletionEnd: number;\n}\n\n/**\n * Drops the editor document's phantom trailing empty line (a document ending\n * in a newline exposes one extra empty line the parsed diff never contains)\n * so session line arrays compare like parse-derived ones.\n */\nexport function normalizeEditorLines(lines: string[]): string[] {\n if (lines.length > 1 && lines[lines.length - 1] === '') {\n return lines.slice(0, -1);\n }\n return lines;\n}\n\n/**\n * Common prefix/suffix scan between the last completed pass's lines and the\n * rebuilt document lines. Returns undefined when nothing changed.\n */\nexport function findChangedLineWindow(\n previousLines: string[],\n nextLines: string[]\n): ChangedLineWindow | undefined {\n const maxStart = Math.min(previousLines.length, nextLines.length);\n let start = 0;\n while (start < maxStart && previousLines[start] === nextLines[start]) {\n start++;\n }\n let prevEnd = previousLines.length;\n let nextEnd = nextLines.length;\n while (\n prevEnd > start &&\n nextEnd > start &&\n previousLines[prevEnd - 1] === nextLines[nextEnd - 1]\n ) {\n prevEnd--;\n nextEnd--;\n }\n if (start === prevEnd && start === nextEnd) {\n return undefined;\n }\n return { start, prevEnd, nextEnd };\n}\n\n/**\n * Applies one contiguous changed window to the session skeleton: regions the\n * window touches merge/grow to cover it (absorbing unchanged gap lines in\n * paired old/new correspondence), a window wholly inside a gap synthesizes a\n * new region, and regions after the window shift by the line delta. The\n * covered region is re-diffed in place. Returns the structural change when\n * the region set itself changed shape (merge/growth/synthesis).\n */\nexport function applySessionEditWindow(\n diff: FileDiffMetadata,\n window: ChangedLineWindow,\n parseDiffOptions?: CreatePatchOptionsNonabortable\n): SessionRegionChange | undefined {\n const { hunks } = diff;\n const delta = window.nextEnd - window.prevEnd;\n diff.editSessionDirty = true;\n\n if (hunks.length === 0) {\n const bounds: RegionBounds = {\n additionStart: 0,\n additionEnd: diff.additionLines.length,\n deletionStart: 0,\n deletionEnd: diff.deletionLines.length,\n };\n hunks.push(rediffRegion(diff, bounds, parseDiffOptions));\n finalizeSessionHunks(diff, 0);\n return { type: 'insert', index: 0, previousHunkCount: 0 };\n }\n\n // Locate the span of regions the window touches, treating windows adjacent\n // to a region edge as touching so boundary edits grow the region instead of\n // synthesizing a sibling next to it.\n let firstIndex = -1;\n let lastIndex = -1;\n for (let index = 0; index < hunks.length; index++) {\n const hunk = hunks[index];\n const regionStart = hunk.additionLineIndex;\n const regionEnd = regionStart + hunk.additionCount;\n if (regionStart > window.prevEnd) {\n break;\n }\n if (window.start <= regionEnd) {\n if (firstIndex === -1) {\n firstIndex = index;\n }\n lastIndex = index;\n }\n }\n\n if (firstIndex === -1) {\n return synthesizeRegion(diff, window, delta, parseDiffOptions);\n }\n\n const firstHunk = hunks[firstIndex];\n const lastHunk = hunks[lastIndex];\n const lastHunkEnd = lastHunk.additionLineIndex + lastHunk.additionCount;\n const additionStart = Math.min(firstHunk.additionLineIndex, window.start);\n const additionEndBefore = Math.max(lastHunkEnd, window.prevEnd);\n // Gap lines are 1:1 paired with old-side lines, so growing a region into a\n // gap absorbs the same number of deletion lines from that gap.\n const bounds: RegionBounds = {\n additionStart,\n additionEnd: additionEndBefore + delta,\n deletionStart:\n firstHunk.deletionLineIndex -\n (firstHunk.additionLineIndex - additionStart),\n deletionEnd:\n lastHunk.deletionLineIndex +\n lastHunk.deletionCount +\n (additionEndBefore - lastHunkEnd),\n };\n const regionHunk = rediffRegion(diff, bounds, parseDiffOptions);\n if (delta !== 0) {\n for (let index = lastIndex + 1; index < hunks.length; index++) {\n shiftHunkAdditionCoords(hunks[index], delta);\n }\n }\n const previousHunkCount = hunks.length;\n hunks.splice(firstIndex, lastIndex - firstIndex + 1, regionHunk);\n finalizeSessionHunks(diff, firstIndex);\n\n const regionGrew =\n additionStart < firstHunk.additionLineIndex ||\n additionEndBefore > lastHunkEnd;\n if (firstIndex === lastIndex && !regionGrew) {\n return undefined;\n }\n return { type: 'merge', firstIndex, lastIndex, previousHunkCount };\n}\n\n/**\n * Applies a set of changed addition-line indexes from a pass with no line\n * count change: lines inside a region re-diff that region in place; lines in\n * a gap synthesize a region per gap (one window spanning that gap's changed\n * lines). Returns the structural changes, if any, for escalation/remapping.\n */\nexport function applySessionChangedLines(\n diff: FileDiffMetadata,\n changedAdditionLineIndexes: Iterable<number>,\n parseDiffOptions?: CreatePatchOptionsNonabortable\n): SessionRegionChange[] {\n const lines = Array.from(new Set(changedAdditionLineIndexes))\n .filter((line) => line >= 0 && line < diff.additionLines.length)\n .sort((a, b) => a - b);\n if (lines.length === 0) {\n return [];\n }\n\n const { hunks } = diff;\n const regionIndexes = new Set<number>();\n // Changed lines outside every region, grouped per gap (keyed by the index\n // of the region that follows the gap) into one [start, end) window each.\n const gapWindows: Array<[start: number, end: number]> = [];\n let hunkIndex = 0;\n let currentGapKey = -1;\n for (const line of lines) {\n while (\n hunkIndex < hunks.length &&\n line >=\n hunks[hunkIndex].additionLineIndex + hunks[hunkIndex].additionCount\n ) {\n hunkIndex++;\n }\n const hunk = hunks[hunkIndex];\n if (hunk != null && line >= hunk.additionLineIndex) {\n regionIndexes.add(hunkIndex);\n continue;\n }\n const lastWindow = gapWindows[gapWindows.length - 1];\n if (currentGapKey === hunkIndex && lastWindow != null) {\n lastWindow[1] = line + 1;\n } else {\n currentGapKey = hunkIndex;\n gapWindows.push([line, line + 1]);\n }\n }\n\n // In-place region re-diffs first, while region indexes are still valid.\n for (const index of regionIndexes) {\n const hunk = hunks[index];\n const bounds: RegionBounds = {\n additionStart: hunk.additionLineIndex,\n additionEnd: hunk.additionLineIndex + hunk.additionCount,\n deletionStart: hunk.deletionLineIndex,\n deletionEnd: hunk.deletionLineIndex + hunk.deletionCount,\n };\n hunks[index] = rediffRegion(diff, bounds, parseDiffOptions);\n syncHunkNoEOFCRFromFullFile(diff, index);\n diff.editSessionDirty = true;\n }\n if (regionIndexes.size > 0) {\n recomputeDiffRenderLineCounts(diff);\n }\n\n // Gap windows in descending order so earlier windows keep valid coordinates\n // while later synthesis inserts hunks behind them.\n const changes: SessionRegionChange[] = [];\n for (let index = gapWindows.length - 1; index >= 0; index--) {\n const [start, end] = gapWindows[index];\n const change = applySessionEditWindow(\n diff,\n { start, prevEnd: end, nextEnd: end },\n parseDiffOptions\n );\n if (change != null) {\n changes.push(change);\n }\n }\n return changes;\n}\n\n/**\n * Rebuilds hunk-gap expansion keys after a structural region change so\n * expansion state stays anchored to the same gaps. Merged-away gap keys drop;\n * a synthesized region splits its gap's expansion across the two new gaps.\n * The trailing pseudo-key (old hunk count) follows the same shift.\n */\nexport function remapExpandedHunksForRegionChange(\n expandedHunks: Map<number, HunkExpansionRegion>,\n change: SessionRegionChange\n): Map<number, HunkExpansionRegion> {\n const remapped = new Map<number, HunkExpansionRegion>();\n if (change.type === 'merge') {\n const removed = change.lastIndex - change.firstIndex;\n for (const [key, region] of expandedHunks) {\n if (key <= change.firstIndex) {\n remapped.set(key, region);\n } else if (key > change.lastIndex) {\n remapped.set(key - removed, region);\n }\n // Keys inside (firstIndex, lastIndex] were gaps the merge absorbed.\n }\n return remapped;\n }\n for (const [key, region] of expandedHunks) {\n if (key < change.index) {\n remapped.set(key, region);\n } else if (key > change.index) {\n remapped.set(key + 1, region);\n } else {\n // The gap this key described was split by the new region: keep its\n // start-anchored expansion on the first half and its end-anchored\n // expansion on the second.\n if (region.fromStart > 0) {\n remapped.set(key, { fromStart: region.fromStart, fromEnd: 0 });\n }\n if (region.fromEnd > 0) {\n remapped.set(key + 1, { fromStart: 0, fromEnd: region.fromEnd });\n }\n }\n }\n return remapped;\n}\n\n/**\n * An expanded gap-edge slice in old-side (deletion-line) coordinates as a\n * `[start, end)` range. Old-side coordinates survive the exit recompute\n * unchanged — edits only touch the new side — so these anchor best-effort\n * expansion preservation across the recompute.\n */\nexport type ExpansionAnchorRange = [start: number, end: number];\n\n/** Snapshot the expanded gap-edge slices before the exit recompute. */\nexport function captureExpansionAnchors(\n diff: FileDiffMetadata,\n expandedHunks: Map<number, HunkExpansionRegion>,\n collapsedContextThreshold: number\n): ExpansionAnchorRange[] {\n const anchors: ExpansionAnchorRange[] = [];\n if (diff.isPartial) {\n return anchors;\n }\n for (const [hunkIndex, hunk] of diff.hunks.entries()) {\n const region = getExpandedRegion({\n isPartial: diff.isPartial,\n rangeSize: hunk.collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n // Gaps at or below the threshold render on their own; only explicit\n // expansion state needs preserving.\n if (region.rangeSize <= collapsedContextThreshold) {\n continue;\n }\n const gapEnd = hunk.deletionLineIndex;\n const gapStart = gapEnd - region.rangeSize;\n if (region.fromStart > 0) {\n anchors.push([gapStart, gapStart + region.fromStart]);\n }\n if (region.fromEnd > 0) {\n anchors.push([gapEnd - region.fromEnd, gapEnd]);\n }\n }\n const trailingRegion = getTrailingExpandedRegion({\n fileDiff: diff,\n hunkIndex: diff.hunks.length - 1,\n expandedHunks,\n collapsedContextThreshold,\n errorPrefix: 'captureExpansionAnchors',\n });\n if (\n trailingRegion != null &&\n trailingRegion.fromStart > 0 &&\n trailingRegion.rangeSize > collapsedContextThreshold\n ) {\n const lastHunk = diff.hunks[diff.hunks.length - 1];\n const gapStart = lastHunk.deletionLineIndex + lastHunk.deletionCount;\n anchors.push([gapStart, gapStart + trailingRegion.fromStart]);\n }\n return anchors;\n}\n\n/**\n * Rebuild gap expansion state against the recomputed hunks: for each new\n * gap, an anchor touching the gap's start edge restores `fromStart`, one\n * touching its end edge restores `fromEnd`, and anchors for gaps that no\n * longer exist drop.\n */\nexport function rebuildExpansionFromAnchors(\n diff: FileDiffMetadata,\n anchors: ExpansionAnchorRange[]\n): Map<number, HunkExpansionRegion> {\n const rebuilt = new Map<number, HunkExpansionRegion>();\n if (anchors.length === 0) {\n return rebuilt;\n }\n const applyGap = (key: number, gapStart: number, gapEnd: number) => {\n if (gapEnd <= gapStart) {\n return;\n }\n let fromStart = 0;\n let fromEnd = 0;\n for (const [start, end] of anchors) {\n if (end <= gapStart || start >= gapEnd) {\n continue;\n }\n if (start <= gapStart) {\n fromStart = Math.max(fromStart, Math.min(end, gapEnd) - gapStart);\n }\n if (end >= gapEnd) {\n fromEnd = Math.max(fromEnd, gapEnd - Math.max(start, gapStart));\n }\n }\n if (fromStart > 0 || fromEnd > 0) {\n rebuilt.set(key, { fromStart, fromEnd });\n }\n };\n for (const [hunkIndex, hunk] of diff.hunks.entries()) {\n applyGap(\n hunkIndex,\n hunk.deletionLineIndex - Math.max(hunk.collapsedBefore, 0),\n hunk.deletionLineIndex\n );\n }\n const lastHunk = diff.hunks[diff.hunks.length - 1];\n if (lastHunk != null && !diff.isPartial && diff.deletionLines.length > 0) {\n applyGap(\n diff.hunks.length,\n lastHunk.deletionLineIndex + lastHunk.deletionCount,\n diff.deletionLines.length\n );\n }\n return rebuilt;\n}\n\n/**\n * Genuine session exit: when session passes reshaped the hunks, run the real\n * full recompute so exit state matches a non-session edit pipeline, and clear\n * the marker. Returns true when a recompute ran.\n */\nexport function finishEditSessionForDiff(\n diff: FileDiffMetadata,\n parseDiffOptions?: CreatePatchOptionsNonabortable\n): boolean {\n if (diff.editSessionDirty !== true) {\n return false;\n }\n diff.editSessionDirty = undefined;\n Object.assign(diff, recomputeDiffHunksForEdit(diff, parseDiffOptions));\n return true;\n}\n\n// Synthesizes a region for a window that touches no existing region. When the\n// window is empty on either side (pure insert/delete inside a gap), one\n// adjacent context line is absorbed so the re-diff anchors on real content.\nfunction synthesizeRegion(\n diff: FileDiffMetadata,\n window: ChangedLineWindow,\n delta: number,\n parseDiffOptions?: CreatePatchOptionsNonabortable\n): SessionRegionChange {\n const { hunks } = diff;\n let insertIndex = 0;\n while (\n insertIndex < hunks.length &&\n hunks[insertIndex].additionLineIndex < window.start\n ) {\n insertIndex++;\n }\n\n // Constant pairing offset between old and new line indexes within this gap.\n const pairOffset =\n insertIndex < hunks.length\n ? hunks[insertIndex].deletionLineIndex -\n hunks[insertIndex].additionLineIndex\n : hunks[insertIndex - 1].deletionLineIndex +\n hunks[insertIndex - 1].deletionCount -\n (hunks[insertIndex - 1].additionLineIndex +\n hunks[insertIndex - 1].additionCount);\n\n let { start, prevEnd, nextEnd } = window;\n if (start === prevEnd || start === nextEnd) {\n if (start > 0) {\n start--;\n } else if (nextEnd < diff.additionLines.length) {\n prevEnd++;\n nextEnd++;\n }\n }\n\n const bounds: RegionBounds = {\n additionStart: start,\n additionEnd: nextEnd,\n deletionStart: start + pairOffset,\n deletionEnd: prevEnd + pairOffset,\n };\n const regionHunk = rediffRegion(diff, bounds, parseDiffOptions);\n if (delta !== 0) {\n for (let index = insertIndex; index < hunks.length; index++) {\n shiftHunkAdditionCoords(hunks[index], delta);\n }\n }\n const previousHunkCount = hunks.length;\n hunks.splice(insertIndex, 0, regionHunk);\n finalizeSessionHunks(diff, insertIndex);\n return { type: 'insert', index: insertIndex, previousHunkCount };\n}\n\n// Re-diffs a region's old/new slices with zero context, producing one Hunk\n// spanning the region's full range. Zero result hunks yield a context-only\n// hunk (region persists while the session is active); several result hunks\n// merge into one hunkContent with the identical stretches between them\n// re-expressed as context blocks.\nfunction rediffRegion(\n diff: FileDiffMetadata,\n bounds: RegionBounds,\n parseDiffOptions?: CreatePatchOptionsNonabortable\n): Hunk {\n const deletionSlice = diff.deletionLines.slice(\n bounds.deletionStart,\n bounds.deletionEnd\n );\n const additionSlice = diff.additionLines.slice(\n bounds.additionStart,\n bounds.additionEnd\n );\n const additionCount = additionSlice.length;\n const deletionCount = deletionSlice.length;\n\n const hunkContent: (ContextContent | ChangeContent)[] = [];\n let additionChangedLines = 0;\n let deletionChangedLines = 0;\n\n const pushContext = (\n lines: number,\n additionLineIndex: number,\n deletionLineIndex: number\n ) => {\n if (lines > 0) {\n hunkContent.push({\n type: 'context',\n lines,\n additionLineIndex,\n deletionLineIndex,\n });\n }\n };\n\n if (deletionSlice.join('') === additionSlice.join('')) {\n pushContext(additionCount, bounds.additionStart, bounds.deletionStart);\n } else {\n const reparsed = parseDiffFromFile(\n {\n name: diff.prevName ?? diff.name,\n contents: deletionSlice.join(''),\n },\n {\n name: diff.name,\n contents: additionSlice.join(''),\n lang: diff.lang,\n },\n { ...parseDiffOptions, context: 0 }\n );\n // Walk the zero-context hunks, re-deriving the unchanged stretches\n // between them (context is paired, so both sides advance by the same\n // amount). The stretch length must come from a side the hunk has content\n // on: a zero-count side's start follows the unified `N,0` convention\n // (the line *before* the change), so its lineIndex is one short of the\n // lines consumed ahead of the hunk.\n let coveredAdditions = 0;\n let coveredDeletions = 0;\n for (const parsedHunk of reparsed.hunks) {\n const contextLines =\n parsedHunk.additionCount > 0\n ? parsedHunk.additionLineIndex - coveredAdditions\n : parsedHunk.deletionLineIndex - coveredDeletions;\n pushContext(\n contextLines,\n bounds.additionStart + coveredAdditions,\n bounds.deletionStart + coveredDeletions\n );\n coveredAdditions += contextLines;\n coveredDeletions += contextLines;\n for (const content of parsedHunk.hunkContent) {\n // Parsed content indexes are relative to the slice; offset them into\n // full-file coordinates. A zero-count side carries the `N,0`\n // convention (one short of the lines consumed), so pin it to the\n // running counter instead.\n const offset = offsetHunkContent(\n content,\n bounds.additionStart,\n bounds.deletionStart\n );\n if (offset.type === 'change') {\n if (offset.additions === 0) {\n offset.additionLineIndex = bounds.additionStart + coveredAdditions;\n }\n if (offset.deletions === 0) {\n offset.deletionLineIndex = bounds.deletionStart + coveredDeletions;\n }\n }\n hunkContent.push(offset);\n }\n additionChangedLines += parsedHunk.additionLines;\n deletionChangedLines += parsedHunk.deletionLines;\n coveredAdditions += parsedHunk.additionCount;\n coveredDeletions += parsedHunk.deletionCount;\n }\n pushContext(\n additionCount - coveredAdditions,\n bounds.additionStart + coveredAdditions,\n bounds.deletionStart + coveredDeletions\n );\n }\n\n const hunk: Hunk = {\n collapsedBefore: 0,\n additionStart: bounds.additionStart + 1,\n additionCount,\n additionLines: additionChangedLines,\n additionLineIndex: bounds.additionStart,\n deletionStart: bounds.deletionStart + 1,\n deletionCount,\n deletionLines: deletionChangedLines,\n deletionLineIndex: bounds.deletionStart,\n hunkContent,\n hunkSpecs: `@@ -${bounds.deletionStart + 1},${deletionCount} +${bounds.additionStart + 1},${additionCount} @@`,\n splitLineStart: 0,\n splitLineCount: 0,\n unifiedLineStart: 0,\n unifiedLineCount: 0,\n noEOFCRAdditions: false,\n noEOFCRDeletions: false,\n };\n // The inner parse runs with zero context, so blank-run slides can only\n // apply once the context blocks are reassembled here — keeping the session\n // rendering identical to the exit parse, which slides in its own post-pass.\n slideBlankBoundaryBlocksUp(hunk, diff);\n recomputeHunkRenderLineCounts(hunk);\n return hunk;\n}\n\nfunction shiftHunkAdditionCoords(hunk: Hunk, delta: number): void {\n hunk.additionLineIndex += delta;\n hunk.additionStart += delta;\n for (const content of hunk.hunkContent) {\n content.additionLineIndex += delta;\n }\n}\n\nfunction finalizeSessionHunks(diff: FileDiffMetadata, hunkIndex: number): void {\n recomputeDiffRenderLineCounts(diff);\n syncHunkNoEOFCRFromFullFile(diff, hunkIndex);\n}\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { DiffFileInput, FileContents } from "../types.js";
2
+
3
+ //#region src/utils/getDiffFileInput.d.ts
4
+ interface GetDiffFileInputProps {
5
+ oldFile?: FileContents | null;
6
+ newFile?: FileContents | null;
7
+ }
8
+ declare function getDiffFileInput({
9
+ oldFile,
10
+ newFile
11
+ }: GetDiffFileInputProps, context: string): DiffFileInput | undefined;
12
+ //#endregion
13
+ export { getDiffFileInput };
14
+ //# sourceMappingURL=getDiffFileInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDiffFileInput.d.ts","names":[],"sources":["../../src/utils/getDiffFileInput.ts"],"mappings":";;;UAEU,qBAAA;EACR,OAAA,GAAU,YAAA;EACV,OAAA,GAAU,YAAY;AAAA;AAAA,iBAGR,gBAAA;EACZ,OAAA;EAAS;AAAA,GAAW,qBAAA,EACtB,OAAA,WACC,aAAA"}
@@ -0,0 +1,24 @@
1
+ //#region src/utils/getDiffFileInput.ts
2
+ function getDiffFileInput({ oldFile, newFile }, context) {
3
+ if (oldFile === void 0 && newFile === void 0) return;
4
+ if (oldFile === void 0 || newFile === void 0) throw new Error(`${context}: Pass null for an intentionally missing oldFile or newFile side`);
5
+ if (oldFile === null) {
6
+ if (newFile === null) throw new Error(`${context}: You must pass oldFile, newFile, or both`);
7
+ return {
8
+ oldFile,
9
+ newFile
10
+ };
11
+ }
12
+ if (newFile === null) return {
13
+ oldFile,
14
+ newFile
15
+ };
16
+ return {
17
+ oldFile,
18
+ newFile
19
+ };
20
+ }
21
+ //#endregion
22
+ export { getDiffFileInput };
23
+
24
+ //# sourceMappingURL=getDiffFileInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDiffFileInput.js","names":[],"sources":["../../src/utils/getDiffFileInput.ts"],"sourcesContent":["import type { DiffFileInput, FileContents } from '../types';\n\ninterface GetDiffFileInputProps {\n oldFile?: FileContents | null;\n newFile?: FileContents | null;\n}\n\nexport function getDiffFileInput(\n { oldFile, newFile }: GetDiffFileInputProps,\n context: string\n): DiffFileInput | undefined {\n if (oldFile === undefined && newFile === undefined) {\n return undefined;\n }\n if (oldFile === undefined || newFile === undefined) {\n throw new Error(\n `${context}: Pass null for an intentionally missing oldFile or newFile side`\n );\n }\n if (oldFile === null) {\n if (newFile === null) {\n throw new Error(`${context}: You must pass oldFile, newFile, or both`);\n }\n return { oldFile, newFile };\n }\n if (newFile === null) {\n return { oldFile, newFile };\n }\n return { oldFile, newFile };\n}\n"],"mappings":";AAOA,SAAgB,iBACd,EAAE,SAAS,WACX,SAC2B;CAC3B,IAAI,YAAY,KAAA,KAAa,YAAY,KAAA,GACvC;CAEF,IAAI,YAAY,KAAA,KAAa,YAAY,KAAA,GACvC,MAAM,IAAI,MACR,GAAG,QAAQ,iEACb;CAEF,IAAI,YAAY,MAAM;EACpB,IAAI,YAAY,MACd,MAAM,IAAI,MAAM,GAAG,QAAQ,0CAA0C;EAEvE,OAAO;GAAE;GAAS;EAAQ;CAC5B;CACA,IAAI,YAAY,MACd,OAAO;EAAE;EAAS;CAAQ;CAE5B,OAAO;EAAE;EAAS;CAAQ;AAC5B"}
@@ -18,6 +18,7 @@ function getDiffHunksRendererOptions(options) {
18
18
  disableBackground: options?.disableBackground,
19
19
  hunkSeparators: typeof options?.hunkSeparators === "function" ? "custom" : options?.hunkSeparators,
20
20
  expandUnchanged: options?.expandUnchanged,
21
+ loadDiffFiles: options?.loadDiffFiles,
21
22
  collapsedContextThreshold: options?.collapsedContextThreshold,
22
23
  lineDiffType: options?.lineDiffType,
23
24
  maxLineDiffLength: options?.maxLineDiffLength,
@@ -1 +1 @@
1
- {"version":3,"file":"getDiffHunksRendererOptions.js","names":[],"sources":["../../src/utils/getDiffHunksRendererOptions.ts"],"sourcesContent":["import type { FileDiffOptions } from '../components/FileDiff';\nimport type { DiffHunksRendererOptions } from '../renderers/DiffHunksRenderer';\n\n// Build the renderer option snapshot with direct property reads. CodeView item\n// options may inherit prototype getters, so object spread can miss values.\nexport function getDiffHunksRendererOptions<LAnnotation>(\n options: FileDiffOptions<LAnnotation> | undefined\n): DiffHunksRendererOptions {\n return {\n theme: options?.theme,\n disableLineNumbers: options?.disableLineNumbers,\n overflow: options?.overflow,\n collapsed: options?.collapsed,\n disableFileHeader: options?.disableFileHeader,\n disableVirtualizationBuffers: options?.disableVirtualizationBuffers,\n stickyHeader: options?.stickyHeader,\n preferredHighlighter: options?.preferredHighlighter,\n useCSSClasses: options?.useCSSClasses,\n useTokenTransformer: options?.useTokenTransformer,\n tokenizeMaxLineLength: options?.tokenizeMaxLineLength,\n tokenizeMaxLength: options?.tokenizeMaxLength,\n diffStyle: options?.diffStyle,\n diffIndicators: options?.diffIndicators,\n disableBackground: options?.disableBackground,\n hunkSeparators:\n typeof options?.hunkSeparators === 'function'\n ? 'custom'\n : options?.hunkSeparators,\n expandUnchanged: options?.expandUnchanged,\n collapsedContextThreshold: options?.collapsedContextThreshold,\n lineDiffType: options?.lineDiffType,\n maxLineDiffLength: options?.maxLineDiffLength,\n expansionLineCount: options?.expansionLineCount,\n headerRenderMode:\n options?.renderCustomHeader != null ? 'custom' : 'default',\n };\n}\n"],"mappings":";AAKA,SAAgB,4BACd,SAC0B;CAC1B,OAAO;EACL,OAAO,SAAS;EAChB,oBAAoB,SAAS;EAC7B,UAAU,SAAS;EACnB,WAAW,SAAS;EACpB,mBAAmB,SAAS;EAC5B,8BAA8B,SAAS;EACvC,cAAc,SAAS;EACvB,sBAAsB,SAAS;EAC/B,eAAe,SAAS;EACxB,qBAAqB,SAAS;EAC9B,uBAAuB,SAAS;EAChC,mBAAmB,SAAS;EAC5B,WAAW,SAAS;EACpB,gBAAgB,SAAS;EACzB,mBAAmB,SAAS;EAC5B,gBACE,OAAO,SAAS,mBAAmB,aAC/B,WACA,SAAS;EACf,iBAAiB,SAAS;EAC1B,2BAA2B,SAAS;EACpC,cAAc,SAAS;EACvB,mBAAmB,SAAS;EAC5B,oBAAoB,SAAS;EAC7B,kBACE,SAAS,sBAAsB,OAAO,WAAW;CACrD;AACF"}
1
+ {"version":3,"file":"getDiffHunksRendererOptions.js","names":[],"sources":["../../src/utils/getDiffHunksRendererOptions.ts"],"sourcesContent":["import type { FileDiffOptions } from '../components/FileDiff';\nimport type { DiffHunksRendererOptions } from '../renderers/DiffHunksRenderer';\n\n// Build the renderer option snapshot with direct property reads. CodeView item\n// options may inherit prototype getters, so object spread can miss values.\nexport function getDiffHunksRendererOptions<LAnnotation>(\n options: FileDiffOptions<LAnnotation> | undefined\n): DiffHunksRendererOptions {\n return {\n theme: options?.theme,\n disableLineNumbers: options?.disableLineNumbers,\n overflow: options?.overflow,\n collapsed: options?.collapsed,\n disableFileHeader: options?.disableFileHeader,\n disableVirtualizationBuffers: options?.disableVirtualizationBuffers,\n stickyHeader: options?.stickyHeader,\n preferredHighlighter: options?.preferredHighlighter,\n useCSSClasses: options?.useCSSClasses,\n useTokenTransformer: options?.useTokenTransformer,\n tokenizeMaxLineLength: options?.tokenizeMaxLineLength,\n tokenizeMaxLength: options?.tokenizeMaxLength,\n diffStyle: options?.diffStyle,\n diffIndicators: options?.diffIndicators,\n disableBackground: options?.disableBackground,\n hunkSeparators:\n typeof options?.hunkSeparators === 'function'\n ? 'custom'\n : options?.hunkSeparators,\n expandUnchanged: options?.expandUnchanged,\n loadDiffFiles: options?.loadDiffFiles,\n collapsedContextThreshold: options?.collapsedContextThreshold,\n lineDiffType: options?.lineDiffType,\n maxLineDiffLength: options?.maxLineDiffLength,\n expansionLineCount: options?.expansionLineCount,\n headerRenderMode:\n options?.renderCustomHeader != null ? 'custom' : 'default',\n };\n}\n"],"mappings":";AAKA,SAAgB,4BACd,SAC0B;CAC1B,OAAO;EACL,OAAO,SAAS;EAChB,oBAAoB,SAAS;EAC7B,UAAU,SAAS;EACnB,WAAW,SAAS;EACpB,mBAAmB,SAAS;EAC5B,8BAA8B,SAAS;EACvC,cAAc,SAAS;EACvB,sBAAsB,SAAS;EAC/B,eAAe,SAAS;EACxB,qBAAqB,SAAS;EAC9B,uBAAuB,SAAS;EAChC,mBAAmB,SAAS;EAC5B,WAAW,SAAS;EACpB,gBAAgB,SAAS;EACzB,mBAAmB,SAAS;EAC5B,gBACE,OAAO,SAAS,mBAAmB,aAC/B,WACA,SAAS;EACf,iBAAiB,SAAS;EAC1B,eAAe,SAAS;EACxB,2BAA2B,SAAS;EACpC,cAAc,SAAS;EACvB,mBAAmB,SAAS;EAC5B,oBAAoB,SAAS;EAC7B,kBACE,SAAS,sBAAsB,OAAO,WAAW;CACrD;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"getFiletypeFromFileName.d.ts","names":[],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"mappings":";;;cAOa,wBAAA,EAA0B,kBAwVtC;AAAA,iBAEe,uBAAA,CAAwB,QAAA,WAAmB,kBAAkB;AAAA,iBA4B7D,uBAAA,CACd,OAAA,UACA,GAAA,EAAK,kBAAkB;AAAA,iBAgBT,0BAAA;AAAA,iBAIA,kBAAA,CACd,GAAA,UACA,IAAA,EAAM,kBAAkB;AAAA,iBAgBV,sBAAA,IAA0B,kBAAkB"}
1
+ {"version":3,"file":"getFiletypeFromFileName.d.ts","names":[],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"mappings":";;;cAOa,wBAAA,EAA0B,kBA0VtC;AAAA,iBAEe,uBAAA,CAAwB,QAAA,WAAmB,kBAAkB;AAAA,iBA4B7D,uBAAA,CACd,OAAA,UACA,GAAA,EAAK,kBAAkB;AAAA,iBAgBT,0BAAA;AAAA,iBAIA,kBAAA,CACd,GAAA,UACA,IAAA,EAAM,kBAAkB;AAAA,iBAgBV,sBAAA,IAA0B,kBAAkB"}
@@ -310,6 +310,8 @@ const EXTENSION_TO_FILE_FORMAT = {
310
310
  tfvars: "tfvars",
311
311
  toml: "toml",
312
312
  ts: "typescript",
313
+ mts: "typescript",
314
+ cts: "typescript",
313
315
  tsp: "typespec",
314
316
  tsv: "tsv",
315
317
  tsx: "tsx",
@@ -1 +1 @@
1
- {"version":3,"file":"getFiletypeFromFileName.js","names":[],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"sourcesContent":["import type { ExtensionFormatMap, SupportedLanguages } from '../types';\n\nconst CUSTOM_EXTENSION_TO_FILE_FORMAT: Map<string, SupportedLanguages> =\n new Map();\n\nlet customExtensionsVersion = 0;\n\nexport const EXTENSION_TO_FILE_FORMAT: ExtensionFormatMap = {\n '1c': '1c',\n abap: 'abap',\n as: 'actionscript-3',\n ada: 'ada',\n adb: 'ada',\n ads: 'ada',\n adoc: 'asciidoc',\n asciidoc: 'asciidoc',\n 'component.html': 'angular-html',\n 'component.ts': 'angular-ts',\n conf: 'nginx',\n htaccess: 'apache',\n cls: 'tex',\n trigger: 'apex',\n apl: 'apl',\n applescript: 'applescript',\n scpt: 'applescript',\n ara: 'ara',\n asm: 'asm',\n s: 'riscv',\n astro: 'astro',\n awk: 'awk',\n bal: 'ballerina',\n sh: 'zsh',\n bash: 'zsh',\n bat: 'cmd',\n cmd: 'cmd',\n be: 'berry',\n beancount: 'beancount',\n bib: 'bibtex',\n bicep: 'bicep',\n 'blade.php': 'blade',\n bsl: 'bsl',\n c: 'c',\n h: 'objective-cpp',\n cs: 'csharp',\n cpp: 'cpp',\n hpp: 'cpp',\n cc: 'cpp',\n cxx: 'cpp',\n hh: 'cpp',\n cdc: 'cdc',\n cairo: 'cairo',\n clar: 'clarity',\n clj: 'clojure',\n cljs: 'clojure',\n cljc: 'clojure',\n soy: 'soy',\n cmake: 'cmake',\n 'CMakeLists.txt': 'cmake',\n cob: 'cobol',\n cbl: 'cobol',\n cobol: 'cobol',\n CODEOWNERS: 'codeowners',\n ql: 'ql',\n coffee: 'coffeescript',\n lisp: 'lisp',\n cl: 'lisp',\n lsp: 'lisp',\n log: 'log',\n v: 'verilog',\n cql: 'cql',\n cr: 'crystal',\n css: 'css',\n csv: 'csv',\n cue: 'cue',\n cypher: 'cypher',\n cyp: 'cypher',\n d: 'd',\n dart: 'dart',\n dax: 'dax',\n desktop: 'desktop',\n diff: 'diff',\n patch: 'diff',\n Dockerfile: 'dockerfile',\n dockerfile: 'dockerfile',\n env: 'dotenv',\n dm: 'dream-maker',\n edge: 'edge',\n el: 'emacs-lisp',\n ex: 'elixir',\n exs: 'elixir',\n elm: 'elm',\n erb: 'erb',\n erl: 'erlang',\n hrl: 'erlang',\n f: 'fortran-fixed-form',\n for: 'fortran-fixed-form',\n fs: 'fsharp',\n fsi: 'fsharp',\n fsx: 'fsharp',\n f03: 'f03',\n f08: 'f08',\n f18: 'f18',\n f77: 'f77',\n f90: 'fortran-free-form',\n f95: 'fortran-free-form',\n fnl: 'fennel',\n fish: 'fish',\n ftl: 'ftl',\n tres: 'gdresource',\n res: 'gdresource',\n gd: 'gdscript',\n gdshader: 'gdshader',\n gs: 'genie',\n feature: 'gherkin',\n COMMIT_EDITMSG: 'git-commit',\n 'git-rebase-todo': 'git-rebase',\n gjs: 'glimmer-js',\n gleam: 'gleam',\n gts: 'glimmer-ts',\n glsl: 'glsl',\n vert: 'glsl',\n frag: 'glsl',\n shader: 'shaderlab',\n gp: 'gnuplot',\n plt: 'gnuplot',\n gnuplot: 'gnuplot',\n go: 'go',\n graphql: 'graphql',\n gql: 'graphql',\n groovy: 'groovy',\n gvy: 'groovy',\n hack: 'hack',\n haml: 'haml',\n hbs: 'handlebars',\n handlebars: 'handlebars',\n hs: 'haskell',\n lhs: 'haskell',\n hx: 'haxe',\n hcl: 'hcl',\n hjson: 'hjson',\n hlsl: 'hlsl',\n fx: 'hlsl',\n html: 'html',\n htm: 'html',\n http: 'http',\n rest: 'http',\n hxml: 'hxml',\n hy: 'hy',\n imba: 'imba',\n ini: 'ini',\n cfg: 'ini',\n jade: 'pug',\n pug: 'pug',\n java: 'java',\n js: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n jinja: 'jinja',\n jinja2: 'jinja',\n j2: 'jinja',\n jison: 'jison',\n jl: 'julia',\n json: 'json',\n json5: 'json5',\n jsonc: 'jsonc',\n jsonl: 'jsonl',\n jsonnet: 'jsonnet',\n libsonnet: 'jsonnet',\n jssm: 'jssm',\n jsx: 'jsx',\n kt: 'kotlin',\n kts: 'kts',\n kql: 'kusto',\n tex: 'tex',\n ltx: 'tex',\n lean: 'lean4',\n less: 'less',\n liquid: 'liquid',\n lit: 'lit',\n ll: 'llvm',\n logo: 'logo',\n lua: 'lua',\n luau: 'luau',\n Makefile: 'makefile',\n mk: 'makefile',\n makefile: 'makefile',\n md: 'markdown',\n markdown: 'markdown',\n marko: 'marko',\n m: 'wolfram',\n mat: 'matlab',\n mdc: 'mdc',\n mdx: 'mdx',\n wiki: 'wikitext',\n mediawiki: 'wikitext',\n mmd: 'mermaid',\n mermaid: 'mermaid',\n mips: 'mipsasm',\n mojo: 'mojo',\n '🔥': 'mojo',\n move: 'move',\n nar: 'narrat',\n nf: 'nextflow',\n nim: 'nim',\n nims: 'nim',\n nimble: 'nim',\n nix: 'nix',\n nu: 'nushell',\n mm: 'objective-cpp',\n ml: 'ocaml',\n mli: 'ocaml',\n mll: 'ocaml',\n mly: 'ocaml',\n pas: 'pascal',\n p: 'pascal',\n pl: 'prolog',\n pm: 'perl',\n t: 'perl',\n raku: 'raku',\n p6: 'raku',\n pl6: 'raku',\n php: 'php',\n phtml: 'php',\n pls: 'plsql',\n sql: 'sql',\n po: 'po',\n polar: 'polar',\n pcss: 'postcss',\n pot: 'pot',\n potx: 'potx',\n pq: 'powerquery',\n pqm: 'powerquery',\n ps1: 'powershell',\n psm1: 'powershell',\n psd1: 'powershell',\n prisma: 'prisma',\n pro: 'prolog',\n P: 'prolog',\n properties: 'properties',\n proto: 'protobuf',\n pp: 'puppet',\n purs: 'purescript',\n py: 'python',\n pyw: 'python',\n pyi: 'python',\n qml: 'qml',\n qmldir: 'qmldir',\n qss: 'qss',\n r: 'r',\n R: 'r',\n rkt: 'racket',\n rktl: 'racket',\n razor: 'razor',\n cshtml: 'razor',\n rb: 'ruby',\n rbw: 'ruby',\n reg: 'reg',\n regex: 'regexp',\n rel: 'rel',\n rs: 'rust',\n rst: 'rst',\n rake: 'ruby',\n gemspec: 'ruby',\n jbuilder: 'ruby',\n builder: 'ruby',\n rabl: 'ruby',\n arb: 'ruby',\n ru: 'ruby',\n podspec: 'ruby',\n Gemfile: 'ruby',\n Rakefile: 'ruby',\n Guardfile: 'ruby',\n Capfile: 'ruby',\n Berksfile: 'ruby',\n Brewfile: 'ruby',\n Vagrantfile: 'ruby',\n Thorfile: 'ruby',\n Appraisals: 'ruby',\n Dangerfile: 'ruby',\n sas: 'sas',\n sass: 'sass',\n scala: 'scala',\n sc: 'scala',\n scm: 'scheme',\n ss: 'scheme',\n sld: 'scheme',\n scss: 'scss',\n sdbl: 'sdbl',\n shadergraph: 'shader',\n st: 'smalltalk',\n sol: 'solidity',\n sparql: 'sparql',\n rq: 'sparql',\n spl: 'splunk',\n config: 'ssh-config',\n do: 'stata',\n ado: 'stata',\n dta: 'stata',\n styl: 'stylus',\n stylus: 'stylus',\n svelte: 'svelte',\n swift: 'swift',\n sv: 'system-verilog',\n svh: 'system-verilog',\n service: 'systemd',\n socket: 'systemd',\n device: 'systemd',\n timer: 'systemd',\n talon: 'talonscript',\n tasl: 'tasl',\n tcl: 'tcl',\n templ: 'templ',\n tf: 'tf',\n tfvars: 'tfvars',\n toml: 'toml',\n ts: 'typescript',\n tsp: 'typespec',\n tsv: 'tsv',\n tsx: 'tsx',\n ttl: 'turtle',\n twig: 'twig',\n typ: 'typst',\n vv: 'v',\n vala: 'vala',\n vapi: 'vala',\n vb: 'vb',\n vbs: 'vb',\n bas: 'vb',\n vh: 'verilog',\n vhd: 'vhdl',\n vhdl: 'vhdl',\n vim: 'vimscript',\n vue: 'vue',\n 'vine.ts': 'vue-vine',\n vy: 'vyper',\n wasm: 'wasm',\n wat: 'wasm',\n wy: '文言',\n wgsl: 'wgsl',\n wit: 'wit',\n wl: 'wolfram',\n nb: 'wolfram',\n xml: 'xml',\n xsl: 'xsl',\n xslt: 'xsl',\n yaml: 'yaml',\n yml: 'yml',\n zs: 'zenscript',\n zig: 'zig',\n zsh: 'zsh',\n sty: 'tex',\n};\n\nexport function getFiletypeFromFileName(fileName: string): SupportedLanguages {\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(fileName)) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(fileName) ?? 'text';\n }\n // Handle special files without extensions first\n if (EXTENSION_TO_FILE_FORMAT[fileName] != null) {\n return EXTENSION_TO_FILE_FORMAT[fileName];\n }\n\n // Try compound extensions first (e.g., .blade.php, .component.ts)\n const compoundMatch = fileName.match(/\\.([^/\\\\]+\\.[^/\\\\]+)$/);\n if (compoundMatch != null) {\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(compoundMatch[1])) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(compoundMatch[1]) ?? 'text';\n }\n if (EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] != null) {\n return EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] ?? 'text';\n }\n }\n\n // Fall back to simple extension\n const simpleMatch = fileName.match(/\\.([^.]+)$/)?.[1] ?? '';\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(simpleMatch)) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(simpleMatch) ?? 'text';\n }\n return EXTENSION_TO_FILE_FORMAT[simpleMatch] ?? 'text';\n}\n\nexport function replaceCustomExtensions(\n version: number,\n map: ExtensionFormatMap\n): boolean {\n if (version <= customExtensionsVersion) {\n return false;\n }\n CUSTOM_EXTENSION_TO_FILE_FORMAT.clear();\n for (const key in map) {\n const lang = map[key];\n if (lang != null) {\n CUSTOM_EXTENSION_TO_FILE_FORMAT.set(key, lang);\n }\n }\n customExtensionsVersion = version;\n return true;\n}\n\nexport function getCustomExtensionsVersion(): number {\n return customExtensionsVersion;\n}\n\nexport function setCustomExtension(\n key: string,\n lang: SupportedLanguages\n): boolean {\n const existing = CUSTOM_EXTENSION_TO_FILE_FORMAT.get(key);\n if (existing === lang) {\n return false;\n }\n if (existing != null) {\n console.warn(\n `setCustomExtension: overriding custom mapping for \"${key}\" from \"${existing}\" to \"${lang}\"`\n );\n }\n CUSTOM_EXTENSION_TO_FILE_FORMAT.set(key, lang);\n customExtensionsVersion++;\n return true;\n}\n\nexport function getCustomExtensionsMap(): ExtensionFormatMap {\n return Object.fromEntries(\n CUSTOM_EXTENSION_TO_FILE_FORMAT\n ) as ExtensionFormatMap;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"getFiletypeFromFileName.js","names":[],"sources":["../../src/utils/getFiletypeFromFileName.ts"],"sourcesContent":["import type { ExtensionFormatMap, SupportedLanguages } from '../types';\n\nconst CUSTOM_EXTENSION_TO_FILE_FORMAT: Map<string, SupportedLanguages> =\n new Map();\n\nlet customExtensionsVersion = 0;\n\nexport const EXTENSION_TO_FILE_FORMAT: ExtensionFormatMap = {\n '1c': '1c',\n abap: 'abap',\n as: 'actionscript-3',\n ada: 'ada',\n adb: 'ada',\n ads: 'ada',\n adoc: 'asciidoc',\n asciidoc: 'asciidoc',\n 'component.html': 'angular-html',\n 'component.ts': 'angular-ts',\n conf: 'nginx',\n htaccess: 'apache',\n cls: 'tex',\n trigger: 'apex',\n apl: 'apl',\n applescript: 'applescript',\n scpt: 'applescript',\n ara: 'ara',\n asm: 'asm',\n s: 'riscv',\n astro: 'astro',\n awk: 'awk',\n bal: 'ballerina',\n sh: 'zsh',\n bash: 'zsh',\n bat: 'cmd',\n cmd: 'cmd',\n be: 'berry',\n beancount: 'beancount',\n bib: 'bibtex',\n bicep: 'bicep',\n 'blade.php': 'blade',\n bsl: 'bsl',\n c: 'c',\n h: 'objective-cpp',\n cs: 'csharp',\n cpp: 'cpp',\n hpp: 'cpp',\n cc: 'cpp',\n cxx: 'cpp',\n hh: 'cpp',\n cdc: 'cdc',\n cairo: 'cairo',\n clar: 'clarity',\n clj: 'clojure',\n cljs: 'clojure',\n cljc: 'clojure',\n soy: 'soy',\n cmake: 'cmake',\n 'CMakeLists.txt': 'cmake',\n cob: 'cobol',\n cbl: 'cobol',\n cobol: 'cobol',\n CODEOWNERS: 'codeowners',\n ql: 'ql',\n coffee: 'coffeescript',\n lisp: 'lisp',\n cl: 'lisp',\n lsp: 'lisp',\n log: 'log',\n v: 'verilog',\n cql: 'cql',\n cr: 'crystal',\n css: 'css',\n csv: 'csv',\n cue: 'cue',\n cypher: 'cypher',\n cyp: 'cypher',\n d: 'd',\n dart: 'dart',\n dax: 'dax',\n desktop: 'desktop',\n diff: 'diff',\n patch: 'diff',\n Dockerfile: 'dockerfile',\n dockerfile: 'dockerfile',\n env: 'dotenv',\n dm: 'dream-maker',\n edge: 'edge',\n el: 'emacs-lisp',\n ex: 'elixir',\n exs: 'elixir',\n elm: 'elm',\n erb: 'erb',\n erl: 'erlang',\n hrl: 'erlang',\n f: 'fortran-fixed-form',\n for: 'fortran-fixed-form',\n fs: 'fsharp',\n fsi: 'fsharp',\n fsx: 'fsharp',\n f03: 'f03',\n f08: 'f08',\n f18: 'f18',\n f77: 'f77',\n f90: 'fortran-free-form',\n f95: 'fortran-free-form',\n fnl: 'fennel',\n fish: 'fish',\n ftl: 'ftl',\n tres: 'gdresource',\n res: 'gdresource',\n gd: 'gdscript',\n gdshader: 'gdshader',\n gs: 'genie',\n feature: 'gherkin',\n COMMIT_EDITMSG: 'git-commit',\n 'git-rebase-todo': 'git-rebase',\n gjs: 'glimmer-js',\n gleam: 'gleam',\n gts: 'glimmer-ts',\n glsl: 'glsl',\n vert: 'glsl',\n frag: 'glsl',\n shader: 'shaderlab',\n gp: 'gnuplot',\n plt: 'gnuplot',\n gnuplot: 'gnuplot',\n go: 'go',\n graphql: 'graphql',\n gql: 'graphql',\n groovy: 'groovy',\n gvy: 'groovy',\n hack: 'hack',\n haml: 'haml',\n hbs: 'handlebars',\n handlebars: 'handlebars',\n hs: 'haskell',\n lhs: 'haskell',\n hx: 'haxe',\n hcl: 'hcl',\n hjson: 'hjson',\n hlsl: 'hlsl',\n fx: 'hlsl',\n html: 'html',\n htm: 'html',\n http: 'http',\n rest: 'http',\n hxml: 'hxml',\n hy: 'hy',\n imba: 'imba',\n ini: 'ini',\n cfg: 'ini',\n jade: 'pug',\n pug: 'pug',\n java: 'java',\n js: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n jinja: 'jinja',\n jinja2: 'jinja',\n j2: 'jinja',\n jison: 'jison',\n jl: 'julia',\n json: 'json',\n json5: 'json5',\n jsonc: 'jsonc',\n jsonl: 'jsonl',\n jsonnet: 'jsonnet',\n libsonnet: 'jsonnet',\n jssm: 'jssm',\n jsx: 'jsx',\n kt: 'kotlin',\n kts: 'kts',\n kql: 'kusto',\n tex: 'tex',\n ltx: 'tex',\n lean: 'lean4',\n less: 'less',\n liquid: 'liquid',\n lit: 'lit',\n ll: 'llvm',\n logo: 'logo',\n lua: 'lua',\n luau: 'luau',\n Makefile: 'makefile',\n mk: 'makefile',\n makefile: 'makefile',\n md: 'markdown',\n markdown: 'markdown',\n marko: 'marko',\n m: 'wolfram',\n mat: 'matlab',\n mdc: 'mdc',\n mdx: 'mdx',\n wiki: 'wikitext',\n mediawiki: 'wikitext',\n mmd: 'mermaid',\n mermaid: 'mermaid',\n mips: 'mipsasm',\n mojo: 'mojo',\n '🔥': 'mojo',\n move: 'move',\n nar: 'narrat',\n nf: 'nextflow',\n nim: 'nim',\n nims: 'nim',\n nimble: 'nim',\n nix: 'nix',\n nu: 'nushell',\n mm: 'objective-cpp',\n ml: 'ocaml',\n mli: 'ocaml',\n mll: 'ocaml',\n mly: 'ocaml',\n pas: 'pascal',\n p: 'pascal',\n pl: 'prolog',\n pm: 'perl',\n t: 'perl',\n raku: 'raku',\n p6: 'raku',\n pl6: 'raku',\n php: 'php',\n phtml: 'php',\n pls: 'plsql',\n sql: 'sql',\n po: 'po',\n polar: 'polar',\n pcss: 'postcss',\n pot: 'pot',\n potx: 'potx',\n pq: 'powerquery',\n pqm: 'powerquery',\n ps1: 'powershell',\n psm1: 'powershell',\n psd1: 'powershell',\n prisma: 'prisma',\n pro: 'prolog',\n P: 'prolog',\n properties: 'properties',\n proto: 'protobuf',\n pp: 'puppet',\n purs: 'purescript',\n py: 'python',\n pyw: 'python',\n pyi: 'python',\n qml: 'qml',\n qmldir: 'qmldir',\n qss: 'qss',\n r: 'r',\n R: 'r',\n rkt: 'racket',\n rktl: 'racket',\n razor: 'razor',\n cshtml: 'razor',\n rb: 'ruby',\n rbw: 'ruby',\n reg: 'reg',\n regex: 'regexp',\n rel: 'rel',\n rs: 'rust',\n rst: 'rst',\n rake: 'ruby',\n gemspec: 'ruby',\n jbuilder: 'ruby',\n builder: 'ruby',\n rabl: 'ruby',\n arb: 'ruby',\n ru: 'ruby',\n podspec: 'ruby',\n Gemfile: 'ruby',\n Rakefile: 'ruby',\n Guardfile: 'ruby',\n Capfile: 'ruby',\n Berksfile: 'ruby',\n Brewfile: 'ruby',\n Vagrantfile: 'ruby',\n Thorfile: 'ruby',\n Appraisals: 'ruby',\n Dangerfile: 'ruby',\n sas: 'sas',\n sass: 'sass',\n scala: 'scala',\n sc: 'scala',\n scm: 'scheme',\n ss: 'scheme',\n sld: 'scheme',\n scss: 'scss',\n sdbl: 'sdbl',\n shadergraph: 'shader',\n st: 'smalltalk',\n sol: 'solidity',\n sparql: 'sparql',\n rq: 'sparql',\n spl: 'splunk',\n config: 'ssh-config',\n do: 'stata',\n ado: 'stata',\n dta: 'stata',\n styl: 'stylus',\n stylus: 'stylus',\n svelte: 'svelte',\n swift: 'swift',\n sv: 'system-verilog',\n svh: 'system-verilog',\n service: 'systemd',\n socket: 'systemd',\n device: 'systemd',\n timer: 'systemd',\n talon: 'talonscript',\n tasl: 'tasl',\n tcl: 'tcl',\n templ: 'templ',\n tf: 'tf',\n tfvars: 'tfvars',\n toml: 'toml',\n ts: 'typescript',\n mts: 'typescript',\n cts: 'typescript',\n tsp: 'typespec',\n tsv: 'tsv',\n tsx: 'tsx',\n ttl: 'turtle',\n twig: 'twig',\n typ: 'typst',\n vv: 'v',\n vala: 'vala',\n vapi: 'vala',\n vb: 'vb',\n vbs: 'vb',\n bas: 'vb',\n vh: 'verilog',\n vhd: 'vhdl',\n vhdl: 'vhdl',\n vim: 'vimscript',\n vue: 'vue',\n 'vine.ts': 'vue-vine',\n vy: 'vyper',\n wasm: 'wasm',\n wat: 'wasm',\n wy: '文言',\n wgsl: 'wgsl',\n wit: 'wit',\n wl: 'wolfram',\n nb: 'wolfram',\n xml: 'xml',\n xsl: 'xsl',\n xslt: 'xsl',\n yaml: 'yaml',\n yml: 'yml',\n zs: 'zenscript',\n zig: 'zig',\n zsh: 'zsh',\n sty: 'tex',\n};\n\nexport function getFiletypeFromFileName(fileName: string): SupportedLanguages {\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(fileName)) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(fileName) ?? 'text';\n }\n // Handle special files without extensions first\n if (EXTENSION_TO_FILE_FORMAT[fileName] != null) {\n return EXTENSION_TO_FILE_FORMAT[fileName];\n }\n\n // Try compound extensions first (e.g., .blade.php, .component.ts)\n const compoundMatch = fileName.match(/\\.([^/\\\\]+\\.[^/\\\\]+)$/);\n if (compoundMatch != null) {\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(compoundMatch[1])) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(compoundMatch[1]) ?? 'text';\n }\n if (EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] != null) {\n return EXTENSION_TO_FILE_FORMAT[compoundMatch[1]] ?? 'text';\n }\n }\n\n // Fall back to simple extension\n const simpleMatch = fileName.match(/\\.([^.]+)$/)?.[1] ?? '';\n if (CUSTOM_EXTENSION_TO_FILE_FORMAT.has(simpleMatch)) {\n return CUSTOM_EXTENSION_TO_FILE_FORMAT.get(simpleMatch) ?? 'text';\n }\n return EXTENSION_TO_FILE_FORMAT[simpleMatch] ?? 'text';\n}\n\nexport function replaceCustomExtensions(\n version: number,\n map: ExtensionFormatMap\n): boolean {\n if (version <= customExtensionsVersion) {\n return false;\n }\n CUSTOM_EXTENSION_TO_FILE_FORMAT.clear();\n for (const key in map) {\n const lang = map[key];\n if (lang != null) {\n CUSTOM_EXTENSION_TO_FILE_FORMAT.set(key, lang);\n }\n }\n customExtensionsVersion = version;\n return true;\n}\n\nexport function getCustomExtensionsVersion(): number {\n return customExtensionsVersion;\n}\n\nexport function setCustomExtension(\n key: string,\n lang: SupportedLanguages\n): boolean {\n const existing = CUSTOM_EXTENSION_TO_FILE_FORMAT.get(key);\n if (existing === lang) {\n return false;\n }\n if (existing != null) {\n console.warn(\n `setCustomExtension: overriding custom mapping for \"${key}\" from \"${existing}\" to \"${lang}\"`\n );\n }\n CUSTOM_EXTENSION_TO_FILE_FORMAT.set(key, lang);\n customExtensionsVersion++;\n return true;\n}\n\nexport function getCustomExtensionsMap(): ExtensionFormatMap {\n return Object.fromEntries(\n CUSTOM_EXTENSION_TO_FILE_FORMAT\n ) as ExtensionFormatMap;\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FileDiffLoadedFiles, FileDiffMetadata } from "../types.js";
2
+
3
+ //#region src/utils/hydratePartialDiff.d.ts
4
+ /**
5
+ * Hydrates a partial diff in place with full file line arrays.
6
+ */
7
+ declare function hydratePartialDiff(type: 'clone' | 'merge', fileDiff: FileDiffMetadata, files: FileDiffLoadedFiles): FileDiffMetadata;
8
+ //#endregion
9
+ export { hydratePartialDiff };
10
+ //# sourceMappingURL=hydratePartialDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydratePartialDiff.d.ts","names":[],"sources":["../../src/utils/hydratePartialDiff.ts"],"mappings":";;;;;AAkBA;iBAAgB,kBAAA,CACd,IAAA,qBACA,QAAA,EAAU,gBAAA,EACV,KAAA,EAAO,mBAAA,GACN,gBAAA"}