@openclaw/diffs 2026.8.1-beta.3 → 2026.8.2

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 (620) hide show
  1. package/dist/assets/viewer-runtime.js +129 -156
  2. package/dist/{browser.runtime-_hkQDewM.js → browser.runtime-DTKAejqd.js} +1 -1
  3. package/dist/index.js +18 -16
  4. package/dist/{viewer-assets-DKR8WLAI.js → viewer-assets-D3qrnaxI.js} +11 -23
  5. package/node_modules/@pierre/diffs/README.md +9 -0
  6. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts +94 -7
  7. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts.map +1 -1
  8. package/node_modules/@pierre/diffs/dist/components/CodeView.js +333 -47
  9. package/node_modules/@pierre/diffs/dist/components/CodeView.js.map +1 -1
  10. package/node_modules/@pierre/diffs/dist/components/File.d.ts +22 -4
  11. package/node_modules/@pierre/diffs/dist/components/File.d.ts.map +1 -1
  12. package/node_modules/@pierre/diffs/dist/components/File.js +143 -23
  13. package/node_modules/@pierre/diffs/dist/components/File.js.map +1 -1
  14. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts +83 -19
  15. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts.map +1 -1
  16. package/node_modules/@pierre/diffs/dist/components/FileDiff.js +461 -46
  17. package/node_modules/@pierre/diffs/dist/components/FileDiff.js.map +1 -1
  18. package/node_modules/@pierre/diffs/dist/components/FileStream.d.ts.map +1 -1
  19. package/node_modules/@pierre/diffs/dist/components/FileStream.js +2 -1
  20. package/node_modules/@pierre/diffs/dist/components/FileStream.js.map +1 -1
  21. package/node_modules/@pierre/diffs/dist/components/UnresolvedFile.d.ts +2 -2
  22. package/node_modules/@pierre/diffs/dist/components/UnresolvedFile.d.ts.map +1 -1
  23. package/node_modules/@pierre/diffs/dist/components/UnresolvedFile.js +9 -4
  24. package/node_modules/@pierre/diffs/dist/components/UnresolvedFile.js.map +1 -1
  25. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts +7 -3
  26. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts.map +1 -1
  27. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js +87 -60
  28. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js.map +1 -1
  29. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts +30 -5
  30. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  31. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js +277 -56
  32. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js.map +1 -1
  33. package/node_modules/@pierre/diffs/dist/components/Virtualizer.d.ts +17 -3
  34. package/node_modules/@pierre/diffs/dist/components/Virtualizer.d.ts.map +1 -1
  35. package/node_modules/@pierre/diffs/dist/components/Virtualizer.js +44 -5
  36. package/node_modules/@pierre/diffs/dist/components/Virtualizer.js.map +1 -1
  37. package/node_modules/@pierre/diffs/dist/constants.d.ts +4 -1
  38. package/node_modules/@pierre/diffs/dist/constants.d.ts.map +1 -1
  39. package/node_modules/@pierre/diffs/dist/constants.js +4 -1
  40. package/node_modules/@pierre/diffs/dist/constants.js.map +1 -1
  41. package/node_modules/@pierre/diffs/dist/edit/index.d.ts +6 -0
  42. package/node_modules/@pierre/diffs/dist/edit/index.js +3 -0
  43. package/node_modules/@pierre/diffs/dist/editor/command.d.ts +15 -0
  44. package/node_modules/@pierre/diffs/dist/editor/command.d.ts.map +1 -0
  45. package/node_modules/@pierre/diffs/dist/editor/command.js +128 -0
  46. package/node_modules/@pierre/diffs/dist/editor/command.js.map +1 -0
  47. package/node_modules/@pierre/diffs/dist/editor/editStack.d.ts +76 -0
  48. package/node_modules/@pierre/diffs/dist/editor/editStack.d.ts.map +1 -0
  49. package/node_modules/@pierre/diffs/dist/editor/editStack.js +259 -0
  50. package/node_modules/@pierre/diffs/dist/editor/editStack.js.map +1 -0
  51. package/node_modules/@pierre/diffs/dist/editor/editor.d.ts +118 -0
  52. package/node_modules/@pierre/diffs/dist/editor/editor.d.ts.map +1 -0
  53. package/node_modules/@pierre/diffs/dist/editor/editor.js +2880 -0
  54. package/node_modules/@pierre/diffs/dist/editor/editor.js.map +1 -0
  55. package/node_modules/@pierre/diffs/dist/editor/editor2.js +6 -0
  56. package/node_modules/@pierre/diffs/dist/editor/editor2.js.map +1 -0
  57. package/node_modules/@pierre/diffs/dist/editor/languages.d.ts +26 -0
  58. package/node_modules/@pierre/diffs/dist/editor/languages.d.ts.map +1 -0
  59. package/node_modules/@pierre/diffs/dist/editor/languages.js +363 -0
  60. package/node_modules/@pierre/diffs/dist/editor/languages.js.map +1 -0
  61. package/node_modules/@pierre/diffs/dist/editor/lineAnnotations.d.ts +9 -0
  62. package/node_modules/@pierre/diffs/dist/editor/lineAnnotations.d.ts.map +1 -0
  63. package/node_modules/@pierre/diffs/dist/editor/lineAnnotations.js +212 -0
  64. package/node_modules/@pierre/diffs/dist/editor/lineAnnotations.js.map +1 -0
  65. package/node_modules/@pierre/diffs/dist/editor/marker.d.ts +38 -0
  66. package/node_modules/@pierre/diffs/dist/editor/marker.d.ts.map +1 -0
  67. package/node_modules/@pierre/diffs/dist/editor/marker.js +245 -0
  68. package/node_modules/@pierre/diffs/dist/editor/marker.js.map +1 -0
  69. package/node_modules/@pierre/diffs/dist/editor/matchBrackets.d.ts +9 -0
  70. package/node_modules/@pierre/diffs/dist/editor/matchBrackets.d.ts.map +1 -0
  71. package/node_modules/@pierre/diffs/dist/editor/matchBrackets.js +138 -0
  72. package/node_modules/@pierre/diffs/dist/editor/matchBrackets.js.map +1 -0
  73. package/node_modules/@pierre/diffs/dist/editor/pieceTable.d.ts +40 -0
  74. package/node_modules/@pierre/diffs/dist/editor/pieceTable.d.ts.map +1 -0
  75. package/node_modules/@pierre/diffs/dist/editor/pieceTable.js +706 -0
  76. package/node_modules/@pierre/diffs/dist/editor/pieceTable.js.map +1 -0
  77. package/node_modules/@pierre/diffs/dist/editor/platform.d.ts +11 -0
  78. package/node_modules/@pierre/diffs/dist/editor/platform.d.ts.map +1 -0
  79. package/node_modules/@pierre/diffs/dist/editor/platform.js +31 -0
  80. package/node_modules/@pierre/diffs/dist/editor/platform.js.map +1 -0
  81. package/node_modules/@pierre/diffs/dist/editor/popover.d.ts +65 -0
  82. package/node_modules/@pierre/diffs/dist/editor/popover.d.ts.map +1 -0
  83. package/node_modules/@pierre/diffs/dist/editor/popover.js +191 -0
  84. package/node_modules/@pierre/diffs/dist/editor/popover.js.map +1 -0
  85. package/node_modules/@pierre/diffs/dist/editor/searchPanel.d.ts +41 -0
  86. package/node_modules/@pierre/diffs/dist/editor/searchPanel.d.ts.map +1 -0
  87. package/node_modules/@pierre/diffs/dist/editor/searchPanel.js +318 -0
  88. package/node_modules/@pierre/diffs/dist/editor/searchPanel.js.map +1 -0
  89. package/node_modules/@pierre/diffs/dist/editor/selection.d.ts +211 -0
  90. package/node_modules/@pierre/diffs/dist/editor/selection.d.ts.map +1 -0
  91. package/node_modules/@pierre/diffs/dist/editor/selection.js +1626 -0
  92. package/node_modules/@pierre/diffs/dist/editor/selection.js.map +1 -0
  93. package/node_modules/@pierre/diffs/dist/editor/selectionAction.d.ts +47 -0
  94. package/node_modules/@pierre/diffs/dist/editor/selectionAction.d.ts.map +1 -0
  95. package/node_modules/@pierre/diffs/dist/editor/selectionAction.js +66 -0
  96. package/node_modules/@pierre/diffs/dist/editor/selectionAction.js.map +1 -0
  97. package/node_modules/@pierre/diffs/dist/editor/sprite.d.ts +8 -0
  98. package/node_modules/@pierre/diffs/dist/editor/sprite.d.ts.map +1 -0
  99. package/node_modules/@pierre/diffs/dist/editor/sprite.js +45 -0
  100. package/node_modules/@pierre/diffs/dist/editor/sprite.js.map +1 -0
  101. package/node_modules/@pierre/diffs/dist/editor/stateStorage.d.ts +15 -0
  102. package/node_modules/@pierre/diffs/dist/editor/stateStorage.d.ts.map +1 -0
  103. package/node_modules/@pierre/diffs/dist/editor/stateStorage.js +65 -0
  104. package/node_modules/@pierre/diffs/dist/editor/stateStorage.js.map +1 -0
  105. package/node_modules/@pierre/diffs/dist/editor/textDocument.d.ts +67 -0
  106. package/node_modules/@pierre/diffs/dist/editor/textDocument.d.ts.map +1 -0
  107. package/node_modules/@pierre/diffs/dist/editor/textDocument.js +278 -0
  108. package/node_modules/@pierre/diffs/dist/editor/textDocument.js.map +1 -0
  109. package/node_modules/@pierre/diffs/dist/editor/textMeasure.d.ts +61 -0
  110. package/node_modules/@pierre/diffs/dist/editor/textMeasure.d.ts.map +1 -0
  111. package/node_modules/@pierre/diffs/dist/editor/textMeasure.js +209 -0
  112. package/node_modules/@pierre/diffs/dist/editor/textMeasure.js.map +1 -0
  113. package/node_modules/@pierre/diffs/dist/editor/tokenizer.d.ts +41 -0
  114. package/node_modules/@pierre/diffs/dist/editor/tokenizer.d.ts.map +1 -0
  115. package/node_modules/@pierre/diffs/dist/editor/tokenizer.js +596 -0
  116. package/node_modules/@pierre/diffs/dist/editor/tokenizer.js.map +1 -0
  117. package/node_modules/@pierre/diffs/dist/editor/utils.d.ts +22 -0
  118. package/node_modules/@pierre/diffs/dist/editor/utils.d.ts.map +1 -0
  119. package/node_modules/@pierre/diffs/dist/editor/utils.js +78 -0
  120. package/node_modules/@pierre/diffs/dist/editor/utils.js.map +1 -0
  121. package/node_modules/@pierre/diffs/dist/index.d.ts +12 -9
  122. package/node_modules/@pierre/diffs/dist/index.js +13 -10
  123. package/node_modules/@pierre/diffs/dist/managers/InteractionManager.d.ts +20 -2
  124. package/node_modules/@pierre/diffs/dist/managers/InteractionManager.d.ts.map +1 -1
  125. package/node_modules/@pierre/diffs/dist/managers/InteractionManager.js +155 -79
  126. package/node_modules/@pierre/diffs/dist/managers/InteractionManager.js.map +1 -1
  127. package/node_modules/@pierre/diffs/dist/managers/ResizeManager.d.ts +10 -2
  128. package/node_modules/@pierre/diffs/dist/managers/ResizeManager.d.ts.map +1 -1
  129. package/node_modules/@pierre/diffs/dist/managers/ResizeManager.js +33 -13
  130. package/node_modules/@pierre/diffs/dist/managers/ResizeManager.js.map +1 -1
  131. package/node_modules/@pierre/diffs/dist/managers/UniversalRenderingManager.d.ts +2 -1
  132. package/node_modules/@pierre/diffs/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  133. package/node_modules/@pierre/diffs/dist/managers/UniversalRenderingManager.js +7 -3
  134. package/node_modules/@pierre/diffs/dist/managers/UniversalRenderingManager.js.map +1 -1
  135. package/node_modules/@pierre/diffs/dist/react/CodeView.d.ts +29 -3
  136. package/node_modules/@pierre/diffs/dist/react/CodeView.d.ts.map +1 -1
  137. package/node_modules/@pierre/diffs/dist/react/CodeView.js +111 -30
  138. package/node_modules/@pierre/diffs/dist/react/CodeView.js.map +1 -1
  139. package/node_modules/@pierre/diffs/dist/react/EditContext.d.ts +20 -0
  140. package/node_modules/@pierre/diffs/dist/react/EditContext.d.ts.map +1 -0
  141. package/node_modules/@pierre/diffs/dist/react/EditContext.js +27 -0
  142. package/node_modules/@pierre/diffs/dist/react/EditContext.js.map +1 -0
  143. package/node_modules/@pierre/diffs/dist/react/File.d.ts +4 -1
  144. package/node_modules/@pierre/diffs/dist/react/File.d.ts.map +1 -1
  145. package/node_modules/@pierre/diffs/dist/react/File.js +5 -2
  146. package/node_modules/@pierre/diffs/dist/react/File.js.map +1 -1
  147. package/node_modules/@pierre/diffs/dist/react/FileDiff.d.ts +4 -1
  148. package/node_modules/@pierre/diffs/dist/react/FileDiff.d.ts.map +1 -1
  149. package/node_modules/@pierre/diffs/dist/react/FileDiff.js +5 -2
  150. package/node_modules/@pierre/diffs/dist/react/FileDiff.js.map +1 -1
  151. package/node_modules/@pierre/diffs/dist/react/MultiFileDiff.d.ts +7 -5
  152. package/node_modules/@pierre/diffs/dist/react/MultiFileDiff.d.ts.map +1 -1
  153. package/node_modules/@pierre/diffs/dist/react/MultiFileDiff.js +5 -2
  154. package/node_modules/@pierre/diffs/dist/react/MultiFileDiff.js.map +1 -1
  155. package/node_modules/@pierre/diffs/dist/react/PatchDiff.d.ts +4 -1
  156. package/node_modules/@pierre/diffs/dist/react/PatchDiff.d.ts.map +1 -1
  157. package/node_modules/@pierre/diffs/dist/react/PatchDiff.js +5 -2
  158. package/node_modules/@pierre/diffs/dist/react/PatchDiff.js.map +1 -1
  159. package/node_modules/@pierre/diffs/dist/react/UnresolvedFile.d.ts +2 -1
  160. package/node_modules/@pierre/diffs/dist/react/UnresolvedFile.d.ts.map +1 -1
  161. package/node_modules/@pierre/diffs/dist/react/UnresolvedFile.js +2 -1
  162. package/node_modules/@pierre/diffs/dist/react/UnresolvedFile.js.map +1 -1
  163. package/node_modules/@pierre/diffs/dist/react/index.d.ts +4 -3
  164. package/node_modules/@pierre/diffs/dist/react/index.js +3 -2
  165. package/node_modules/@pierre/diffs/dist/react/types.d.ts +11 -0
  166. package/node_modules/@pierre/diffs/dist/react/types.d.ts.map +1 -1
  167. package/node_modules/@pierre/diffs/dist/react/utils/renderDiffChildren.d.ts +2 -0
  168. package/node_modules/@pierre/diffs/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  169. package/node_modules/@pierre/diffs/dist/react/utils/renderDiffChildren.js +16 -8
  170. package/node_modules/@pierre/diffs/dist/react/utils/renderDiffChildren.js.map +1 -1
  171. package/node_modules/@pierre/diffs/dist/react/utils/renderFileChildren.d.ts +2 -0
  172. package/node_modules/@pierre/diffs/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  173. package/node_modules/@pierre/diffs/dist/react/utils/renderFileChildren.js +16 -8
  174. package/node_modules/@pierre/diffs/dist/react/utils/renderFileChildren.js.map +1 -1
  175. package/node_modules/@pierre/diffs/dist/react/utils/useFileDiffInstance.d.ts +6 -2
  176. package/node_modules/@pierre/diffs/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  177. package/node_modules/@pierre/diffs/dist/react/utils/useFileDiffInstance.js +21 -6
  178. package/node_modules/@pierre/diffs/dist/react/utils/useFileDiffInstance.js.map +1 -1
  179. package/node_modules/@pierre/diffs/dist/react/utils/useFileInstance.d.ts +7 -2
  180. package/node_modules/@pierre/diffs/dist/react/utils/useFileInstance.d.ts.map +1 -1
  181. package/node_modules/@pierre/diffs/dist/react/utils/useFileInstance.js +21 -6
  182. package/node_modules/@pierre/diffs/dist/react/utils/useFileInstance.js.map +1 -1
  183. package/node_modules/@pierre/diffs/dist/react/utils/useUnresolvedFileInstance.js +4 -4
  184. package/node_modules/@pierre/diffs/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  185. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts +47 -2
  186. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  187. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js +361 -37
  188. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js.map +1 -1
  189. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts +26 -1
  190. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts.map +1 -1
  191. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js +240 -55
  192. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js.map +1 -1
  193. package/node_modules/@pierre/diffs/dist/ssr/index.d.ts +2 -2
  194. package/node_modules/@pierre/diffs/dist/ssr/preloadDiffs.d.ts +11 -10
  195. package/node_modules/@pierre/diffs/dist/ssr/preloadDiffs.d.ts.map +1 -1
  196. package/node_modules/@pierre/diffs/dist/ssr/preloadDiffs.js +17 -7
  197. package/node_modules/@pierre/diffs/dist/ssr/preloadDiffs.js.map +1 -1
  198. package/node_modules/@pierre/diffs/dist/ssr/preloadFile.d.ts.map +1 -1
  199. package/node_modules/@pierre/diffs/dist/ssr/preloadFile.js +2 -0
  200. package/node_modules/@pierre/diffs/dist/ssr/preloadFile.js.map +1 -1
  201. package/node_modules/@pierre/diffs/dist/style.js +1 -1
  202. package/node_modules/@pierre/diffs/dist/types.d.ts +336 -5
  203. package/node_modules/@pierre/diffs/dist/types.d.ts.map +1 -1
  204. package/node_modules/@pierre/diffs/dist/utils/annotationHelpers.d.ts +20 -0
  205. package/node_modules/@pierre/diffs/dist/utils/annotationHelpers.d.ts.map +1 -0
  206. package/node_modules/@pierre/diffs/dist/utils/annotationHelpers.js +29 -0
  207. package/node_modules/@pierre/diffs/dist/utils/annotationHelpers.js.map +1 -0
  208. package/node_modules/@pierre/diffs/dist/utils/applyLineTextWithNewline.d.ts +5 -0
  209. package/node_modules/@pierre/diffs/dist/utils/applyLineTextWithNewline.d.ts.map +1 -0
  210. package/node_modules/@pierre/diffs/dist/utils/applyLineTextWithNewline.js +11 -0
  211. package/node_modules/@pierre/diffs/dist/utils/applyLineTextWithNewline.js.map +1 -0
  212. package/node_modules/@pierre/diffs/dist/utils/areHunkDataEqual.js +1 -1
  213. package/node_modules/@pierre/diffs/dist/utils/areHunkDataEqual.js.map +1 -1
  214. package/node_modules/@pierre/diffs/dist/utils/areManagedSnapshotsEqual.d.ts +2 -2
  215. package/node_modules/@pierre/diffs/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  216. package/node_modules/@pierre/diffs/dist/utils/areManagedSnapshotsEqual.js +6 -1
  217. package/node_modules/@pierre/diffs/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  218. package/node_modules/@pierre/diffs/dist/utils/awaitWithTimeout.d.ts +5 -0
  219. package/node_modules/@pierre/diffs/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  220. package/node_modules/@pierre/diffs/dist/utils/awaitWithTimeout.js +15 -0
  221. package/node_modules/@pierre/diffs/dist/utils/awaitWithTimeout.js.map +1 -0
  222. package/node_modules/@pierre/diffs/dist/utils/cleanLastNewline.js +6 -1
  223. package/node_modules/@pierre/diffs/dist/utils/cleanLastNewline.js.map +1 -1
  224. package/node_modules/@pierre/diffs/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  225. package/node_modules/@pierre/diffs/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  226. package/node_modules/@pierre/diffs/dist/utils/cloneFileDiffMetadata.js +16 -0
  227. package/node_modules/@pierre/diffs/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  228. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  229. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  230. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js +8 -1
  231. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  232. package/node_modules/@pierre/diffs/dist/utils/computeFileOffsets.d.ts +21 -0
  233. package/node_modules/@pierre/diffs/dist/utils/computeFileOffsets.d.ts.map +1 -0
  234. package/node_modules/@pierre/diffs/dist/utils/computeFileOffsets.js +80 -0
  235. package/node_modules/@pierre/diffs/dist/utils/computeFileOffsets.js.map +1 -0
  236. package/node_modules/@pierre/diffs/dist/utils/createCodeViewHeaderFooterHostElement.d.ts +5 -0
  237. package/node_modules/@pierre/diffs/dist/utils/createCodeViewHeaderFooterHostElement.d.ts.map +1 -0
  238. package/node_modules/@pierre/diffs/dist/utils/createCodeViewHeaderFooterHostElement.js +19 -0
  239. package/node_modules/@pierre/diffs/dist/utils/createCodeViewHeaderFooterHostElement.js.map +1 -0
  240. package/node_modules/@pierre/diffs/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  241. package/node_modules/@pierre/diffs/dist/utils/createFileHeaderElement.js +5 -1
  242. package/node_modules/@pierre/diffs/dist/utils/createFileHeaderElement.js.map +1 -1
  243. package/node_modules/@pierre/diffs/dist/utils/createTransformerWithState.js +9 -0
  244. package/node_modules/@pierre/diffs/dist/utils/createTransformerWithState.js.map +1 -1
  245. package/node_modules/@pierre/diffs/dist/utils/editSessionHunks.d.ts +66 -0
  246. package/node_modules/@pierre/diffs/dist/utils/editSessionHunks.d.ts.map +1 -0
  247. package/node_modules/@pierre/diffs/dist/utils/editSessionHunks.js +437 -0
  248. package/node_modules/@pierre/diffs/dist/utils/editSessionHunks.js.map +1 -0
  249. package/node_modules/@pierre/diffs/dist/utils/getDiffFileInput.d.ts +14 -0
  250. package/node_modules/@pierre/diffs/dist/utils/getDiffFileInput.d.ts.map +1 -0
  251. package/node_modules/@pierre/diffs/dist/utils/getDiffFileInput.js +24 -0
  252. package/node_modules/@pierre/diffs/dist/utils/getDiffFileInput.js.map +1 -0
  253. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  254. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js +3 -1
  255. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  256. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  257. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js +2 -1
  258. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js.map +1 -1
  259. package/node_modules/@pierre/diffs/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  260. package/node_modules/@pierre/diffs/dist/utils/getFiletypeFromFileName.js +2 -0
  261. package/node_modules/@pierre/diffs/dist/utils/getFiletypeFromFileName.js.map +1 -1
  262. package/node_modules/@pierre/diffs/dist/utils/getHunkSideBoundaries.d.ts +7 -0
  263. package/node_modules/@pierre/diffs/dist/utils/getHunkSideBoundaries.d.ts.map +1 -0
  264. package/node_modules/@pierre/diffs/dist/utils/getHunkSideBoundaries.js +12 -0
  265. package/node_modules/@pierre/diffs/dist/utils/getHunkSideBoundaries.js.map +1 -0
  266. package/node_modules/@pierre/diffs/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  267. package/node_modules/@pierre/diffs/dist/utils/getTotalLineCountFromHunks.js +2 -1
  268. package/node_modules/@pierre/diffs/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  269. package/node_modules/@pierre/diffs/dist/utils/guardWebKitScrollDuringRebuild.d.ts +20 -0
  270. package/node_modules/@pierre/diffs/dist/utils/guardWebKitScrollDuringRebuild.d.ts.map +1 -0
  271. package/node_modules/@pierre/diffs/dist/utils/guardWebKitScrollDuringRebuild.js +34 -0
  272. package/node_modules/@pierre/diffs/dist/utils/guardWebKitScrollDuringRebuild.js.map +1 -0
  273. package/node_modules/@pierre/diffs/dist/utils/hydratePartialDiff.d.ts +10 -0
  274. package/node_modules/@pierre/diffs/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  275. package/node_modules/@pierre/diffs/dist/utils/hydratePartialDiff.js +141 -0
  276. package/node_modules/@pierre/diffs/dist/utils/hydratePartialDiff.js.map +1 -0
  277. package/node_modules/@pierre/diffs/dist/utils/isGutterUtilityPath.d.ts +5 -0
  278. package/node_modules/@pierre/diffs/dist/utils/isGutterUtilityPath.d.ts.map +1 -0
  279. package/node_modules/@pierre/diffs/dist/utils/isGutterUtilityPath.js +12 -0
  280. package/node_modules/@pierre/diffs/dist/utils/isGutterUtilityPath.js.map +1 -0
  281. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.d.ts.map +1 -1
  282. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js +20 -15
  283. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js.map +1 -1
  284. package/node_modules/@pierre/diffs/dist/utils/parseDiffFromFile.d.ts +1 -1
  285. package/node_modules/@pierre/diffs/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  286. package/node_modules/@pierre/diffs/dist/utils/parseDiffFromFile.js +26 -5
  287. package/node_modules/@pierre/diffs/dist/utils/parseDiffFromFile.js.map +1 -1
  288. package/node_modules/@pierre/diffs/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  289. package/node_modules/@pierre/diffs/dist/utils/parseMergeConflictDiffFromFile.js +9 -6
  290. package/node_modules/@pierre/diffs/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  291. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.d.ts.map +1 -1
  292. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js +6 -3
  293. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js.map +1 -1
  294. package/node_modules/@pierre/diffs/dist/utils/platform.d.ts +14 -0
  295. package/node_modules/@pierre/diffs/dist/utils/platform.d.ts.map +1 -0
  296. package/node_modules/@pierre/diffs/dist/utils/platform.js +32 -0
  297. package/node_modules/@pierre/diffs/dist/utils/platform.js.map +1 -0
  298. package/node_modules/@pierre/diffs/dist/utils/realignChangeContent.d.ts +33 -0
  299. package/node_modules/@pierre/diffs/dist/utils/realignChangeContent.d.ts.map +1 -0
  300. package/node_modules/@pierre/diffs/dist/utils/realignChangeContent.js +148 -0
  301. package/node_modules/@pierre/diffs/dist/utils/realignChangeContent.js.map +1 -0
  302. package/node_modules/@pierre/diffs/dist/utils/renderDiffWithHighlighter.js +1 -1
  303. package/node_modules/@pierre/diffs/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  304. package/node_modules/@pierre/diffs/dist/utils/renderFileWithHighlighter.js +5 -14
  305. package/node_modules/@pierre/diffs/dist/utils/renderFileWithHighlighter.js.map +1 -1
  306. package/node_modules/@pierre/diffs/dist/utils/resolveRegion.d.ts.map +1 -1
  307. package/node_modules/@pierre/diffs/dist/utils/resolveRegion.js +18 -2
  308. package/node_modules/@pierre/diffs/dist/utils/resolveRegion.js.map +1 -1
  309. package/node_modules/@pierre/diffs/dist/utils/shouldUseTokenTransformer.d.ts +7 -3
  310. package/node_modules/@pierre/diffs/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  311. package/node_modules/@pierre/diffs/dist/utils/shouldUseTokenTransformer.js +1 -1
  312. package/node_modules/@pierre/diffs/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  313. package/node_modules/@pierre/diffs/dist/utils/updateDiffHunks.d.ts +24 -0
  314. package/node_modules/@pierre/diffs/dist/utils/updateDiffHunks.d.ts.map +1 -0
  315. package/node_modules/@pierre/diffs/dist/utils/updateDiffHunks.js +236 -0
  316. package/node_modules/@pierre/diffs/dist/utils/updateDiffHunks.js.map +1 -0
  317. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts +43 -2
  318. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  319. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js +107 -5
  320. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js.map +1 -1
  321. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts +9 -3
  322. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  323. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js +86 -18
  324. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js.map +1 -1
  325. package/node_modules/@pierre/diffs/dist/worker/index.d.ts +2 -2
  326. package/node_modules/@pierre/diffs/dist/worker/types.d.ts +11 -1
  327. package/node_modules/@pierre/diffs/dist/worker/types.d.ts.map +1 -1
  328. package/node_modules/@pierre/diffs/dist/worker/wasm-B9ZqxnKj.js.map +1 -1
  329. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js +116 -95
  330. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js.map +1 -1
  331. package/node_modules/@pierre/diffs/dist/worker/worker.js +102 -80
  332. package/node_modules/@pierre/diffs/dist/worker/worker.js.map +1 -1
  333. package/node_modules/@pierre/diffs/node_modules/@pierre/theme/LICENSE +189 -21
  334. package/node_modules/@pierre/diffs/node_modules/@pierre/theme/NOTICE.md +32 -0
  335. package/node_modules/@pierre/diffs/node_modules/@pierre/theme/package.json +3 -2
  336. package/node_modules/@pierre/diffs/node_modules/@pierre/theming/LICENSE.md +189 -0
  337. package/node_modules/@pierre/diffs/node_modules/@pierre/theming/README.md +9 -0
  338. package/node_modules/@pierre/diffs/node_modules/@pierre/theming/package.json +5 -5
  339. package/node_modules/@pierre/diffs/node_modules/@shikijs/core/dist/index.d.mts +0 -1
  340. package/node_modules/@pierre/diffs/node_modules/@shikijs/core/dist/index.mjs +22 -3
  341. package/node_modules/@pierre/diffs/node_modules/@shikijs/core/package.json +4 -4
  342. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-javascript/dist/{engine-compile-CMRQUZTL.d.mts → engine-compile-Bdn9ihA2.d.mts} +0 -1
  343. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-javascript/dist/engine-compile.d.mts +1 -1
  344. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-javascript/dist/engine-raw.d.mts +0 -1
  345. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-javascript/dist/index.d.mts +1 -1
  346. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-javascript/package.json +2 -2
  347. package/node_modules/@pierre/diffs/node_modules/@shikijs/engine-oniguruma/package.json +2 -2
  348. package/node_modules/@pierre/diffs/node_modules/@shikijs/primitive/dist/index.d.mts +0 -1
  349. package/node_modules/@pierre/diffs/node_modules/@shikijs/primitive/package.json +3 -3
  350. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/catppuccin-frappe.mjs +1 -1
  351. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/catppuccin-latte.mjs +1 -1
  352. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/catppuccin-macchiato.mjs +1 -1
  353. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/catppuccin-mocha.mjs +1 -1
  354. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/kanagawa-dragon.mjs +1 -1
  355. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/kanagawa-lotus.mjs +1 -1
  356. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/kanagawa-wave.mjs +1 -1
  357. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/monokai.mjs +1 -1
  358. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/red.mjs +1 -1
  359. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/rose-pine-dawn.mjs +1 -1
  360. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/rose-pine-moon.mjs +1 -1
  361. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/rose-pine.mjs +1 -1
  362. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/solarized-dark.mjs +1 -1
  363. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/dist/solarized-light.mjs +1 -1
  364. package/node_modules/@pierre/diffs/node_modules/@shikijs/themes/package.json +3 -3
  365. package/node_modules/@pierre/diffs/node_modules/@shikijs/transformers/dist/index.d.mts +0 -1
  366. package/node_modules/@pierre/diffs/node_modules/@shikijs/transformers/dist/index.mjs +2 -1
  367. package/node_modules/@pierre/diffs/node_modules/@shikijs/transformers/package.json +3 -3
  368. package/node_modules/@pierre/diffs/node_modules/@shikijs/types/dist/index.d.mts +0 -1
  369. package/node_modules/@pierre/diffs/node_modules/@shikijs/types/package.json +2 -2
  370. package/node_modules/@pierre/diffs/node_modules/shiki/dist/bundle-full.d.mts +4 -7
  371. package/node_modules/@pierre/diffs/node_modules/shiki/dist/bundle-full.mjs +3 -19
  372. package/node_modules/@pierre/diffs/node_modules/shiki/dist/bundle-web.d.mts +5 -6
  373. package/node_modules/@pierre/diffs/node_modules/shiki/dist/bundle-web.mjs +7 -0
  374. package/node_modules/@pierre/diffs/node_modules/shiki/dist/core-CaxrMD1A.d.mts +1 -0
  375. package/node_modules/@pierre/diffs/node_modules/shiki/dist/core.d.mts +1 -0
  376. package/node_modules/@pierre/diffs/node_modules/shiki/dist/index.d.mts +3 -9
  377. package/node_modules/@pierre/diffs/node_modules/shiki/dist/index.mjs +3 -24
  378. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/actionscript.d.mts +1 -0
  379. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/actionscript.mjs +1 -0
  380. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk.d.mts +1 -0
  381. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk.mjs +1 -0
  382. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk1.d.mts +1 -0
  383. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk1.mjs +1 -0
  384. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk2.d.mts +1 -0
  385. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ahk2.mjs +1 -0
  386. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/as3.d.mts +1 -0
  387. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/as3.mjs +1 -0
  388. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/chapel.d.mts +1 -0
  389. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/chapel.mjs +1 -0
  390. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/chpl.d.mts +1 -0
  391. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/chpl.mjs +1 -0
  392. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/justfile.d.mts +1 -0
  393. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/justfile.mjs +1 -0
  394. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/nsis.d.mts +1 -0
  395. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/nsis.mjs +1 -0
  396. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/org.d.mts +1 -0
  397. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/org.mjs +1 -0
  398. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/pwsh.d.mts +1 -0
  399. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/pwsh.mjs +1 -0
  400. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/rbs.d.mts +1 -0
  401. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/rbs.mjs +1 -0
  402. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ruby-signature.d.mts +1 -0
  403. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/ruby-signature.mjs +1 -0
  404. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/smithy.d.mts +1 -0
  405. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs/smithy.mjs +1 -0
  406. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs-B38xGbib.d.mts +1 -0
  407. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs-bundle-full-B4n9xYHw.d.mts +13 -0
  408. package/node_modules/@pierre/diffs/node_modules/shiki/dist/{langs-bundle-full-4noeO3oH.mjs → langs-bundle-full-xQVO1Cek.mjs} +48 -5
  409. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs.d.mts +2 -1
  410. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs.mjs +1 -1
  411. package/node_modules/@pierre/diffs/node_modules/shiki/dist/{themes-NeZbxnKu.d.mts → themes-BKdFAJ1v.d.mts} +0 -1
  412. package/node_modules/@pierre/diffs/node_modules/shiki/dist/themes.d.mts +1 -1
  413. package/node_modules/@pierre/diffs/node_modules/shiki/dist/types.d.mts +3 -3
  414. package/node_modules/@pierre/diffs/node_modules/shiki/package.json +10 -10
  415. package/node_modules/@pierre/diffs/package.json +13 -4
  416. package/node_modules/@shikijs/langs/dist/actionscript-3.mjs +1 -1
  417. package/node_modules/@shikijs/langs/dist/actionscript.d.mts +3 -0
  418. package/node_modules/@shikijs/langs/dist/actionscript.mjs +2 -0
  419. package/node_modules/@shikijs/langs/dist/ahk.d.mts +3 -0
  420. package/node_modules/@shikijs/langs/dist/ahk.mjs +5 -0
  421. package/node_modules/@shikijs/langs/dist/ahk1.d.mts +3 -0
  422. package/node_modules/@shikijs/langs/dist/ahk1.mjs +2 -0
  423. package/node_modules/@shikijs/langs/dist/ahk2.d.mts +3 -0
  424. package/node_modules/@shikijs/langs/dist/ahk2.mjs +5 -0
  425. package/node_modules/@shikijs/langs/dist/apex.mjs +1 -1
  426. package/node_modules/@shikijs/langs/dist/as3.d.mts +3 -0
  427. package/node_modules/@shikijs/langs/dist/as3.mjs +2 -0
  428. package/node_modules/@shikijs/langs/dist/asciidoc.mjs +1 -1
  429. package/node_modules/@shikijs/langs/dist/bat.mjs +1 -1
  430. package/node_modules/@shikijs/langs/dist/bird2.mjs +1 -1
  431. package/node_modules/@shikijs/langs/dist/bsl.mjs +1 -1
  432. package/node_modules/@shikijs/langs/dist/c3.mjs +1 -1
  433. package/node_modules/@shikijs/langs/dist/chapel.d.mts +3 -0
  434. package/node_modules/@shikijs/langs/dist/chapel.mjs +8 -0
  435. package/node_modules/@shikijs/langs/dist/chpl.d.mts +3 -0
  436. package/node_modules/@shikijs/langs/dist/chpl.mjs +2 -0
  437. package/node_modules/@shikijs/langs/dist/clarity.mjs +1 -1
  438. package/node_modules/@shikijs/langs/dist/cmd.mjs +2 -2
  439. package/node_modules/@shikijs/langs/dist/coq.mjs +1 -1
  440. package/node_modules/@shikijs/langs/dist/cpp-macro.mjs +1 -3
  441. package/node_modules/@shikijs/langs/dist/cpp.mjs +1 -3
  442. package/node_modules/@shikijs/langs/dist/emacs-lisp.mjs +1 -1
  443. package/node_modules/@shikijs/langs/dist/gdscript.mjs +1 -1
  444. package/node_modules/@shikijs/langs/dist/hack.mjs +1 -1
  445. package/node_modules/@shikijs/langs/dist/haxe.mjs +1 -1
  446. package/node_modules/@shikijs/langs/dist/hxml.mjs +1 -1
  447. package/node_modules/@shikijs/langs/dist/index.mjs +14 -0
  448. package/node_modules/@shikijs/langs/dist/just.mjs +1 -1
  449. package/node_modules/@shikijs/langs/dist/justfile.d.mts +3 -0
  450. package/node_modules/@shikijs/langs/dist/justfile.mjs +2 -0
  451. package/node_modules/@shikijs/langs/dist/llvm.mjs +1 -1
  452. package/node_modules/@shikijs/langs/dist/luau.mjs +1 -1
  453. package/node_modules/@shikijs/langs/dist/mdc.mjs +1 -1
  454. package/node_modules/@shikijs/langs/dist/mermaid.mjs +1 -1
  455. package/node_modules/@shikijs/langs/dist/mojo.mjs +1 -1
  456. package/node_modules/@shikijs/langs/dist/moonbit.mjs +1 -1
  457. package/node_modules/@shikijs/langs/dist/move.mjs +1 -1
  458. package/node_modules/@shikijs/langs/dist/nsis.d.mts +3 -0
  459. package/node_modules/@shikijs/langs/dist/nsis.mjs +5 -0
  460. package/node_modules/@shikijs/langs/dist/nushell.mjs +1 -1
  461. package/node_modules/@shikijs/langs/dist/org.d.mts +3 -0
  462. package/node_modules/@shikijs/langs/dist/org.mjs +100 -0
  463. package/node_modules/@shikijs/langs/dist/powershell.mjs +1 -1
  464. package/node_modules/@shikijs/langs/dist/prisma.mjs +1 -1
  465. package/node_modules/@shikijs/langs/dist/pwsh.d.mts +3 -0
  466. package/node_modules/@shikijs/langs/dist/pwsh.mjs +2 -0
  467. package/node_modules/@shikijs/langs/dist/r.mjs +1 -1
  468. package/node_modules/@shikijs/langs/dist/rbs.d.mts +3 -0
  469. package/node_modules/@shikijs/langs/dist/rbs.mjs +5 -0
  470. package/node_modules/@shikijs/langs/dist/ruby-signature.d.mts +3 -0
  471. package/node_modules/@shikijs/langs/dist/ruby-signature.mjs +2 -0
  472. package/node_modules/@shikijs/langs/dist/scala.mjs +1 -1
  473. package/node_modules/@shikijs/langs/dist/smalltalk.mjs +1 -1
  474. package/node_modules/@shikijs/langs/dist/smithy.d.mts +3 -0
  475. package/node_modules/@shikijs/langs/dist/smithy.mjs +5 -0
  476. package/node_modules/@shikijs/langs/dist/solidity.mjs +1 -1
  477. package/node_modules/@shikijs/langs/dist/surrealql.mjs +1 -1
  478. package/node_modules/@shikijs/langs/dist/swift.mjs +1 -1
  479. package/node_modules/@shikijs/langs/dist/system-verilog.mjs +1 -1
  480. package/node_modules/@shikijs/langs/dist/twig.mjs +1 -1
  481. package/node_modules/@shikijs/langs/dist/typst.mjs +116 -1
  482. package/node_modules/@shikijs/langs/dist/v.mjs +1 -1
  483. package/node_modules/@shikijs/langs/dist/vb.mjs +1 -1
  484. package/node_modules/@shikijs/langs/dist/verilog.mjs +1 -1
  485. package/node_modules/@shikijs/langs/dist/vue.mjs +1 -1
  486. package/node_modules/@shikijs/langs/node_modules/@shikijs/types/dist/index.d.mts +0 -1
  487. package/node_modules/@shikijs/langs/node_modules/@shikijs/types/package.json +2 -2
  488. package/node_modules/@shikijs/langs/package.json +18 -4
  489. package/node_modules/typebox/build/format/date.d.mts +1 -1
  490. package/node_modules/typebox/build/format/date.mjs +1 -1
  491. package/node_modules/typebox/build/format/date_time.d.mts +2 -2
  492. package/node_modules/typebox/build/format/date_time.mjs +3 -3
  493. package/node_modules/typebox/build/format/email.d.mts +1 -1
  494. package/node_modules/typebox/build/format/email.mjs +2 -2
  495. package/node_modules/typebox/build/format/hostname.mjs +2 -10
  496. package/node_modules/typebox/build/format/idn_email.d.mts +1 -1
  497. package/node_modules/typebox/build/format/idn_email.mjs +3 -3
  498. package/node_modules/typebox/build/format/idn_hostname.d.mts +1 -0
  499. package/node_modules/typebox/build/format/idn_hostname.mjs +3 -11
  500. package/node_modules/typebox/build/format/idna/format/bidi.d.mts +3 -0
  501. package/node_modules/typebox/build/format/idna/format/bidi.mjs +98 -0
  502. package/node_modules/typebox/build/format/idna/format/puny.d.mts +3 -0
  503. package/node_modules/typebox/build/format/idna/format/puny.mjs +144 -0
  504. package/node_modules/typebox/build/format/idna/hostname.d.mts +1 -0
  505. package/node_modules/typebox/build/format/idna/hostname.mjs +16 -0
  506. package/node_modules/typebox/build/format/idna/idn-hostname.d.mts +1 -0
  507. package/node_modules/typebox/build/format/idna/idn-hostname.mjs +41 -0
  508. package/node_modules/typebox/build/format/idna/index.d.mts +2 -0
  509. package/node_modules/typebox/build/format/idna/index.mjs +2 -0
  510. package/node_modules/typebox/build/format/idna/label/ascii.d.mts +1 -0
  511. package/node_modules/typebox/build/format/idna/label/ascii.mjs +9 -0
  512. package/node_modules/typebox/build/format/idna/label/puny.d.mts +1 -0
  513. package/node_modules/typebox/build/format/idna/label/puny.mjs +28 -0
  514. package/node_modules/typebox/build/format/idna/label/unicode.d.mts +1 -0
  515. package/node_modules/typebox/build/format/idna/label/unicode.mjs +106 -0
  516. package/node_modules/typebox/build/format/idna/pattern/pattern.d.mts +30 -0
  517. package/node_modules/typebox/build/format/idna/pattern/pattern.mjs +70 -0
  518. package/node_modules/typebox/build/format/ipv4.d.mts +0 -1
  519. package/node_modules/typebox/build/format/ipv4.mjs +2 -32
  520. package/node_modules/typebox/build/format/ipv6.mjs +2 -61
  521. package/node_modules/typebox/build/format/iri.d.mts +2 -2
  522. package/node_modules/typebox/build/format/iri.mjs +26 -8
  523. package/node_modules/typebox/build/format/iri_reference.d.mts +2 -2
  524. package/node_modules/typebox/build/format/iri_reference.mjs +9 -55
  525. package/node_modules/typebox/build/format/regex.d.mts +1 -2
  526. package/node_modules/typebox/build/format/regex.mjs +2 -6
  527. package/node_modules/typebox/build/format/time.d.mts +2 -2
  528. package/node_modules/typebox/build/format/time.mjs +19 -14
  529. package/node_modules/typebox/build/format/uri.d.mts +1 -1
  530. package/node_modules/typebox/build/format/uri.mjs +3 -130
  531. package/node_modules/typebox/build/format/uri_reference.d.mts +1 -1
  532. package/node_modules/typebox/build/format/uri_reference.mjs +2 -3
  533. package/node_modules/typebox/build/format/uri_template.d.mts +2 -3
  534. package/node_modules/typebox/build/format/uri_template.mjs +4 -5
  535. package/node_modules/typebox/build/format/url.d.mts +3 -3
  536. package/node_modules/typebox/build/format/url.mjs +4 -5
  537. package/node_modules/typebox/build/guard/emit.d.mts +3 -1
  538. package/node_modules/typebox/build/guard/emit.mjs +12 -5
  539. package/node_modules/typebox/build/guard/guard.d.mts +8 -2
  540. package/node_modules/typebox/build/guard/guard.mjs +25 -4
  541. package/node_modules/typebox/build/guard/string.d.mts +2 -2
  542. package/node_modules/typebox/build/guard/string.mjs +7 -7
  543. package/node_modules/typebox/build/schema/engine/_context.mjs +3 -3
  544. package/node_modules/typebox/build/schema/engine/_functions.mjs +1 -2
  545. package/node_modules/typebox/build/schema/engine/_regexp.d.mts +2 -0
  546. package/node_modules/typebox/build/schema/engine/_regexp.mjs +4 -0
  547. package/node_modules/typebox/build/schema/engine/_stack.mjs +12 -13
  548. package/node_modules/typebox/build/schema/engine/additionalItems.mjs +17 -7
  549. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +4 -3
  550. package/node_modules/typebox/build/schema/engine/contains.mjs +18 -6
  551. package/node_modules/typebox/build/schema/engine/enum.mjs +1 -1
  552. package/node_modules/typebox/build/schema/engine/items.mjs +26 -6
  553. package/node_modules/typebox/build/schema/engine/maxContains.mjs +3 -3
  554. package/node_modules/typebox/build/schema/engine/minContains.mjs +14 -4
  555. package/node_modules/typebox/build/schema/engine/not.mjs +4 -2
  556. package/node_modules/typebox/build/schema/engine/oneOf.mjs +7 -6
  557. package/node_modules/typebox/build/schema/engine/pattern.mjs +3 -2
  558. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +4 -3
  559. package/node_modules/typebox/build/schema/engine/ref.mjs +1 -7
  560. package/node_modules/typebox/build/schema/engine/schema.mjs +13 -4
  561. package/node_modules/typebox/build/schema/engine/type.mjs +1 -1
  562. package/node_modules/typebox/build/schema/resolve/resolve.d.mts +4 -1
  563. package/node_modules/typebox/build/schema/resolve/resolve.mjs +202 -1
  564. package/node_modules/typebox/build/schema/static/propertyNames.d.mts +5 -0
  565. package/node_modules/typebox/build/schema/static/propertyNames.mjs +3 -0
  566. package/node_modules/typebox/build/schema/static/schema.d.mts +3 -0
  567. package/node_modules/typebox/build/schema/types/index.d.mts +0 -2
  568. package/node_modules/typebox/build/schema/types/index.mjs +0 -2
  569. package/node_modules/typebox/build/system/memory/clone.mjs +14 -11
  570. package/node_modules/typebox/build/system/memory/discard.mjs +6 -5
  571. package/node_modules/typebox/build/system/settings/settings.d.mts +9 -0
  572. package/node_modules/typebox/build/system/settings/settings.mjs +2 -0
  573. package/node_modules/typebox/build/type/engine/call/distribute_arguments.d.mts +6 -1
  574. package/node_modules/typebox/build/type/engine/call/distribute_arguments.mjs +16 -3
  575. package/node_modules/typebox/build/type/engine/call/instantiate.mjs +34 -4
  576. package/node_modules/typebox/build/type/engine/evaluate/broaden.d.mts +5 -5
  577. package/node_modules/typebox/build/type/engine/evaluate/broaden.mjs +20 -26
  578. package/node_modules/typebox/build/type/engine/evaluate/compare.d.mts +6 -10
  579. package/node_modules/typebox/build/type/engine/evaluate/compare.mjs +9 -13
  580. package/node_modules/typebox/build/type/engine/evaluate/composite.d.mts +7 -4
  581. package/node_modules/typebox/build/type/engine/evaluate/composite.mjs +12 -19
  582. package/node_modules/typebox/build/type/engine/evaluate/distribute.d.mts +4 -20
  583. package/node_modules/typebox/build/type/engine/evaluate/distribute.mjs +8 -20
  584. package/node_modules/typebox/build/type/engine/evaluate/evaluate.d.mts +4 -4
  585. package/node_modules/typebox/build/type/engine/evaluate/evaluate.mjs +11 -8
  586. package/node_modules/typebox/build/type/engine/evaluate/flatten.d.mts +1 -1
  587. package/node_modules/typebox/build/type/engine/evaluate/flatten.mjs +3 -4
  588. package/node_modules/typebox/build/type/engine/evaluate/narrow.d.mts +17 -2
  589. package/node_modules/typebox/build/type/engine/evaluate/narrow.mjs +26 -6
  590. package/node_modules/typebox/build/type/engine/exclude/operation.mjs +3 -4
  591. package/node_modules/typebox/build/type/engine/extract/operation.d.mts +1 -1
  592. package/node_modules/typebox/build/type/engine/extract/operation.mjs +3 -4
  593. package/node_modules/typebox/build/type/engine/priority/priority.d.mts +2 -2
  594. package/node_modules/typebox/build/type/engine/priority/priority.mjs +3 -4
  595. package/node_modules/typebox/build/type/script/mapping.d.mts +32 -29
  596. package/node_modules/typebox/build/type/script/mapping.mjs +18 -25
  597. package/node_modules/typebox/build/type/script/parser.d.mts +19 -25
  598. package/node_modules/typebox/build/type/script/parser.mjs +27 -23
  599. package/node_modules/typebox/build/value/errors/errors.d.mts +2 -2
  600. package/node_modules/typebox/build/value/errors/errors.mjs +1 -1
  601. package/node_modules/typebox/package.json +27 -27
  602. package/node_modules/typebox/readme.md +79 -82
  603. package/package.json +9 -8
  604. package/node_modules/@pierre/diffs/dist/utils/iterateOverFile.d.ts +0 -50
  605. package/node_modules/@pierre/diffs/dist/utils/iterateOverFile.d.ts.map +0 -1
  606. package/node_modules/@pierre/diffs/dist/utils/iterateOverFile.js +0 -49
  607. package/node_modules/@pierre/diffs/dist/utils/iterateOverFile.js.map +0 -1
  608. package/node_modules/@pierre/diffs/node_modules/shiki/dist/core-BVVgDSdq.d.mts +0 -1
  609. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs-BVVgDSdq.d.mts +0 -1
  610. package/node_modules/@pierre/diffs/node_modules/shiki/dist/langs-bundle-full-WSWgUeqW.d.mts +0 -14
  611. package/node_modules/typebox/build/format/_idna.d.mts +0 -2
  612. package/node_modules/typebox/build/format/_idna.mjs +0 -246
  613. package/node_modules/typebox/build/format/_puny.d.mts +0 -1
  614. package/node_modules/typebox/build/format/_puny.mjs +0 -77
  615. package/node_modules/typebox/build/schema/resolve/ref.d.mts +0 -3
  616. package/node_modules/typebox/build/schema/resolve/ref.mjs +0 -146
  617. package/node_modules/typebox/build/schema/types/contentEncoding.d.mts +0 -9
  618. package/node_modules/typebox/build/schema/types/contentEncoding.mjs +0 -13
  619. package/node_modules/typebox/build/schema/types/contentMediaType.d.mts +0 -9
  620. package/node_modules/typebox/build/schema/types/contentMediaType.mjs +0 -13
@@ -0,0 +1,33 @@
1
+ import { FileDiffMetadata, Hunk } from "../types.js";
2
+
3
+ //#region src/utils/realignChangeContent.d.ts
4
+ /**
5
+ * Re-split count-mismatched change blocks in every hunk so paired lines are
6
+ * chosen by content similarity instead of position, then slide blank-line
7
+ * insert/delete blocks to the top of their blank run. Mutates `hunks` in
8
+ * place; rendered row counts are unchanged (a split block covers the same
9
+ * split/unified rows as the original).
10
+ */
11
+ declare function realignChangeContentBySimilarity(diff: Pick<FileDiffMetadata, 'hunks' | 'additionLines' | 'deletionLines'>): void;
12
+ /**
13
+ * Slide pure insert/delete blocks made entirely of blank lines to the top of
14
+ * the blank run they sit in. Adding or removing a blank line next to
15
+ * existing blanks is ambiguous, and the diff library reports the change at
16
+ * the run's bottom — so pressing Enter at the end of a line marks a blank
17
+ * *below* the caret as inserted while the caret's own new line renders as
18
+ * context. Sliding up anchors the change to the content above it (the caret
19
+ * line after an Enter) instead.
20
+ *
21
+ * The slide is all-or-nothing: it only applies when the block comes to rest
22
+ * directly beneath remaining in-hunk content. A slide that would consume the
23
+ * hunk's entire leading context was stopped by the hunk's edge — a context
24
+ * window cut, not the top of the blank run — and that landing spot is
25
+ * arbitrary, so the block keeps the library's bottom-of-run anchor (which
26
+ * sits against the content below the run). Non-blank blocks never slide, so
27
+ * code that merely ends like its neighbor (an added function before an
28
+ * identical `}`) keeps the library's canonical position.
29
+ */
30
+ declare function slideBlankBoundaryBlocksUp(hunk: Hunk, diff: Pick<FileDiffMetadata, 'additionLines' | 'deletionLines'>): void;
31
+ //#endregion
32
+ export { realignChangeContentBySimilarity, slideBlankBoundaryBlocksUp };
33
+ //# sourceMappingURL=realignChangeContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realignChangeContent.d.ts","names":[],"sources":["../../src/utils/realignChangeContent.ts"],"mappings":";;;;;AAmCA;;;;;iBAAgB,gCAAA,CACd,IAAA,EAAM,IAAI,CAAC,gBAAA;;;AAA8D;AAoC3E;;;;;;;;;;;;;;AAEiE;iBAFjD,0BAAA,CACd,IAAA,EAAM,IAAA,EACN,IAAA,EAAM,IAAA,CAAK,gBAAA"}
@@ -0,0 +1,148 @@
1
+ //#region src/utils/realignChangeContent.ts
2
+ const MAX_ALIGNMENT_COMPARISONS = 4096;
3
+ const MIN_IMPROVEMENT_PER_PAIR = .5;
4
+ /**
5
+ * Re-split count-mismatched change blocks in every hunk so paired lines are
6
+ * chosen by content similarity instead of position, then slide blank-line
7
+ * insert/delete blocks to the top of their blank run. Mutates `hunks` in
8
+ * place; rendered row counts are unchanged (a split block covers the same
9
+ * split/unified rows as the original).
10
+ */
11
+ function realignChangeContentBySimilarity(diff) {
12
+ for (const hunk of diff.hunks) {
13
+ for (let index = 0; index < hunk.hunkContent.length; index++) {
14
+ const content = hunk.hunkContent[index];
15
+ if (content.type !== "change") continue;
16
+ const replacement = realignChangeBlock(diff, content);
17
+ if (replacement != null) {
18
+ hunk.hunkContent.splice(index, 1, ...replacement);
19
+ index += replacement.length - 1;
20
+ }
21
+ }
22
+ slideBlankBoundaryBlocksUp(hunk, diff);
23
+ }
24
+ }
25
+ /**
26
+ * Slide pure insert/delete blocks made entirely of blank lines to the top of
27
+ * the blank run they sit in. Adding or removing a blank line next to
28
+ * existing blanks is ambiguous, and the diff library reports the change at
29
+ * the run's bottom — so pressing Enter at the end of a line marks a blank
30
+ * *below* the caret as inserted while the caret's own new line renders as
31
+ * context. Sliding up anchors the change to the content above it (the caret
32
+ * line after an Enter) instead.
33
+ *
34
+ * The slide is all-or-nothing: it only applies when the block comes to rest
35
+ * directly beneath remaining in-hunk content. A slide that would consume the
36
+ * hunk's entire leading context was stopped by the hunk's edge — a context
37
+ * window cut, not the top of the blank run — and that landing spot is
38
+ * arbitrary, so the block keeps the library's bottom-of-run anchor (which
39
+ * sits against the content below the run). Non-blank blocks never slide, so
40
+ * code that merely ends like its neighbor (an added function before an
41
+ * identical `}`) keeps the library's canonical position.
42
+ */
43
+ function slideBlankBoundaryBlocksUp(hunk, diff) {
44
+ const { hunkContent } = hunk;
45
+ for (let index = 1; index < hunkContent.length; index++) {
46
+ const block = hunkContent[index];
47
+ const previous = hunkContent[index - 1];
48
+ if (block.type !== "change" || block.additions > 0 && block.deletions > 0 || previous.type !== "context") continue;
49
+ const isInsert = block.additions > 0;
50
+ const lines = isInsert ? diff.additionLines : diff.deletionLines;
51
+ const blockStart = isInsert ? block.additionLineIndex : block.deletionLineIndex;
52
+ const blockLength = isInsert ? block.additions : block.deletions;
53
+ const unit = lines[blockStart] ?? "";
54
+ if (unit.trim() !== "") continue;
55
+ let uniform = true;
56
+ for (let offset = 1; offset < blockLength; offset++) if (lines[blockStart + offset] !== unit) {
57
+ uniform = false;
58
+ break;
59
+ }
60
+ if (!uniform) continue;
61
+ let slide = 0;
62
+ while (slide < previous.lines && diff.additionLines[previous.additionLineIndex + previous.lines - 1 - slide] === unit) slide++;
63
+ if (slide === 0) continue;
64
+ if (index === 1 && slide === previous.lines) continue;
65
+ block.additionLineIndex -= slide;
66
+ block.deletionLineIndex -= slide;
67
+ const blockAdditionEnd = block.additionLineIndex + block.additions;
68
+ const blockDeletionEnd = block.deletionLineIndex + block.deletions;
69
+ const next = hunkContent[index + 1];
70
+ if (next?.type === "context") {
71
+ next.lines += slide;
72
+ next.additionLineIndex = blockAdditionEnd;
73
+ next.deletionLineIndex = blockDeletionEnd;
74
+ } else hunkContent.splice(index + 1, 0, {
75
+ type: "context",
76
+ lines: slide,
77
+ additionLineIndex: blockAdditionEnd,
78
+ deletionLineIndex: blockDeletionEnd
79
+ });
80
+ previous.lines -= slide;
81
+ if (previous.lines === 0) {
82
+ hunkContent.splice(index - 1, 1);
83
+ index--;
84
+ }
85
+ }
86
+ }
87
+ function realignChangeBlock(diff, content) {
88
+ const { deletions, additions, deletionLineIndex, additionLineIndex } = content;
89
+ const pairCount = Math.min(deletions, additions);
90
+ const surplus = Math.abs(additions - deletions);
91
+ if (pairCount === 0 || surplus === 0 || pairCount * (surplus + 1) > MAX_ALIGNMENT_COMPARISONS) return null;
92
+ const strippedDeletions = [];
93
+ for (let line = 0; line < deletions; line++) strippedDeletions.push(stripWhitespace(diff.deletionLines[deletionLineIndex + line] ?? ""));
94
+ const strippedAdditions = [];
95
+ for (let line = 0; line < additions; line++) strippedAdditions.push(stripWhitespace(diff.additionLines[additionLineIndex + line] ?? ""));
96
+ const additionsAreLonger = additions > deletions;
97
+ let bestOffset = 0;
98
+ let bestScore = -1;
99
+ for (let offset = 0; offset <= surplus; offset++) {
100
+ let score = 0;
101
+ for (let pair = 0; pair < pairCount; pair++) score += lineSimilarity(strippedDeletions[pair + (additionsAreLonger ? 0 : offset)], strippedAdditions[pair + (additionsAreLonger ? offset : 0)]);
102
+ if (offset === 0) bestScore = score + pairCount * MIN_IMPROVEMENT_PER_PAIR;
103
+ else if (score > bestScore) {
104
+ bestScore = score;
105
+ bestOffset = offset;
106
+ }
107
+ }
108
+ if (bestOffset === 0) return null;
109
+ const blocks = [];
110
+ const pushBlock = (blockDeletions, blockAdditions, blockDeletionIndex, blockAdditionIndex) => {
111
+ if (blockDeletions > 0 || blockAdditions > 0) blocks.push({
112
+ type: "change",
113
+ deletions: blockDeletions,
114
+ additions: blockAdditions,
115
+ deletionLineIndex: blockDeletionIndex,
116
+ additionLineIndex: blockAdditionIndex
117
+ });
118
+ };
119
+ if (additionsAreLonger) {
120
+ pushBlock(0, bestOffset, deletionLineIndex, additionLineIndex);
121
+ pushBlock(pairCount, pairCount, deletionLineIndex, additionLineIndex + bestOffset);
122
+ pushBlock(0, additions - pairCount - bestOffset, deletionLineIndex + pairCount, additionLineIndex + bestOffset + pairCount);
123
+ } else {
124
+ pushBlock(bestOffset, 0, deletionLineIndex, additionLineIndex);
125
+ pushBlock(pairCount, pairCount, deletionLineIndex + bestOffset, additionLineIndex);
126
+ pushBlock(deletions - pairCount - bestOffset, 0, deletionLineIndex + bestOffset + pairCount, additionLineIndex + pairCount);
127
+ }
128
+ return blocks;
129
+ }
130
+ const WHITESPACE = /\s+/g;
131
+ function stripWhitespace(line) {
132
+ return line.replace(WHITESPACE, "");
133
+ }
134
+ function lineSimilarity(a, b) {
135
+ if (a === b) return 1;
136
+ const maxLength = Math.max(a.length, b.length);
137
+ const minLength = Math.min(a.length, b.length);
138
+ if (minLength === 0) return 0;
139
+ let prefix = 0;
140
+ while (prefix < minLength && a[prefix] === b[prefix]) prefix++;
141
+ let suffix = 0;
142
+ while (suffix < minLength - prefix && a[a.length - 1 - suffix] === b[b.length - 1 - suffix]) suffix++;
143
+ return (prefix + suffix) / maxLength;
144
+ }
145
+ //#endregion
146
+ export { realignChangeContentBySimilarity, slideBlankBoundaryBlocksUp };
147
+
148
+ //# sourceMappingURL=realignChangeContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realignChangeContent.js","names":[],"sources":["../../src/utils/realignChangeContent.ts"],"sourcesContent":["import type {\n ChangeContent,\n ContextContent,\n FileDiffMetadata,\n Hunk,\n} from '../types';\n\n// The diff library emits one change block per replaced run, ordering every\n// deleted line before every added line. Renderers pair a block's lines\n// positionally (deletion[i] across from addition[i] in split view), so a\n// block like { deletions: 1, additions: 2 } pairs the deleted line with\n// whichever addition happens to come first — even when a later addition is\n// the edited version of it (e.g. pressing Enter above a changed line pushes\n// a blank line in front of it). These helpers re-split such blocks so the\n// most similar lines pair up and the surplus renders as pure insert/delete\n// rows at the block's edges.\n\n// Skip realignment when a block would need more than this many line\n// comparisons; pathological blocks keep the library's positional pairing.\nconst MAX_ALIGNMENT_COMPARISONS = 4096;\n\n// A shifted pairing must beat the positional one by this much per paired\n// line before the block is re-split. Near-ties (e.g. lines that merely share\n// an import-statement shape) keep the library's canonical order; the\n// realignment is meant for decisive wins like a blank or unrelated inserted\n// line displacing an edited one, where the gap approaches 1.\nconst MIN_IMPROVEMENT_PER_PAIR = 0.5;\n\n/**\n * Re-split count-mismatched change blocks in every hunk so paired lines are\n * chosen by content similarity instead of position, then slide blank-line\n * insert/delete blocks to the top of their blank run. Mutates `hunks` in\n * place; rendered row counts are unchanged (a split block covers the same\n * split/unified rows as the original).\n */\nexport function realignChangeContentBySimilarity(\n diff: Pick<FileDiffMetadata, 'hunks' | 'additionLines' | 'deletionLines'>\n): void {\n for (const hunk of diff.hunks) {\n for (let index = 0; index < hunk.hunkContent.length; index++) {\n const content = hunk.hunkContent[index];\n if (content.type !== 'change') {\n continue;\n }\n const replacement = realignChangeBlock(diff, content);\n if (replacement != null) {\n hunk.hunkContent.splice(index, 1, ...replacement);\n index += replacement.length - 1;\n }\n }\n slideBlankBoundaryBlocksUp(hunk, diff);\n }\n}\n\n/**\n * Slide pure insert/delete blocks made entirely of blank lines to the top of\n * the blank run they sit in. Adding or removing a blank line next to\n * existing blanks is ambiguous, and the diff library reports the change at\n * the run's bottom — so pressing Enter at the end of a line marks a blank\n * *below* the caret as inserted while the caret's own new line renders as\n * context. Sliding up anchors the change to the content above it (the caret\n * line after an Enter) instead.\n *\n * The slide is all-or-nothing: it only applies when the block comes to rest\n * directly beneath remaining in-hunk content. A slide that would consume the\n * hunk's entire leading context was stopped by the hunk's edge — a context\n * window cut, not the top of the blank run — and that landing spot is\n * arbitrary, so the block keeps the library's bottom-of-run anchor (which\n * sits against the content below the run). Non-blank blocks never slide, so\n * code that merely ends like its neighbor (an added function before an\n * identical `}`) keeps the library's canonical position.\n */\nexport function slideBlankBoundaryBlocksUp(\n hunk: Hunk,\n diff: Pick<FileDiffMetadata, 'additionLines' | 'deletionLines'>\n): void {\n const { hunkContent } = hunk;\n for (let index = 1; index < hunkContent.length; index++) {\n const block = hunkContent[index];\n const previous = hunkContent[index - 1];\n if (\n block.type !== 'change' ||\n (block.additions > 0 && block.deletions > 0) ||\n previous.type !== 'context'\n ) {\n continue;\n }\n const isInsert = block.additions > 0;\n const lines = isInsert ? diff.additionLines : diff.deletionLines;\n const blockStart = isInsert\n ? block.additionLineIndex\n : block.deletionLineIndex;\n const blockLength = isInsert ? block.additions : block.deletions;\n\n // Sliding through identical lines is only well-defined when the block is\n // a uniform run; require every block line to equal the first one, and\n // that line to be blank.\n const unit = lines[blockStart] ?? '';\n if (unit.trim() !== '') {\n continue;\n }\n let uniform = true;\n for (let offset = 1; offset < blockLength; offset++) {\n if (lines[blockStart + offset] !== unit) {\n uniform = false;\n break;\n }\n }\n if (!uniform) {\n continue;\n }\n\n // Slide distance: how many trailing context lines match the block's line\n // exactly (context lines are identical on both sides by definition).\n let slide = 0;\n while (\n slide < previous.lines &&\n diff.additionLines[\n previous.additionLineIndex + previous.lines - 1 - slide\n ] === unit\n ) {\n slide++;\n }\n if (slide === 0) {\n continue;\n }\n // Stopped by the hunk's leading edge rather than by content: the blank\n // run extends to (and possibly beyond) the hunk's top, so there is no\n // in-hunk line to anchor beneath. Keep the bottom-of-run position.\n if (index === 1 && slide === previous.lines) {\n continue;\n }\n\n block.additionLineIndex -= slide;\n block.deletionLineIndex -= slide;\n const blockAdditionEnd = block.additionLineIndex + block.additions;\n const blockDeletionEnd = block.deletionLineIndex + block.deletions;\n const next = hunkContent[index + 1];\n if (next?.type === 'context') {\n next.lines += slide;\n next.additionLineIndex = blockAdditionEnd;\n next.deletionLineIndex = blockDeletionEnd;\n } else {\n hunkContent.splice(index + 1, 0, {\n type: 'context',\n lines: slide,\n additionLineIndex: blockAdditionEnd,\n deletionLineIndex: blockDeletionEnd,\n });\n }\n previous.lines -= slide;\n if (previous.lines === 0) {\n hunkContent.splice(index - 1, 1);\n index--;\n }\n }\n}\n\n// Returns the split blocks for one change block, or null when the block is\n// balanced, too large to scan, or already best paired positionally.\nfunction realignChangeBlock(\n diff: Pick<FileDiffMetadata, 'additionLines' | 'deletionLines'>,\n content: ChangeContent\n): (ContextContent | ChangeContent)[] | null {\n const { deletions, additions, deletionLineIndex, additionLineIndex } =\n content;\n const pairCount = Math.min(deletions, additions);\n const surplus = Math.abs(additions - deletions);\n if (\n pairCount === 0 ||\n surplus === 0 ||\n pairCount * (surplus + 1) > MAX_ALIGNMENT_COMPARISONS\n ) {\n return null;\n }\n\n // Whitespace (indentation, formatter churn, trailing spaces, the line\n // break itself) is noise for deciding which lines pair — the rendered diff\n // still shows every whitespace change on the paired row. Strip it once per\n // line here rather than per comparison.\n const strippedDeletions: string[] = [];\n for (let line = 0; line < deletions; line++) {\n strippedDeletions.push(\n stripWhitespace(diff.deletionLines[deletionLineIndex + line] ?? '')\n );\n }\n const strippedAdditions: string[] = [];\n for (let line = 0; line < additions; line++) {\n strippedAdditions.push(\n stripWhitespace(diff.additionLines[additionLineIndex + line] ?? '')\n );\n }\n\n // Score every offset of the shorter side along the longer side and keep\n // the best one only when it decisively beats the positional pairing.\n const additionsAreLonger = additions > deletions;\n let bestOffset = 0;\n let bestScore = -1;\n for (let offset = 0; offset <= surplus; offset++) {\n let score = 0;\n for (let pair = 0; pair < pairCount; pair++) {\n score += lineSimilarity(\n strippedDeletions[pair + (additionsAreLonger ? 0 : offset)],\n strippedAdditions[pair + (additionsAreLonger ? offset : 0)]\n );\n }\n if (offset === 0) {\n bestScore = score + pairCount * MIN_IMPROVEMENT_PER_PAIR;\n } else if (score > bestScore) {\n bestScore = score;\n bestOffset = offset;\n }\n }\n if (bestOffset === 0) {\n return null;\n }\n\n const blocks: ChangeContent[] = [];\n const pushBlock = (\n blockDeletions: number,\n blockAdditions: number,\n blockDeletionIndex: number,\n blockAdditionIndex: number\n ) => {\n if (blockDeletions > 0 || blockAdditions > 0) {\n blocks.push({\n type: 'change',\n deletions: blockDeletions,\n additions: blockAdditions,\n deletionLineIndex: blockDeletionIndex,\n additionLineIndex: blockAdditionIndex,\n });\n }\n };\n if (additionsAreLonger) {\n pushBlock(0, bestOffset, deletionLineIndex, additionLineIndex);\n pushBlock(\n pairCount,\n pairCount,\n deletionLineIndex,\n additionLineIndex + bestOffset\n );\n pushBlock(\n 0,\n additions - pairCount - bestOffset,\n deletionLineIndex + pairCount,\n additionLineIndex + bestOffset + pairCount\n );\n } else {\n pushBlock(bestOffset, 0, deletionLineIndex, additionLineIndex);\n pushBlock(\n pairCount,\n pairCount,\n deletionLineIndex + bestOffset,\n additionLineIndex\n );\n pushBlock(\n deletions - pairCount - bestOffset,\n 0,\n deletionLineIndex + bestOffset + pairCount,\n additionLineIndex + pairCount\n );\n }\n return blocks;\n}\n\nconst WHITESPACE = /\\s+/g;\n\nfunction stripWhitespace(line: string): string {\n return line.replace(WHITESPACE, '');\n}\n\n// Cheap 0..1 similarity over whitespace-stripped lines: shared prefix plus\n// shared suffix over the longer length. Exact for lines that differ only in\n// whitespace, 0 for a blank against content — enough to steer pairing\n// without a real edit-distance pass.\nfunction lineSimilarity(a: string, b: string): number {\n if (a === b) {\n return 1;\n }\n const maxLength = Math.max(a.length, b.length);\n const minLength = Math.min(a.length, b.length);\n if (minLength === 0) {\n return 0;\n }\n let prefix = 0;\n while (prefix < minLength && a[prefix] === b[prefix]) {\n prefix++;\n }\n let suffix = 0;\n while (\n suffix < minLength - prefix &&\n a[a.length - 1 - suffix] === b[b.length - 1 - suffix]\n ) {\n suffix++;\n }\n return (prefix + suffix) / maxLength;\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { DEFAULT_THEMES } from "../constants.js";
2
- import { getFiletypeFromFileName } from "./getFiletypeFromFileName.js";
3
2
  import { cleanLastNewline } from "./cleanLastNewline.js";
3
+ import { getFiletypeFromFileName } from "./getFiletypeFromFileName.js";
4
4
  import { createTransformerWithState } from "./createTransformerWithState.js";
5
5
  import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js";
6
6
  import { getHighlighterThemeStyles } from "./getHighlighterThemeStyles.js";
@@ -1 +1 @@
1
- {"version":3,"file":"renderFileWithHighlighter.d.ts","names":[],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"mappings":";;;iBAuBgB,yBAAA,CACd,IAAA,EAAM,YAAA,EACN,WAAA,EAAa,gBAAA;EAEX,KAAA;EACA,qBAAA;EACA;AAAA,GACC,iBAAA;EAED,cAAA;EACA,YAAA;EACA,UAAA;EACA;AAAA,IACC,yBAAA,GACF,gBAAA"}
1
+ {"version":3,"file":"renderFileWithHighlighter.d.ts","names":[],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"mappings":";;;iBAqBgB,yBAAA,CACd,IAAA,EAAM,YAAA,EACN,WAAA,EAAa,gBAAA;EAEX,KAAA;EACA,qBAAA;EACA;AAAA,GACC,iBAAA;EAED,cAAA;EACA,YAAA;EACA,UAAA;EACA;AAAA,IACC,yBAAA,GACF,gBAAA"}
@@ -1,12 +1,10 @@
1
1
  import { DEFAULT_THEMES } from "../constants.js";
2
- import { iterateOverFile } from "./iterateOverFile.js";
2
+ import { linesFromFileContents } from "./computeFileOffsets.js";
3
3
  import { getFiletypeFromFileName } from "./getFiletypeFromFileName.js";
4
- import { cleanLastNewline } from "./cleanLastNewline.js";
5
4
  import { createTransformerWithState } from "./createTransformerWithState.js";
6
5
  import { formatCSSVariablePrefix } from "./formatCSSVariablePrefix.js";
7
6
  import { getHighlighterThemeStyles } from "./getHighlighterThemeStyles.js";
8
7
  import { getLineNodes } from "./getLineNodes.js";
9
- import { splitFileContents } from "./splitFileContents.js";
10
8
  //#region src/utils/renderFileWithHighlighter.ts
11
9
  const DEFAULT_PLAIN_TEXT_OPTIONS = { forcePlainText: false };
12
10
  function renderFileWithHighlighter(file, highlighter, { theme = DEFAULT_THEMES, tokenizeMaxLineLength, useTokenTransformer }, { forcePlainText, startingLine, totalLines, lines } = DEFAULT_PLAIN_TEXT_OPTIONS) {
@@ -50,7 +48,7 @@ function renderFileWithHighlighter(file, highlighter, { theme = DEFAULT_THEMES,
50
48
  tokenizeTimeLimit: 0
51
49
  };
52
50
  })();
53
- const highlightedLines = getLineNodes(highlighter.codeToHast(isWindowedHighlight ? extractWindowedFileContent(lines ?? splitFileContents(file.contents), startingLine, totalLines) : cleanLastNewline(file.contents), hastConfig));
51
+ const highlightedLines = getLineNodes(highlighter.codeToHast(isWindowedHighlight ? extractWindowedFileContent(lines ?? linesFromFileContents(file.contents), startingLine, totalLines) : file.contents, hastConfig));
54
52
  const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines;
55
53
  if (isWindowedHighlight) code.push(...highlightedLines);
56
54
  return {
@@ -60,16 +58,9 @@ function renderFileWithHighlighter(file, highlighter, { theme = DEFAULT_THEMES,
60
58
  };
61
59
  }
62
60
  function extractWindowedFileContent(lines, startingLine, totalLines) {
63
- let windowContent = "";
64
- iterateOverFile({
65
- lines,
66
- startingLine,
67
- totalLines,
68
- callback({ content }) {
69
- windowContent += content;
70
- }
71
- });
72
- return windowContent;
61
+ if (lines.length === 0) return "";
62
+ const endLine = Math.min(startingLine + totalLines, lines.length);
63
+ return lines.slice(startingLine, endLine).join("");
73
64
  }
74
65
  //#endregion
75
66
  export { renderFileWithHighlighter };
@@ -1 +1 @@
1
- {"version":3,"file":"renderFileWithHighlighter.js","names":[],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n ForceFilePlainTextOptions,\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';\nimport { iterateOverFile } from './iterateOverFile';\nimport { splitFileContents } from './splitFileContents';\n\nconst DEFAULT_PLAIN_TEXT_OPTIONS: ForceFilePlainTextOptions = {\n forcePlainText: false,\n};\n\nexport function renderFileWithHighlighter(\n file: FileContents,\n highlighter: DiffsHighlighter,\n {\n theme = DEFAULT_THEMES,\n tokenizeMaxLineLength,\n useTokenTransformer,\n }: RenderFileOptions,\n {\n forcePlainText,\n startingLine,\n totalLines,\n lines,\n }: ForceFilePlainTextOptions = DEFAULT_PLAIN_TEXT_OPTIONS\n): ThemedFileResult {\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 { state, transformers } =\n createTransformerWithState(useTokenTransformer);\n const lang = forcePlainText\n ? 'text'\n : (file.lang ?? getFiletypeFromFileName(file.name));\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({\n theme,\n highlighter,\n });\n state.lineInfo = (shikiLineNumber: number) => ({\n type: 'context',\n lineIndex: shikiLineNumber - 1 + startingLine,\n lineNumber: shikiLineNumber + startingLine,\n });\n // tokenizeTimeLimit: 0 disables shiki's silent 500ms-per-line tokenization\n // abort. When it trips (slow devices, cold JS-regex-engine compile), the\n // rest of the line collapses to the enclosing scope's color — and since\n // dual-theme rendering tokenizes per theme, the first (dark) pass can smear\n // while the warm second (light) pass stays correct. Pathological content is\n // already guarded by tokenizeMaxLineLength, which renders long lines plain.\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 tokenizeTimeLimit: 0,\n };\n }\n return {\n lang,\n themes: theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength,\n tokenizeTimeLimit: 0,\n };\n })();\n const highlightedLines = getLineNodes(\n highlighter.codeToHast(\n isWindowedHighlight\n ? extractWindowedFileContent(\n lines ?? splitFileContents(file.contents),\n startingLine,\n totalLines\n )\n : cleanLastNewline(file.contents),\n hastConfig\n )\n );\n\n // Create sparse array for windowed rendering\n const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines;\n if (isWindowedHighlight) {\n code.push(...highlightedLines);\n }\n\n return { code, themeStyles, baseThemeType };\n}\n\nfunction extractWindowedFileContent(\n lines: string[],\n startingLine: number,\n totalLines: number\n): string {\n let windowContent: string = '';\n iterateOverFile({\n lines,\n startingLine,\n totalLines,\n callback({ content }) {\n windowContent += content;\n },\n });\n return windowContent;\n}\n"],"mappings":";;;;;;;;;;AAmBA,MAAM,6BAAwD,EAC5D,gBAAgB,MAClB;AAEA,SAAgB,0BACd,MACA,aACA,EACE,QAAQ,gBACR,uBACA,uBAEF,EACE,gBACA,cACA,YACA,UAC6B,4BACb;CAClB,IAAI,gBAAgB;EAClB,iBAAiB;EACjB,eAAe;CACjB,OAAO;EAKL,eAAe;EACf,aAAa;CACf;CACA,MAAM,sBAAsB,eAAe,KAAK,aAAa;CAC7D,MAAM,EAAE,OAAO,iBACb,2BAA2B,mBAAmB;CAChD,MAAM,OAAO,iBACT,SACC,KAAK,QAAQ,wBAAwB,KAAK,IAAI;CACnD,MAAM,gBACJ,OAAO,UAAU,WAAW,YAAY,SAAS,KAAK,CAAC,CAAC,OAAO,KAAA;CACjE,MAAM,cAAc,0BAA0B;EAC5C;EACA;CACF,CAAC;CACD,MAAM,YAAY,qBAA6B;EAC7C,MAAM;EACN,WAAW,kBAAkB,IAAI;EACjC,YAAY,kBAAkB;CAChC;CAOA,MAAM,oBAAwD;EAC5D,IAAI,OAAO,UAAU,UACnB,OAAO;GACL;GACA;GACA;GACA,cAAc;GACd,mBAAmB,wBAAwB,OAAO;GAClD;GACA,mBAAmB;EACrB;EAEF,OAAO;GACL;GACA,QAAQ;GACR;GACA,cAAc;GACd,mBAAmB,wBAAwB,OAAO;GAClD;GACA,mBAAmB;EACrB;CACF,EAAA,CAAG;CACH,MAAM,mBAAmB,aACvB,YAAY,WACV,sBACI,2BACE,SAAS,kBAAkB,KAAK,QAAQ,GACxC,cACA,UACF,IACA,iBAAiB,KAAK,QAAQ,GAClC,UACF,CACF;CAGA,MAAM,OAAO,sBAAsB,IAAI,MAAM,YAAY,IAAI;CAC7D,IAAI,qBACF,KAAK,KAAK,GAAG,gBAAgB;CAG/B,OAAO;EAAE;EAAM;EAAa;CAAc;AAC5C;AAEA,SAAS,2BACP,OACA,cACA,YACQ;CACR,IAAI,gBAAwB;CAC5B,gBAAgB;EACd;EACA;EACA;EACA,SAAS,EAAE,WAAW;GACpB,iBAAiB;EACnB;CACF,CAAC;CACD,OAAO;AACT"}
1
+ {"version":3,"file":"renderFileWithHighlighter.js","names":[],"sources":["../../src/utils/renderFileWithHighlighter.ts"],"sourcesContent":["import { DEFAULT_THEMES } from '../constants';\nimport type {\n CodeToHastOptions,\n DiffsHighlighter,\n DiffsThemeNames,\n FileContents,\n ForceFilePlainTextOptions,\n RenderFileOptions,\n ThemedFileResult,\n} from '../types';\nimport { linesFromFileContents } from './computeFileOffsets';\nimport { createTransformerWithState } from './createTransformerWithState';\nimport { formatCSSVariablePrefix } from './formatCSSVariablePrefix';\nimport { getFiletypeFromFileName } from './getFiletypeFromFileName';\nimport { getHighlighterThemeStyles } from './getHighlighterThemeStyles';\nimport { getLineNodes } from './getLineNodes';\n\nconst DEFAULT_PLAIN_TEXT_OPTIONS: ForceFilePlainTextOptions = {\n forcePlainText: false,\n};\n\nexport function renderFileWithHighlighter(\n file: FileContents,\n highlighter: DiffsHighlighter,\n {\n theme = DEFAULT_THEMES,\n tokenizeMaxLineLength,\n useTokenTransformer,\n }: RenderFileOptions,\n {\n forcePlainText,\n startingLine,\n totalLines,\n lines,\n }: ForceFilePlainTextOptions = DEFAULT_PLAIN_TEXT_OPTIONS\n): ThemedFileResult {\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 { state, transformers } =\n createTransformerWithState(useTokenTransformer);\n const lang = forcePlainText\n ? 'text'\n : (file.lang ?? getFiletypeFromFileName(file.name));\n const baseThemeType =\n typeof theme === 'string' ? highlighter.getTheme(theme).type : undefined;\n const themeStyles = getHighlighterThemeStyles({\n theme,\n highlighter,\n });\n state.lineInfo = (shikiLineNumber: number) => ({\n type: 'context',\n lineIndex: shikiLineNumber - 1 + startingLine,\n lineNumber: shikiLineNumber + startingLine,\n });\n // tokenizeTimeLimit: 0 disables shiki's silent 500ms-per-line tokenization\n // abort. When it trips (slow devices, cold JS-regex-engine compile), the\n // rest of the line collapses to the enclosing scope's color — and since\n // dual-theme rendering tokenizes per theme, the first (dark) pass can smear\n // while the warm second (light) pass stays correct. Pathological content is\n // already guarded by tokenizeMaxLineLength, which renders long lines plain.\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 tokenizeTimeLimit: 0,\n };\n }\n return {\n lang,\n themes: theme,\n transformers,\n defaultColor: false,\n cssVariablePrefix: formatCSSVariablePrefix('token'),\n tokenizeMaxLineLength,\n tokenizeTimeLimit: 0,\n };\n })();\n const highlightedLines = getLineNodes(\n highlighter.codeToHast(\n isWindowedHighlight\n ? extractWindowedFileContent(\n lines ?? linesFromFileContents(file.contents),\n startingLine,\n totalLines\n )\n : file.contents,\n hastConfig\n )\n );\n\n // Create sparse array for windowed rendering\n const code = isWindowedHighlight ? new Array(startingLine) : highlightedLines;\n if (isWindowedHighlight) {\n code.push(...highlightedLines);\n }\n\n return { code, themeStyles, baseThemeType };\n}\n\nfunction extractWindowedFileContent(\n lines: string[],\n startingLine: number,\n totalLines: number\n): string {\n if (lines.length === 0) {\n return '';\n }\n const endLine = Math.min(startingLine + totalLines, lines.length);\n return lines.slice(startingLine, endLine).join('');\n}\n"],"mappings":";;;;;;;;AAiBA,MAAM,6BAAwD,EAC5D,gBAAgB,MAClB;AAEA,SAAgB,0BACd,MACA,aACA,EACE,QAAQ,gBACR,uBACA,uBAEF,EACE,gBACA,cACA,YACA,UAC6B,4BACb;CAClB,IAAI,gBAAgB;EAClB,iBAAiB;EACjB,eAAe;CACjB,OAAO;EAKL,eAAe;EACf,aAAa;CACf;CACA,MAAM,sBAAsB,eAAe,KAAK,aAAa;CAC7D,MAAM,EAAE,OAAO,iBACb,2BAA2B,mBAAmB;CAChD,MAAM,OAAO,iBACT,SACC,KAAK,QAAQ,wBAAwB,KAAK,IAAI;CACnD,MAAM,gBACJ,OAAO,UAAU,WAAW,YAAY,SAAS,KAAK,CAAC,CAAC,OAAO,KAAA;CACjE,MAAM,cAAc,0BAA0B;EAC5C;EACA;CACF,CAAC;CACD,MAAM,YAAY,qBAA6B;EAC7C,MAAM;EACN,WAAW,kBAAkB,IAAI;EACjC,YAAY,kBAAkB;CAChC;CAOA,MAAM,oBAAwD;EAC5D,IAAI,OAAO,UAAU,UACnB,OAAO;GACL;GACA;GACA;GACA,cAAc;GACd,mBAAmB,wBAAwB,OAAO;GAClD;GACA,mBAAmB;EACrB;EAEF,OAAO;GACL;GACA,QAAQ;GACR;GACA,cAAc;GACd,mBAAmB,wBAAwB,OAAO;GAClD;GACA,mBAAmB;EACrB;CACF,EAAA,CAAG;CACH,MAAM,mBAAmB,aACvB,YAAY,WACV,sBACI,2BACE,SAAS,sBAAsB,KAAK,QAAQ,GAC5C,cACA,UACF,IACA,KAAK,UACT,UACF,CACF;CAGA,MAAM,OAAO,sBAAsB,IAAI,MAAM,YAAY,IAAI;CAC7D,IAAI,qBACF,KAAK,KAAK,GAAG,gBAAgB;CAG/B,OAAO;EAAE;EAAM;EAAa;CAAc;AAC5C;AAEA,SAAS,2BACP,OACA,cACA,YACQ;CACR,IAAI,MAAM,WAAW,GACnB,OAAO;CAET,MAAM,UAAU,KAAK,IAAI,eAAe,YAAY,MAAM,MAAM;CAChE,OAAO,MAAM,MAAM,cAAc,OAAO,CAAC,CAAC,KAAK,EAAE;AACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveRegion.d.ts","names":[],"sources":["../../src/utils/resolveRegion.ts"],"mappings":";;;UAOU,sBAAA;EACR,SAAA;EACA,iBAAA;EACA,eAAA;EACA,UAAA;EACA,eAAA,GAAkB,GAAG;AAAA;AAAA,iBAYP,aAAA,CACd,IAAA,EAAM,gBAAA,EACN,MAAA,EAAQ,sBAAA,GACP,gBAAA"}
1
+ {"version":3,"file":"resolveRegion.d.ts","names":[],"sources":["../../src/utils/resolveRegion.ts"],"mappings":";;;UAWU,sBAAA;EACR,SAAA;EACA,iBAAA;EACA,eAAA;EACA,UAAA;EACA,eAAA,GAAkB,GAAG;AAAA;AAAA,iBAYP,aAAA,CACd,IAAA,EAAM,gBAAA,EACN,MAAA,EAAQ,sBAAA,GACP,gBAAA"}
@@ -1,3 +1,4 @@
1
+ import { getHunkSideEndBoundary, getHunkSideStartBoundary } from "./getHunkSideBoundaries.js";
1
2
  //#region src/utils/resolveRegion.ts
2
3
  function resolveRegion(diff, target) {
3
4
  const { resolution, hunkIndex, startContentIndex, endContentIndex, indexesToDelete = /* @__PURE__ */ new Set() } = target;
@@ -31,7 +32,7 @@ function resolveRegion(diff, target) {
31
32
  const updatesEOFState = hunkIndex === hunks.length - 1 && endContentIndex === currentHunk.hunkContent.length - 1;
32
33
  const shouldProcessCollapsedContext = !diff.isPartial;
33
34
  for (const [index, hunk] of hunks.entries()) {
34
- processCollapsedContext(diff, resolvedDiff, cursor, hunk.deletionLineIndex - hunk.collapsedBefore, hunk.additionLineIndex - hunk.collapsedBefore, hunk.collapsedBefore, shouldProcessCollapsedContext);
35
+ processCollapsedContext(diff, resolvedDiff, cursor, getHunkSideStartBoundary(hunk.deletionStart, hunk.deletionCount) - hunk.collapsedBefore, getHunkSideStartBoundary(hunk.additionStart, hunk.additionCount) - hunk.collapsedBefore, hunk.collapsedBefore, shouldProcessCollapsedContext);
35
36
  const newHunk = {
36
37
  ...hunk,
37
38
  hunkContent: [],
@@ -88,10 +89,25 @@ function resolveRegion(diff, target) {
88
89
  newHunk.noEOFCRAdditions = noEOFCR;
89
90
  newHunk.noEOFCRDeletions = noEOFCR;
90
91
  }
92
+ if (newHunk.additionCount === 0) {
93
+ newHunk.additionStart--;
94
+ if (!diff.isPartial) newHunk.additionLineIndex--;
95
+ }
96
+ if (newHunk.deletionCount === 0) {
97
+ newHunk.deletionStart--;
98
+ if (!diff.isPartial) newHunk.deletionLineIndex--;
99
+ }
91
100
  resolvedDiff.hunks.push(newHunk);
92
101
  }
93
102
  const finalHunk = hunks.at(-1);
94
- if (finalHunk != null && !diff.isPartial) pushCollapsedContextLines(resolvedDiff, deletionLines, additionLines, finalHunk.deletionLineIndex + finalHunk.deletionCount, finalHunk.additionLineIndex + finalHunk.additionCount, Math.min(deletionLines.length - (finalHunk.deletionLineIndex + finalHunk.deletionCount), additionLines.length - (finalHunk.additionLineIndex + finalHunk.additionCount)));
103
+ if (finalHunk != null && !diff.isPartial) {
104
+ const finalDeletionEnd = getHunkSideEndBoundary(finalHunk.deletionStart, finalHunk.deletionCount);
105
+ const finalAdditionEnd = getHunkSideEndBoundary(finalHunk.additionStart, finalHunk.additionCount);
106
+ const trailingContext = Math.min(deletionLines.length - finalDeletionEnd, additionLines.length - finalAdditionEnd);
107
+ pushCollapsedContextLines(resolvedDiff, deletionLines, additionLines, finalDeletionEnd, finalAdditionEnd, trailingContext);
108
+ cursor.splitLineCount += trailingContext;
109
+ cursor.unifiedLineCount += trailingContext;
110
+ }
95
111
  resolvedDiff.splitLineCount = cursor.splitLineCount;
96
112
  resolvedDiff.unifiedLineCount = cursor.unifiedLineCount;
97
113
  return resolvedDiff;
@@ -1 +1 @@
1
- {"version":3,"file":"resolveRegion.js","names":[],"sources":["../../src/utils/resolveRegion.ts"],"sourcesContent":["import type {\n ChangeContent,\n ContextContent,\n FileDiffMetadata,\n Hunk,\n} from '../types';\n\ninterface RegionResolutionTarget {\n hunkIndex: number;\n startContentIndex: number;\n endContentIndex: number;\n resolution: 'deletions' | 'additions' | 'both';\n indexesToDelete?: Set<number>;\n}\n\ninterface CursorState {\n nextAdditionLineIndex: number;\n nextDeletionLineIndex: number;\n nextAdditionStart: number;\n nextDeletionStart: number;\n splitLineCount: number;\n unifiedLineCount: number;\n}\n\nexport function resolveRegion(\n diff: FileDiffMetadata,\n target: RegionResolutionTarget\n): FileDiffMetadata {\n const {\n resolution,\n hunkIndex,\n startContentIndex,\n endContentIndex,\n indexesToDelete = new Set(),\n } = target;\n const currentHunk = diff.hunks[hunkIndex];\n if (currentHunk == null) {\n console.error({ diff, hunkIndex });\n throw new Error(`resolveRegion: Invalid hunk index: ${hunkIndex}`);\n }\n\n if (\n startContentIndex < 0 ||\n endContentIndex >= currentHunk.hunkContent.length ||\n startContentIndex > endContentIndex\n ) {\n throw new Error(\n `resolveRegion: Invalid content range, ${startContentIndex}, ${endContentIndex}`\n );\n }\n\n const { hunks, additionLines, deletionLines } = diff;\n const resolvedDiff: FileDiffMetadata = {\n ...diff,\n hunks: [],\n deletionLines: [],\n additionLines: [],\n splitLineCount: 0,\n unifiedLineCount: 0,\n cacheKey:\n diff.cacheKey != null\n ? `${diff.cacheKey}:${resolution[0]}-${hunkIndex}:${startContentIndex}-${endContentIndex}`\n : undefined,\n };\n\n const cursor: CursorState = {\n nextAdditionLineIndex: 0,\n nextDeletionLineIndex: 0,\n nextAdditionStart: 1,\n nextDeletionStart: 1,\n splitLineCount: 0,\n unifiedLineCount: 0,\n };\n const updatesEOFState =\n hunkIndex === hunks.length - 1 &&\n endContentIndex === currentHunk.hunkContent.length - 1;\n const shouldProcessCollapsedContext = !diff.isPartial;\n\n for (const [index, hunk] of hunks.entries()) {\n processCollapsedContext(\n diff,\n resolvedDiff,\n cursor,\n hunk.deletionLineIndex - hunk.collapsedBefore,\n hunk.additionLineIndex - hunk.collapsedBefore,\n hunk.collapsedBefore,\n shouldProcessCollapsedContext\n );\n\n const newHunk: Hunk = {\n ...hunk,\n hunkContent: [],\n additionStart: cursor.nextAdditionStart,\n deletionStart: cursor.nextDeletionStart,\n additionLineIndex: cursor.nextAdditionLineIndex,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionCount: 0,\n deletionCount: 0,\n deletionLines: 0,\n additionLines: 0,\n splitLineStart: cursor.splitLineCount,\n unifiedLineStart: cursor.unifiedLineCount,\n splitLineCount: 0,\n unifiedLineCount: 0,\n };\n\n for (const [contentIndex, content] of hunk.hunkContent.entries()) {\n // If we are outside of the targeted hunk or content region\n if (\n index !== hunkIndex ||\n contentIndex < startContentIndex ||\n contentIndex > endContentIndex\n ) {\n pushContentLinesToDiff(\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent = {\n ...content,\n additionLineIndex: cursor.nextAdditionLineIndex,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n // If we are at an index to delete, replace with an empty context node\n else if (indexesToDelete.has(contentIndex)) {\n newHunk.hunkContent.push({\n type: 'context',\n lines: 0,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n });\n }\n // There's nothing to `resolve` with context nodes, so just push them as\n // they are\n else if (content.type === 'context') {\n pushContentLinesToDiff(\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent: ContextContent = {\n ...content,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n // Looks like we have a change to resolve and push\n else {\n pushResolveLinesToDiff(\n resolution,\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent: ContextContent = {\n type: 'context',\n lines:\n resolution === 'deletions'\n ? content.deletions\n : resolution === 'additions'\n ? content.additions\n : content.deletions + content.additions,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n }\n\n if (index === hunkIndex && updatesEOFState) {\n const noEOFCR =\n resolution === 'deletions'\n ? hunk.noEOFCRDeletions\n : hunk.noEOFCRAdditions;\n newHunk.noEOFCRAdditions = noEOFCR;\n newHunk.noEOFCRDeletions = noEOFCR;\n }\n\n resolvedDiff.hunks.push(newHunk);\n }\n\n const finalHunk = hunks.at(-1);\n if (finalHunk != null && !diff.isPartial) {\n pushCollapsedContextLines(\n resolvedDiff,\n deletionLines,\n additionLines,\n finalHunk.deletionLineIndex + finalHunk.deletionCount,\n finalHunk.additionLineIndex + finalHunk.additionCount,\n Math.min(\n deletionLines.length -\n (finalHunk.deletionLineIndex + finalHunk.deletionCount),\n additionLines.length -\n (finalHunk.additionLineIndex + finalHunk.additionCount)\n )\n );\n }\n\n resolvedDiff.splitLineCount = cursor.splitLineCount;\n resolvedDiff.unifiedLineCount = cursor.unifiedLineCount;\n\n return resolvedDiff;\n}\n\nfunction pushCollapsedContextLines(\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[],\n deletionLineIndex: number,\n additionLineIndex: number,\n lineCount: number\n) {\n for (let index = 0; index < lineCount; index++) {\n const deletionLine = deletionLines[deletionLineIndex + index];\n const additionLine = additionLines[additionLineIndex + index];\n if (deletionLine == null || additionLine == null) {\n throw new Error(\n 'pushCollapsedContextLines: missing collapsed context line'\n );\n }\n diff.deletionLines.push(deletionLine);\n diff.additionLines.push(additionLine);\n }\n}\n\n// Partial patches track omitted context in `collapsedBefore`, but those lines do\n// not exist in the diff's line arrays. Keep the virtual row counts and file\n// positions in sync without inventing hidden lines.\nfunction processCollapsedContext(\n sourceDiff: FileDiffMetadata,\n resolvedDiff: FileDiffMetadata,\n cursor: CursorState,\n deletionLineIndex: number,\n additionLineIndex: number,\n lineCount: number,\n shouldProcessContent: boolean\n) {\n if (lineCount <= 0) {\n return;\n }\n\n if (shouldProcessContent) {\n pushCollapsedContextLines(\n resolvedDiff,\n sourceDiff.deletionLines,\n sourceDiff.additionLines,\n deletionLineIndex,\n additionLineIndex,\n lineCount\n );\n cursor.nextAdditionLineIndex += lineCount;\n cursor.nextDeletionLineIndex += lineCount;\n }\n\n cursor.nextAdditionStart += lineCount;\n cursor.nextDeletionStart += lineCount;\n cursor.splitLineCount += lineCount;\n cursor.unifiedLineCount += lineCount;\n}\n\nfunction pushContentLinesToDiff(\n content: ContextContent | ChangeContent,\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[]\n) {\n if (content.type === 'context') {\n for (let i = 0; i < content.lines; i++) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error('pushContentLinesToDiff: Context line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n } else {\n const len = Math.max(content.deletions, content.additions);\n for (let i = 0; i < len; i++) {\n if (i < content.deletions) {\n const line = deletionLines[content.deletionLineIndex + i];\n if (line == null) {\n console.error({ deletionLines, content, i });\n throw new Error(\n 'pushContentLinesToDiff: Deletion line does not exist'\n );\n }\n diff.deletionLines.push(line);\n }\n if (i < content.additions) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error(\n 'pushContentLinesToDiff: Addition line does not exist'\n );\n }\n diff.additionLines.push(line);\n }\n }\n }\n}\n\nfunction pushResolveLinesToDiff(\n resolution: 'deletions' | 'additions' | 'both',\n content: ChangeContent,\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[]\n) {\n if (resolution === 'deletions' || resolution === 'both') {\n for (let i = 0; i < content.deletions; i++) {\n const line = deletionLines[content.deletionLineIndex + i];\n if (line == null) {\n console.error({ deletionLines, content, i });\n throw new Error('pushResolveLinesToDiff: Deletion line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n }\n if (resolution === 'additions' || resolution === 'both') {\n for (let i = 0; i < content.additions; i++) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error('pushResolveLinesToDiff: Addition line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n }\n}\n\nfunction advanceCursor(\n content: ChangeContent | ContextContent,\n cursor: CursorState,\n hunk: Hunk\n) {\n if (content.type === 'context') {\n cursor.nextAdditionLineIndex += content.lines;\n cursor.nextDeletionLineIndex += content.lines;\n cursor.nextAdditionStart += content.lines;\n cursor.nextDeletionStart += content.lines;\n cursor.splitLineCount += content.lines;\n cursor.unifiedLineCount += content.lines;\n\n hunk.additionCount += content.lines;\n hunk.deletionCount += content.lines;\n hunk.splitLineCount += content.lines;\n hunk.unifiedLineCount += content.lines;\n } else {\n cursor.nextAdditionLineIndex += content.additions;\n cursor.nextDeletionLineIndex += content.deletions;\n cursor.nextAdditionStart += content.additions;\n cursor.nextDeletionStart += content.deletions;\n cursor.splitLineCount += Math.max(content.deletions, content.additions);\n cursor.unifiedLineCount += content.deletions + content.additions;\n\n hunk.deletionCount += content.deletions;\n hunk.deletionLines += content.deletions;\n hunk.additionCount += content.additions;\n hunk.additionLines += content.additions;\n hunk.splitLineCount += Math.max(content.deletions, content.additions);\n hunk.unifiedLineCount += content.deletions + content.additions;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolveRegion.js","names":[],"sources":["../../src/utils/resolveRegion.ts"],"sourcesContent":["import type {\n ChangeContent,\n ContextContent,\n FileDiffMetadata,\n Hunk,\n} from '../types';\nimport {\n getHunkSideEndBoundary,\n getHunkSideStartBoundary,\n} from './getHunkSideBoundaries';\n\ninterface RegionResolutionTarget {\n hunkIndex: number;\n startContentIndex: number;\n endContentIndex: number;\n resolution: 'deletions' | 'additions' | 'both';\n indexesToDelete?: Set<number>;\n}\n\ninterface CursorState {\n nextAdditionLineIndex: number;\n nextDeletionLineIndex: number;\n nextAdditionStart: number;\n nextDeletionStart: number;\n splitLineCount: number;\n unifiedLineCount: number;\n}\n\nexport function resolveRegion(\n diff: FileDiffMetadata,\n target: RegionResolutionTarget\n): FileDiffMetadata {\n const {\n resolution,\n hunkIndex,\n startContentIndex,\n endContentIndex,\n indexesToDelete = new Set(),\n } = target;\n const currentHunk = diff.hunks[hunkIndex];\n if (currentHunk == null) {\n console.error({ diff, hunkIndex });\n throw new Error(`resolveRegion: Invalid hunk index: ${hunkIndex}`);\n }\n\n if (\n startContentIndex < 0 ||\n endContentIndex >= currentHunk.hunkContent.length ||\n startContentIndex > endContentIndex\n ) {\n throw new Error(\n `resolveRegion: Invalid content range, ${startContentIndex}, ${endContentIndex}`\n );\n }\n\n const { hunks, additionLines, deletionLines } = diff;\n const resolvedDiff: FileDiffMetadata = {\n ...diff,\n hunks: [],\n deletionLines: [],\n additionLines: [],\n splitLineCount: 0,\n unifiedLineCount: 0,\n cacheKey:\n diff.cacheKey != null\n ? `${diff.cacheKey}:${resolution[0]}-${hunkIndex}:${startContentIndex}-${endContentIndex}`\n : undefined,\n };\n\n const cursor: CursorState = {\n nextAdditionLineIndex: 0,\n nextDeletionLineIndex: 0,\n nextAdditionStart: 1,\n nextDeletionStart: 1,\n splitLineCount: 0,\n unifiedLineCount: 0,\n };\n const updatesEOFState =\n hunkIndex === hunks.length - 1 &&\n endContentIndex === currentHunk.hunkContent.length - 1;\n const shouldProcessCollapsedContext = !diff.isPartial;\n\n for (const [index, hunk] of hunks.entries()) {\n processCollapsedContext(\n diff,\n resolvedDiff,\n cursor,\n getHunkSideStartBoundary(hunk.deletionStart, hunk.deletionCount) -\n hunk.collapsedBefore,\n getHunkSideStartBoundary(hunk.additionStart, hunk.additionCount) -\n hunk.collapsedBefore,\n hunk.collapsedBefore,\n shouldProcessCollapsedContext\n );\n\n const newHunk: Hunk = {\n ...hunk,\n hunkContent: [],\n additionStart: cursor.nextAdditionStart,\n deletionStart: cursor.nextDeletionStart,\n additionLineIndex: cursor.nextAdditionLineIndex,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionCount: 0,\n deletionCount: 0,\n deletionLines: 0,\n additionLines: 0,\n splitLineStart: cursor.splitLineCount,\n unifiedLineStart: cursor.unifiedLineCount,\n splitLineCount: 0,\n unifiedLineCount: 0,\n };\n\n for (const [contentIndex, content] of hunk.hunkContent.entries()) {\n // If we are outside of the targeted hunk or content region\n if (\n index !== hunkIndex ||\n contentIndex < startContentIndex ||\n contentIndex > endContentIndex\n ) {\n pushContentLinesToDiff(\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent = {\n ...content,\n additionLineIndex: cursor.nextAdditionLineIndex,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n // If we are at an index to delete, replace with an empty context node\n else if (indexesToDelete.has(contentIndex)) {\n newHunk.hunkContent.push({\n type: 'context',\n lines: 0,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n });\n }\n // There's nothing to `resolve` with context nodes, so just push them as\n // they are\n else if (content.type === 'context') {\n pushContentLinesToDiff(\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent: ContextContent = {\n ...content,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n // Looks like we have a change to resolve and push\n else {\n pushResolveLinesToDiff(\n resolution,\n content,\n resolvedDiff,\n deletionLines,\n additionLines\n );\n const newContent: ContextContent = {\n type: 'context',\n lines:\n resolution === 'deletions'\n ? content.deletions\n : resolution === 'additions'\n ? content.additions\n : content.deletions + content.additions,\n deletionLineIndex: cursor.nextDeletionLineIndex,\n additionLineIndex: cursor.nextAdditionLineIndex,\n };\n newHunk.hunkContent.push(newContent);\n advanceCursor(newContent, cursor, newHunk);\n }\n }\n\n if (index === hunkIndex && updatesEOFState) {\n const noEOFCR =\n resolution === 'deletions'\n ? hunk.noEOFCRDeletions\n : hunk.noEOFCRAdditions;\n newHunk.noEOFCRAdditions = noEOFCR;\n newHunk.noEOFCRDeletions = noEOFCR;\n }\n\n if (newHunk.additionCount === 0) {\n newHunk.additionStart--;\n if (!diff.isPartial) {\n newHunk.additionLineIndex--;\n }\n }\n if (newHunk.deletionCount === 0) {\n newHunk.deletionStart--;\n if (!diff.isPartial) {\n newHunk.deletionLineIndex--;\n }\n }\n\n resolvedDiff.hunks.push(newHunk);\n }\n\n const finalHunk = hunks.at(-1);\n if (finalHunk != null && !diff.isPartial) {\n const finalDeletionEnd = getHunkSideEndBoundary(\n finalHunk.deletionStart,\n finalHunk.deletionCount\n );\n const finalAdditionEnd = getHunkSideEndBoundary(\n finalHunk.additionStart,\n finalHunk.additionCount\n );\n const trailingContext = Math.min(\n deletionLines.length - finalDeletionEnd,\n additionLines.length - finalAdditionEnd\n );\n pushCollapsedContextLines(\n resolvedDiff,\n deletionLines,\n additionLines,\n finalDeletionEnd,\n finalAdditionEnd,\n trailingContext\n );\n cursor.splitLineCount += trailingContext;\n cursor.unifiedLineCount += trailingContext;\n }\n\n resolvedDiff.splitLineCount = cursor.splitLineCount;\n resolvedDiff.unifiedLineCount = cursor.unifiedLineCount;\n\n return resolvedDiff;\n}\n\nfunction pushCollapsedContextLines(\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[],\n deletionLineIndex: number,\n additionLineIndex: number,\n lineCount: number\n) {\n for (let index = 0; index < lineCount; index++) {\n const deletionLine = deletionLines[deletionLineIndex + index];\n const additionLine = additionLines[additionLineIndex + index];\n if (deletionLine == null || additionLine == null) {\n throw new Error(\n 'pushCollapsedContextLines: missing collapsed context line'\n );\n }\n diff.deletionLines.push(deletionLine);\n diff.additionLines.push(additionLine);\n }\n}\n\n// Partial patches track omitted context in `collapsedBefore`, but those lines do\n// not exist in the diff's line arrays. Keep the virtual row counts and file\n// positions in sync without inventing hidden lines.\nfunction processCollapsedContext(\n sourceDiff: FileDiffMetadata,\n resolvedDiff: FileDiffMetadata,\n cursor: CursorState,\n deletionLineIndex: number,\n additionLineIndex: number,\n lineCount: number,\n shouldProcessContent: boolean\n) {\n if (lineCount <= 0) {\n return;\n }\n\n if (shouldProcessContent) {\n pushCollapsedContextLines(\n resolvedDiff,\n sourceDiff.deletionLines,\n sourceDiff.additionLines,\n deletionLineIndex,\n additionLineIndex,\n lineCount\n );\n cursor.nextAdditionLineIndex += lineCount;\n cursor.nextDeletionLineIndex += lineCount;\n }\n\n cursor.nextAdditionStart += lineCount;\n cursor.nextDeletionStart += lineCount;\n cursor.splitLineCount += lineCount;\n cursor.unifiedLineCount += lineCount;\n}\n\nfunction pushContentLinesToDiff(\n content: ContextContent | ChangeContent,\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[]\n) {\n if (content.type === 'context') {\n for (let i = 0; i < content.lines; i++) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error('pushContentLinesToDiff: Context line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n } else {\n const len = Math.max(content.deletions, content.additions);\n for (let i = 0; i < len; i++) {\n if (i < content.deletions) {\n const line = deletionLines[content.deletionLineIndex + i];\n if (line == null) {\n console.error({ deletionLines, content, i });\n throw new Error(\n 'pushContentLinesToDiff: Deletion line does not exist'\n );\n }\n diff.deletionLines.push(line);\n }\n if (i < content.additions) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error(\n 'pushContentLinesToDiff: Addition line does not exist'\n );\n }\n diff.additionLines.push(line);\n }\n }\n }\n}\n\nfunction pushResolveLinesToDiff(\n resolution: 'deletions' | 'additions' | 'both',\n content: ChangeContent,\n diff: FileDiffMetadata,\n deletionLines: string[],\n additionLines: string[]\n) {\n if (resolution === 'deletions' || resolution === 'both') {\n for (let i = 0; i < content.deletions; i++) {\n const line = deletionLines[content.deletionLineIndex + i];\n if (line == null) {\n console.error({ deletionLines, content, i });\n throw new Error('pushResolveLinesToDiff: Deletion line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n }\n if (resolution === 'additions' || resolution === 'both') {\n for (let i = 0; i < content.additions; i++) {\n const line = additionLines[content.additionLineIndex + i];\n if (line == null) {\n console.error({ additionLines, content, i });\n throw new Error('pushResolveLinesToDiff: Addition line does not exist');\n }\n diff.deletionLines.push(line);\n diff.additionLines.push(line);\n }\n }\n}\n\nfunction advanceCursor(\n content: ChangeContent | ContextContent,\n cursor: CursorState,\n hunk: Hunk\n) {\n if (content.type === 'context') {\n cursor.nextAdditionLineIndex += content.lines;\n cursor.nextDeletionLineIndex += content.lines;\n cursor.nextAdditionStart += content.lines;\n cursor.nextDeletionStart += content.lines;\n cursor.splitLineCount += content.lines;\n cursor.unifiedLineCount += content.lines;\n\n hunk.additionCount += content.lines;\n hunk.deletionCount += content.lines;\n hunk.splitLineCount += content.lines;\n hunk.unifiedLineCount += content.lines;\n } else {\n cursor.nextAdditionLineIndex += content.additions;\n cursor.nextDeletionLineIndex += content.deletions;\n cursor.nextAdditionStart += content.additions;\n cursor.nextDeletionStart += content.deletions;\n cursor.splitLineCount += Math.max(content.deletions, content.additions);\n cursor.unifiedLineCount += content.deletions + content.additions;\n\n hunk.deletionCount += content.deletions;\n hunk.deletionLines += content.deletions;\n hunk.additionCount += content.additions;\n hunk.additionLines += content.additions;\n hunk.splitLineCount += Math.max(content.deletions, content.additions);\n hunk.unifiedLineCount += content.deletions + content.additions;\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,13 @@
1
- import { InteractionManagerBaseOptions } from "../managers/InteractionManager.js";
1
+ import { InteractionManagerMode, OnTokenEventProps } from "../managers/InteractionManager.js";
2
2
 
3
3
  //#region src/utils/shouldUseTokenTransformer.d.ts
4
- declare function shouldUseTokenTransformer<TMode extends 'file' | 'diff'>(options: InteractionManagerBaseOptions<TMode> & {
4
+ interface ShouldUseTokenTransformerProps<TMode extends InteractionManagerMode> {
5
+ onTokenClick?(props: OnTokenEventProps<TMode>, event: MouseEvent): unknown;
6
+ onTokenEnter?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;
7
+ onTokenLeave?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;
5
8
  useTokenTransformer?: boolean;
6
- }): boolean;
9
+ }
10
+ declare function shouldUseTokenTransformer<TMode extends 'file' | 'diff' = 'file'>(options: ShouldUseTokenTransformerProps<TMode> | undefined): boolean;
7
11
  //#endregion
8
12
  export { shouldUseTokenTransformer };
9
13
  //# sourceMappingURL=shouldUseTokenTransformer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shouldUseTokenTransformer.d.ts","names":[],"sources":["../../src/utils/shouldUseTokenTransformer.ts"],"mappings":";;;iBAGgB,yBAAA,gCACd,OAAA,EAAS,6BAA6B,CAAC,KAAA;EACrC,mBAAA;AAAA"}
1
+ {"version":3,"file":"shouldUseTokenTransformer.d.ts","names":[],"sources":["../../src/utils/shouldUseTokenTransformer.ts"],"mappings":";;;UAKU,8BAAA,eAA6C,sBAAA;EACrD,YAAA,EAAc,KAAA,EAAO,iBAAA,CAAkB,KAAA,GAAQ,KAAA,EAAO,UAAA;EACtD,YAAA,EAAc,KAAA,EAAO,iBAAA,CAAkB,KAAA,GAAQ,KAAA,EAAO,YAAA;EACtD,YAAA,EAAc,KAAA,EAAO,iBAAA,CAAkB,KAAA,GAAQ,KAAA,EAAO,YAAA;EACtD,mBAAA;AAAA;AAAA,iBAKc,yBAAA,yCAEd,OAAA,EAAS,8BAA8B,CAAC,KAAA"}
@@ -1,6 +1,6 @@
1
1
  //#region src/utils/shouldUseTokenTransformer.ts
2
2
  function shouldUseTokenTransformer(options) {
3
- return options.useTokenTransformer === true || options.onTokenClick != null || options.onTokenEnter != null || options.onTokenLeave != null;
3
+ return options?.useTokenTransformer === true || options?.onTokenClick != null || options?.onTokenEnter != null || options?.onTokenLeave != null;
4
4
  }
5
5
  //#endregion
6
6
  export { shouldUseTokenTransformer };
@@ -1 +1 @@
1
- {"version":3,"file":"shouldUseTokenTransformer.js","names":[],"sources":["../../src/utils/shouldUseTokenTransformer.ts"],"sourcesContent":["import type { InteractionManagerBaseOptions } from '../managers/InteractionManager';\n\n// Token metadata is only needed when token-level interactions are enabled.\nexport function shouldUseTokenTransformer<TMode extends 'file' | 'diff'>(\n options: InteractionManagerBaseOptions<TMode> & {\n useTokenTransformer?: boolean;\n }\n): boolean {\n return (\n options.useTokenTransformer === true ||\n options.onTokenClick != null ||\n options.onTokenEnter != null ||\n options.onTokenLeave != null\n );\n}\n"],"mappings":";AAGA,SAAgB,0BACd,SAGS;CACT,OACE,QAAQ,wBAAwB,QAChC,QAAQ,gBAAgB,QACxB,QAAQ,gBAAgB,QACxB,QAAQ,gBAAgB;AAE5B"}
1
+ {"version":3,"file":"shouldUseTokenTransformer.js","names":[],"sources":["../../src/utils/shouldUseTokenTransformer.ts"],"sourcesContent":["import type {\n InteractionManagerMode,\n OnTokenEventProps,\n} from '../managers/InteractionManager';\n\ninterface ShouldUseTokenTransformerProps<TMode extends InteractionManagerMode> {\n onTokenClick?(props: OnTokenEventProps<TMode>, event: MouseEvent): unknown;\n onTokenEnter?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n onTokenLeave?(props: OnTokenEventProps<TMode>, event: PointerEvent): unknown;\n useTokenTransformer?: boolean;\n}\n\n// Token interaction callbacks require token metadata in the markup to fire at\n// all, so attaching any token callback enables the transformer;\nexport function shouldUseTokenTransformer<\n TMode extends 'file' | 'diff' = 'file',\n>(options: ShouldUseTokenTransformerProps<TMode> | undefined): boolean {\n return (\n options?.useTokenTransformer === true ||\n options?.onTokenClick != null ||\n options?.onTokenEnter != null ||\n options?.onTokenLeave != null\n );\n}\n"],"mappings":";AAcA,SAAgB,0BAEd,SAAqE;CACrE,OACE,SAAS,wBAAwB,QACjC,SAAS,gBAAgB,QACzB,SAAS,gBAAgB,QACzB,SAAS,gBAAgB;AAE7B"}
@@ -0,0 +1,24 @@
1
+ import { ChangeContent, ContextContent, FileDiffMetadata, Hunk } from "../types.js";
2
+ import { CreatePatchOptionsNonabortable } from "diff";
3
+
4
+ //#region src/utils/updateDiffHunks.d.ts
5
+ type HunkContent = ContextContent | ChangeContent;
6
+ type HunkMetadataUpdate = Pick<FileDiffMetadata, 'hunks' | 'splitLineCount' | 'unifiedLineCount' | 'type'>;
7
+ type FullDiffHunkUpdate = HunkMetadataUpdate & Pick<FileDiffMetadata, 'additionLines' | 'deletionLines'>;
8
+ /** Rebuilds all hunk metadata from the current deletion/addition line arrays. */
9
+ declare function recomputeDiffHunks(diff: FileDiffMetadata, parseDiffOptions?: CreatePatchOptionsNonabortable): FullDiffHunkUpdate;
10
+ declare function shouldTopAlignAdditionRecompute(diff: FileDiffMetadata, additionLines: string[]): boolean;
11
+ declare function recomputeTopAlignedAdditionDiff(diff: FileDiffMetadata, additionLines: string[], parseDiffOptions?: CreatePatchOptionsNonabortable): FullDiffHunkUpdate;
12
+ declare function recomputeEmptyDocumentDiff(diff: FileDiffMetadata, parseDiffOptions?: CreatePatchOptionsNonabortable): FullDiffHunkUpdate;
13
+ /** Rebuilds diff hunks after an edit, top-aligning sparse addition sides when needed. */
14
+ declare function recomputeDiffHunksForEdit(diff: FileDiffMetadata, parseDiffOptions?: CreatePatchOptionsNonabortable): FullDiffHunkUpdate;
15
+ declare function preserveTrailingEditorBlankLine(recomputed: Pick<FullDiffHunkUpdate, 'hunks' | 'additionLines' | 'splitLineCount' | 'unifiedLineCount'>, additionLines: string[]): void;
16
+ /** Updates hunk metadata after addition lines change; re-parses affected hunks only. */
17
+ declare function updateDiffHunks(diff: FileDiffMetadata, changedAdditionLineIndexes: Iterable<number>, parseDiffOptions?: CreatePatchOptionsNonabortable): HunkMetadataUpdate;
18
+ declare function syncHunkNoEOFCRFromFullFile(diff: FileDiffMetadata, hunkIndex: number): void;
19
+ declare function offsetHunkContent(content: HunkContent, additionOffset: number, deletionOffset: number): HunkContent;
20
+ declare function recomputeHunkRenderLineCounts(hunk: Hunk): void;
21
+ declare function recomputeDiffRenderLineCounts(diff: Pick<FileDiffMetadata, 'hunks' | 'splitLineCount' | 'unifiedLineCount' | 'additionLines'>): void;
22
+ //#endregion
23
+ export { offsetHunkContent, preserveTrailingEditorBlankLine, recomputeDiffHunks, recomputeDiffHunksForEdit, recomputeDiffRenderLineCounts, recomputeEmptyDocumentDiff, recomputeHunkRenderLineCounts, recomputeTopAlignedAdditionDiff, shouldTopAlignAdditionRecompute, syncHunkNoEOFCRFromFullFile, updateDiffHunks };
24
+ //# sourceMappingURL=updateDiffHunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateDiffHunks.d.ts","names":[],"sources":["../../src/utils/updateDiffHunks.ts"],"mappings":";;;;KAgBK,WAAA,GAAc,cAAA,GAAiB,aAAa;AAAA,KAE5C,kBAAA,GAAqB,IAAI,CAC5B,gBAAA;AAAA,KAIG,kBAAA,GAAqB,kBAAA,GACxB,IAAA,CAAK,gBAAA;;iBAGS,kBAAA,CACd,IAAA,EAAM,gBAAA,EACN,gBAAA,GAAmB,8BAAA,GAClB,kBAAA;AAAA,iBAwDa,+BAAA,CACd,IAAA,EAAM,gBAAgB,EACtB,aAAA;AAAA,iBAYc,+BAAA,CACd,IAAA,EAAM,gBAAA,EACN,aAAA,YACA,gBAAA,GAAmB,8BAAA,GAClB,kBAAA;AAAA,iBAkCa,0BAAA,CACd,IAAA,EAAM,gBAAA,EACN,gBAAA,GAAmB,8BAAA,GAClB,kBAAA;;iBAKa,yBAAA,CACd,IAAA,EAAM,gBAAA,EACN,gBAAA,GAAmB,8BAAA,GAClB,kBAAA;AAAA,iBAwBa,+BAAA,CACd,UAAA,EAAY,IAAI,CACd,kBAAA,sEAGF,aAAA;AA/JgB;AAAA,iBAwMF,eAAA,CACd,IAAA,EAAM,gBAAA,EACN,0BAAA,EAA4B,QAAA,UAC5B,gBAAA,GAAmB,8BAAA,GAClB,kBAAA;AAAA,iBA2Ja,2BAAA,CACd,IAAA,EAAM,gBAAgB,EACtB,SAAA;AAAA,iBAiDc,iBAAA,CACd,OAAA,EAAS,WAAA,EACT,cAAA,UACA,cAAA,WACC,WAAW;AAAA,iBAQE,6BAAA,CAA8B,IAAU,EAAJ,IAAI;AAAA,iBAkBxC,6BAAA,CACd,IAAA,EAAM,IAAI,CACR,gBAAA"}