@openclaw/diffs 2026.5.27 → 2026.5.28-beta.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 (838) hide show
  1. package/README.md +1 -0
  2. package/dist/assets/viewer-runtime.js +50 -50
  3. package/dist/index.js +427 -88
  4. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts +22 -7
  5. package/node_modules/@pierre/diffs/dist/components/CodeView.d.ts.map +1 -1
  6. package/node_modules/@pierre/diffs/dist/components/CodeView.js +202 -105
  7. package/node_modules/@pierre/diffs/dist/components/CodeView.js.map +1 -1
  8. package/node_modules/@pierre/diffs/dist/components/File.d.ts +2 -0
  9. package/node_modules/@pierre/diffs/dist/components/File.d.ts.map +1 -1
  10. package/node_modules/@pierre/diffs/dist/components/File.js +13 -9
  11. package/node_modules/@pierre/diffs/dist/components/File.js.map +1 -1
  12. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts +2 -0
  13. package/node_modules/@pierre/diffs/dist/components/FileDiff.d.ts.map +1 -1
  14. package/node_modules/@pierre/diffs/dist/components/FileDiff.js +12 -6
  15. package/node_modules/@pierre/diffs/dist/components/FileDiff.js.map +1 -1
  16. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts +4 -2
  17. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.d.ts.map +1 -1
  18. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js +23 -6
  19. package/node_modules/@pierre/diffs/dist/components/VirtualizedFile.js.map +1 -1
  20. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts +9 -8
  21. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  22. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js +329 -142
  23. package/node_modules/@pierre/diffs/dist/components/VirtualizedFileDiff.js.map +1 -1
  24. package/node_modules/@pierre/diffs/dist/constants.d.ts.map +1 -1
  25. package/node_modules/@pierre/diffs/dist/index.d.ts +2 -2
  26. package/node_modules/@pierre/diffs/dist/index.js +3 -3
  27. package/node_modules/@pierre/diffs/dist/react/index.d.ts +2 -2
  28. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts +1 -0
  29. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  30. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js +12 -5
  31. package/node_modules/@pierre/diffs/dist/renderers/DiffHunksRenderer.js.map +1 -1
  32. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts +1 -0
  33. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.d.ts.map +1 -1
  34. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js +4 -1
  35. package/node_modules/@pierre/diffs/dist/renderers/FileRenderer.js.map +1 -1
  36. package/node_modules/@pierre/diffs/dist/ssr/index.d.ts +2 -2
  37. package/node_modules/@pierre/diffs/dist/types.d.ts +7 -1
  38. package/node_modules/@pierre/diffs/dist/types.d.ts.map +1 -1
  39. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts +28 -0
  40. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -0
  41. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js +111 -0
  42. package/node_modules/@pierre/diffs/dist/utils/computeEstimatedDiffHeights.js.map +1 -0
  43. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.d.ts +8 -0
  44. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -0
  45. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js +31 -0
  46. package/node_modules/@pierre/diffs/dist/utils/getDiffHunksRendererOptions.js.map +1 -0
  47. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.d.ts +8 -0
  48. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.d.ts.map +1 -0
  49. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js +24 -0
  50. package/node_modules/@pierre/diffs/dist/utils/getFileRendererOptions.js.map +1 -0
  51. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js +29 -30
  52. package/node_modules/@pierre/diffs/dist/utils/iterateOverDiff.js.map +1 -1
  53. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js +8 -1
  54. package/node_modules/@pierre/diffs/dist/utils/parsePatchFiles.js.map +1 -1
  55. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts +65 -0
  56. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.d.ts.map +1 -0
  57. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js +94 -0
  58. package/node_modules/@pierre/diffs/dist/utils/virtualDiffLayout.js.map +1 -0
  59. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts +4 -1
  60. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  61. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js +49 -24
  62. package/node_modules/@pierre/diffs/dist/worker/WorkerPoolManager.js.map +1 -1
  63. package/node_modules/@pierre/diffs/dist/worker/types.d.ts +2 -0
  64. package/node_modules/@pierre/diffs/dist/worker/types.d.ts.map +1 -1
  65. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js +163 -40
  66. package/node_modules/@pierre/diffs/dist/worker/worker-portable.js.map +1 -1
  67. package/node_modules/@pierre/diffs/dist/worker/worker.js +60 -30
  68. package/node_modules/@pierre/diffs/dist/worker/worker.js.map +1 -1
  69. package/node_modules/@pierre/diffs/package.json +1 -1
  70. package/node_modules/@shikijs/core/node_modules/@shikijs/types/LICENSE +22 -0
  71. package/node_modules/@shikijs/core/node_modules/@shikijs/types/README.md +7 -0
  72. package/node_modules/@shikijs/core/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  73. package/node_modules/@shikijs/core/node_modules/@shikijs/types/dist/index.mjs +8 -0
  74. package/node_modules/@shikijs/core/node_modules/@shikijs/types/package.json +36 -0
  75. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/LICENSE +22 -0
  76. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/README.md +7 -0
  77. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  78. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/dist/index.mjs +8 -0
  79. package/node_modules/@shikijs/engine-javascript/node_modules/@shikijs/types/package.json +36 -0
  80. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/LICENSE +22 -0
  81. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/README.md +7 -0
  82. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  83. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/dist/index.mjs +8 -0
  84. package/node_modules/@shikijs/engine-oniguruma/node_modules/@shikijs/types/package.json +36 -0
  85. package/node_modules/@shikijs/langs/dist/apex.mjs +1 -1
  86. package/node_modules/@shikijs/langs/dist/bird2.mjs +1 -1
  87. package/node_modules/@shikijs/langs/dist/c3.mjs +1 -1
  88. package/node_modules/@shikijs/langs/dist/cobol.mjs +1 -1
  89. package/node_modules/@shikijs/langs/dist/csharp.mjs +1 -1
  90. package/node_modules/@shikijs/langs/dist/css.mjs +1 -1
  91. package/node_modules/@shikijs/langs/dist/dart.mjs +1 -1
  92. package/node_modules/@shikijs/langs/dist/emacs-lisp.mjs +1 -1
  93. package/node_modules/@shikijs/langs/dist/es-tag-sql.mjs +1 -1
  94. package/node_modules/@shikijs/langs/dist/go.mjs +1 -1
  95. package/node_modules/@shikijs/langs/dist/hack.mjs +1 -1
  96. package/node_modules/@shikijs/langs/dist/julia.mjs +1 -1
  97. package/node_modules/@shikijs/langs/dist/just.mjs +1 -1
  98. package/node_modules/@shikijs/langs/dist/kusto.mjs +1 -1
  99. package/node_modules/@shikijs/langs/dist/latex.mjs +1 -1
  100. package/node_modules/@shikijs/langs/dist/luau.mjs +1 -1
  101. package/node_modules/@shikijs/langs/dist/nextflow-groovy.mjs +1 -1
  102. package/node_modules/@shikijs/langs/dist/php.mjs +1 -1
  103. package/node_modules/@shikijs/langs/dist/ruby.mjs +1 -1
  104. package/node_modules/@shikijs/langs/dist/sql.mjs +1 -1
  105. package/node_modules/@shikijs/langs/dist/typespec.mjs +1 -1
  106. package/node_modules/@shikijs/langs/package.json +6 -3
  107. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/LICENSE +22 -0
  108. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/README.md +7 -0
  109. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  110. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/dist/index.mjs +8 -0
  111. package/node_modules/@shikijs/themes/node_modules/@shikijs/types/package.json +36 -0
  112. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/LICENSE +22 -0
  113. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/README.md +7 -0
  114. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  115. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/dist/index.mjs +8 -0
  116. package/node_modules/@shikijs/transformers/node_modules/@shikijs/types/package.json +36 -0
  117. package/node_modules/@shikijs/types/dist/index.d.mts +686 -684
  118. package/node_modules/@shikijs/types/dist/index.mjs +8 -7
  119. package/node_modules/@shikijs/types/package.json +6 -3
  120. package/node_modules/diff/CONTRIBUTING.md +1 -1
  121. package/node_modules/diff/dist/diff.js +32 -73
  122. package/node_modules/diff/dist/diff.min.js +1 -1
  123. package/node_modules/diff/libcjs/diff/word.d.ts.map +1 -1
  124. package/node_modules/diff/libcjs/diff/word.js +31 -15
  125. package/node_modules/diff/libcjs/util/string.d.ts +2 -14
  126. package/node_modules/diff/libcjs/util/string.d.ts.map +1 -1
  127. package/node_modules/diff/libcjs/util/string.js +2 -61
  128. package/node_modules/diff/libesm/diff/word.d.ts.map +1 -1
  129. package/node_modules/diff/libesm/diff/word.js +31 -16
  130. package/node_modules/diff/libesm/util/string.d.ts +2 -14
  131. package/node_modules/diff/libesm/util/string.d.ts.map +1 -1
  132. package/node_modules/diff/libesm/util/string.js +2 -58
  133. package/node_modules/diff/package.json +24 -22
  134. package/node_modules/diff/release-notes.md +0 -28
  135. package/node_modules/shiki/node_modules/@shikijs/langs/LICENSE +22 -0
  136. package/node_modules/shiki/node_modules/@shikijs/langs/README.md +7 -0
  137. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c-query.d.mts +3 -0
  138. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c-query.mjs +2 -0
  139. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c.d.mts +3 -0
  140. package/node_modules/shiki/node_modules/@shikijs/langs/dist/1c.mjs +2 -0
  141. package/node_modules/shiki/node_modules/@shikijs/langs/dist/abap.d.mts +3 -0
  142. package/node_modules/shiki/node_modules/@shikijs/langs/dist/abap.mjs +5 -0
  143. package/node_modules/shiki/node_modules/@shikijs/langs/dist/actionscript-3.d.mts +3 -0
  144. package/node_modules/shiki/node_modules/@shikijs/langs/dist/actionscript-3.mjs +5 -0
  145. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ada.d.mts +3 -0
  146. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ada.mjs +5 -0
  147. package/node_modules/shiki/node_modules/@shikijs/langs/dist/adoc.d.mts +3 -0
  148. package/node_modules/shiki/node_modules/@shikijs/langs/dist/adoc.mjs +2 -0
  149. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-expression.d.mts +3 -0
  150. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-expression.mjs +5 -0
  151. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-html.d.mts +3 -0
  152. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-html.mjs +16 -0
  153. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-style.d.mts +3 -0
  154. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-style.mjs +8 -0
  155. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-template.d.mts +3 -0
  156. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-inline-template.mjs +10 -0
  157. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-let-declaration.d.mts +3 -0
  158. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-let-declaration.mjs +8 -0
  159. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template-blocks.d.mts +3 -0
  160. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template-blocks.mjs +10 -0
  161. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template.d.mts +3 -0
  162. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-template.mjs +8 -0
  163. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-ts.d.mts +3 -0
  164. package/node_modules/shiki/node_modules/@shikijs/langs/dist/angular-ts.mjs +18 -0
  165. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apache.d.mts +3 -0
  166. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apache.mjs +5 -0
  167. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apex.d.mts +3 -0
  168. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apex.mjs +5 -0
  169. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apl.d.mts +3 -0
  170. package/node_modules/shiki/node_modules/@shikijs/langs/dist/apl.mjs +16 -0
  171. package/node_modules/shiki/node_modules/@shikijs/langs/dist/applescript.d.mts +3 -0
  172. package/node_modules/shiki/node_modules/@shikijs/langs/dist/applescript.mjs +5 -0
  173. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ara.d.mts +3 -0
  174. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ara.mjs +5 -0
  175. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asciidoc.d.mts +3 -0
  176. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asciidoc.mjs +5 -0
  177. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asm.d.mts +3 -0
  178. package/node_modules/shiki/node_modules/@shikijs/langs/dist/asm.mjs +5 -0
  179. package/node_modules/shiki/node_modules/@shikijs/langs/dist/astro.d.mts +3 -0
  180. package/node_modules/shiki/node_modules/@shikijs/langs/dist/astro.mjs +18 -0
  181. package/node_modules/shiki/node_modules/@shikijs/langs/dist/awk.d.mts +3 -0
  182. package/node_modules/shiki/node_modules/@shikijs/langs/dist/awk.mjs +5 -0
  183. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ballerina.d.mts +3 -0
  184. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ballerina.mjs +5 -0
  185. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bash.d.mts +3 -0
  186. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bash.mjs +2 -0
  187. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bat.d.mts +3 -0
  188. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bat.mjs +5 -0
  189. package/node_modules/shiki/node_modules/@shikijs/langs/dist/batch.d.mts +3 -0
  190. package/node_modules/shiki/node_modules/@shikijs/langs/dist/batch.mjs +2 -0
  191. package/node_modules/shiki/node_modules/@shikijs/langs/dist/be.d.mts +3 -0
  192. package/node_modules/shiki/node_modules/@shikijs/langs/dist/be.mjs +2 -0
  193. package/node_modules/shiki/node_modules/@shikijs/langs/dist/beancount.d.mts +3 -0
  194. package/node_modules/shiki/node_modules/@shikijs/langs/dist/beancount.mjs +5 -0
  195. package/node_modules/shiki/node_modules/@shikijs/langs/dist/berry.d.mts +3 -0
  196. package/node_modules/shiki/node_modules/@shikijs/langs/dist/berry.mjs +5 -0
  197. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bibtex.d.mts +3 -0
  198. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bibtex.mjs +5 -0
  199. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bicep.d.mts +3 -0
  200. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bicep.mjs +5 -0
  201. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird.d.mts +3 -0
  202. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird.mjs +2 -0
  203. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird2.d.mts +3 -0
  204. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bird2.mjs +5 -0
  205. package/node_modules/shiki/node_modules/@shikijs/langs/dist/blade.d.mts +3 -0
  206. package/node_modules/shiki/node_modules/@shikijs/langs/dist/blade.mjs +20 -0
  207. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bsl.d.mts +3 -0
  208. package/node_modules/shiki/node_modules/@shikijs/langs/dist/bsl.mjs +8 -0
  209. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c.d.mts +3 -0
  210. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c.mjs +5 -0
  211. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c3.d.mts +3 -0
  212. package/node_modules/shiki/node_modules/@shikijs/langs/dist/c3.mjs +5 -0
  213. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cadence.d.mts +3 -0
  214. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cadence.mjs +5 -0
  215. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cairo.d.mts +3 -0
  216. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cairo.mjs +8 -0
  217. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cdc.d.mts +3 -0
  218. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cdc.mjs +2 -0
  219. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cjs.d.mts +3 -0
  220. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cjs.mjs +2 -0
  221. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clarity.d.mts +3 -0
  222. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clarity.mjs +5 -0
  223. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clj.d.mts +3 -0
  224. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clj.mjs +2 -0
  225. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clojure.d.mts +3 -0
  226. package/node_modules/shiki/node_modules/@shikijs/langs/dist/clojure.mjs +5 -0
  227. package/node_modules/shiki/node_modules/@shikijs/langs/dist/closure-templates.d.mts +3 -0
  228. package/node_modules/shiki/node_modules/@shikijs/langs/dist/closure-templates.mjs +2 -0
  229. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmake.d.mts +3 -0
  230. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmake.mjs +5 -0
  231. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmd.d.mts +3 -0
  232. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cmd.mjs +2 -0
  233. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cobol.d.mts +3 -0
  234. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cobol.mjs +10 -0
  235. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeowners.d.mts +3 -0
  236. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeowners.mjs +5 -0
  237. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeql.d.mts +3 -0
  238. package/node_modules/shiki/node_modules/@shikijs/langs/dist/codeql.mjs +5 -0
  239. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffee.d.mts +3 -0
  240. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffee.mjs +8 -0
  241. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffeescript.d.mts +3 -0
  242. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coffeescript.mjs +2 -0
  243. package/node_modules/shiki/node_modules/@shikijs/langs/dist/common-lisp.d.mts +3 -0
  244. package/node_modules/shiki/node_modules/@shikijs/langs/dist/common-lisp.mjs +5 -0
  245. package/node_modules/shiki/node_modules/@shikijs/langs/dist/console.d.mts +3 -0
  246. package/node_modules/shiki/node_modules/@shikijs/langs/dist/console.mjs +2 -0
  247. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coq.d.mts +3 -0
  248. package/node_modules/shiki/node_modules/@shikijs/langs/dist/coq.mjs +5 -0
  249. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp-macro.d.mts +3 -0
  250. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp-macro.mjs +12 -0
  251. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp.d.mts +3 -0
  252. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cpp.mjs +14 -0
  253. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cql.d.mts +3 -0
  254. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cql.mjs +2 -0
  255. package/node_modules/shiki/node_modules/@shikijs/langs/dist/crystal.d.mts +3 -0
  256. package/node_modules/shiki/node_modules/@shikijs/langs/dist/crystal.mjs +18 -0
  257. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cs.d.mts +3 -0
  258. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cs.mjs +2 -0
  259. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csharp.d.mts +3 -0
  260. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csharp.mjs +5 -0
  261. package/node_modules/shiki/node_modules/@shikijs/langs/dist/css.d.mts +3 -0
  262. package/node_modules/shiki/node_modules/@shikijs/langs/dist/css.mjs +5 -0
  263. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csv.d.mts +3 -0
  264. package/node_modules/shiki/node_modules/@shikijs/langs/dist/csv.mjs +5 -0
  265. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cts.d.mts +3 -0
  266. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cts.mjs +2 -0
  267. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cue.d.mts +3 -0
  268. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cue.mjs +5 -0
  269. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cypher.d.mts +3 -0
  270. package/node_modules/shiki/node_modules/@shikijs/langs/dist/cypher.mjs +5 -0
  271. package/node_modules/shiki/node_modules/@shikijs/langs/dist/d.d.mts +3 -0
  272. package/node_modules/shiki/node_modules/@shikijs/langs/dist/d.mjs +5 -0
  273. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dart.d.mts +3 -0
  274. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dart.mjs +5 -0
  275. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dax.d.mts +3 -0
  276. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dax.mjs +5 -0
  277. package/node_modules/shiki/node_modules/@shikijs/langs/dist/desktop.d.mts +3 -0
  278. package/node_modules/shiki/node_modules/@shikijs/langs/dist/desktop.mjs +5 -0
  279. package/node_modules/shiki/node_modules/@shikijs/langs/dist/diff.d.mts +3 -0
  280. package/node_modules/shiki/node_modules/@shikijs/langs/dist/diff.mjs +5 -0
  281. package/node_modules/shiki/node_modules/@shikijs/langs/dist/docker.d.mts +3 -0
  282. package/node_modules/shiki/node_modules/@shikijs/langs/dist/docker.mjs +5 -0
  283. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dockerfile.d.mts +3 -0
  284. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dockerfile.mjs +2 -0
  285. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dotenv.d.mts +3 -0
  286. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dotenv.mjs +5 -0
  287. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dream-maker.d.mts +3 -0
  288. package/node_modules/shiki/node_modules/@shikijs/langs/dist/dream-maker.mjs +5 -0
  289. package/node_modules/shiki/node_modules/@shikijs/langs/dist/edge.d.mts +3 -0
  290. package/node_modules/shiki/node_modules/@shikijs/langs/dist/edge.mjs +12 -0
  291. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elisp.d.mts +3 -0
  292. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elisp.mjs +2 -0
  293. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elixir.d.mts +3 -0
  294. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elixir.mjs +8 -0
  295. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elm.d.mts +3 -0
  296. package/node_modules/shiki/node_modules/@shikijs/langs/dist/elm.mjs +8 -0
  297. package/node_modules/shiki/node_modules/@shikijs/langs/dist/emacs-lisp.d.mts +3 -0
  298. package/node_modules/shiki/node_modules/@shikijs/langs/dist/emacs-lisp.mjs +5 -0
  299. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erb.d.mts +3 -0
  300. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erb.mjs +10 -0
  301. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erl.d.mts +3 -0
  302. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erl.mjs +2 -0
  303. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erlang.d.mts +3 -0
  304. package/node_modules/shiki/node_modules/@shikijs/langs/dist/erlang.mjs +8 -0
  305. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-css.d.mts +3 -0
  306. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-css.mjs +12 -0
  307. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-glsl.d.mts +3 -0
  308. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-glsl.mjs +12 -0
  309. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-html.d.mts +3 -0
  310. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-html.mjs +12 -0
  311. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-sql.d.mts +3 -0
  312. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-sql.mjs +10 -0
  313. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-xml.d.mts +3 -0
  314. package/node_modules/shiki/node_modules/@shikijs/langs/dist/es-tag-xml.mjs +8 -0
  315. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f.d.mts +3 -0
  316. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f.mjs +2 -0
  317. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f03.d.mts +3 -0
  318. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f03.mjs +2 -0
  319. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f08.d.mts +3 -0
  320. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f08.mjs +2 -0
  321. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f18.d.mts +3 -0
  322. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f18.mjs +2 -0
  323. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f77.d.mts +3 -0
  324. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f77.mjs +2 -0
  325. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f90.d.mts +3 -0
  326. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f90.mjs +2 -0
  327. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f95.d.mts +3 -0
  328. package/node_modules/shiki/node_modules/@shikijs/langs/dist/f95.mjs +2 -0
  329. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fennel.d.mts +3 -0
  330. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fennel.mjs +5 -0
  331. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fish.d.mts +3 -0
  332. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fish.mjs +5 -0
  333. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fluent.d.mts +3 -0
  334. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fluent.mjs +5 -0
  335. package/node_modules/shiki/node_modules/@shikijs/langs/dist/for.d.mts +3 -0
  336. package/node_modules/shiki/node_modules/@shikijs/langs/dist/for.mjs +2 -0
  337. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-fixed-form.d.mts +3 -0
  338. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-fixed-form.mjs +8 -0
  339. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-free-form.d.mts +3 -0
  340. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fortran-free-form.mjs +5 -0
  341. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fs.d.mts +3 -0
  342. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fs.mjs +2 -0
  343. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsharp.d.mts +3 -0
  344. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsharp.mjs +8 -0
  345. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsl.d.mts +3 -0
  346. package/node_modules/shiki/node_modules/@shikijs/langs/dist/fsl.mjs +2 -0
  347. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ftl.d.mts +3 -0
  348. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ftl.mjs +2 -0
  349. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gd.d.mts +3 -0
  350. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gd.mjs +2 -0
  351. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdresource.d.mts +3 -0
  352. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdresource.mjs +10 -0
  353. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdscript.d.mts +3 -0
  354. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdscript.mjs +5 -0
  355. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdshader.d.mts +3 -0
  356. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gdshader.mjs +5 -0
  357. package/node_modules/shiki/node_modules/@shikijs/langs/dist/genie.d.mts +3 -0
  358. package/node_modules/shiki/node_modules/@shikijs/langs/dist/genie.mjs +5 -0
  359. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gherkin.d.mts +3 -0
  360. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gherkin.mjs +5 -0
  361. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-commit.d.mts +3 -0
  362. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-commit.mjs +8 -0
  363. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-rebase.d.mts +3 -0
  364. package/node_modules/shiki/node_modules/@shikijs/langs/dist/git-rebase.mjs +8 -0
  365. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gjs.d.mts +3 -0
  366. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gjs.mjs +2 -0
  367. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gleam.d.mts +3 -0
  368. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gleam.mjs +5 -0
  369. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-js.d.mts +3 -0
  370. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-js.mjs +14 -0
  371. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-ts.d.mts +3 -0
  372. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glimmer-ts.mjs +14 -0
  373. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glsl.d.mts +3 -0
  374. package/node_modules/shiki/node_modules/@shikijs/langs/dist/glsl.mjs +8 -0
  375. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gn.d.mts +3 -0
  376. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gn.mjs +5 -0
  377. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gnuplot.d.mts +3 -0
  378. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gnuplot.mjs +5 -0
  379. package/node_modules/shiki/node_modules/@shikijs/langs/dist/go.d.mts +3 -0
  380. package/node_modules/shiki/node_modules/@shikijs/langs/dist/go.mjs +5 -0
  381. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gql.d.mts +3 -0
  382. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gql.mjs +2 -0
  383. package/node_modules/shiki/node_modules/@shikijs/langs/dist/graphql.d.mts +3 -0
  384. package/node_modules/shiki/node_modules/@shikijs/langs/dist/graphql.mjs +14 -0
  385. package/node_modules/shiki/node_modules/@shikijs/langs/dist/groovy.d.mts +3 -0
  386. package/node_modules/shiki/node_modules/@shikijs/langs/dist/groovy.mjs +5 -0
  387. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gts.d.mts +3 -0
  388. package/node_modules/shiki/node_modules/@shikijs/langs/dist/gts.mjs +2 -0
  389. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hack.d.mts +3 -0
  390. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hack.mjs +10 -0
  391. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haml.d.mts +3 -0
  392. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haml.mjs +10 -0
  393. package/node_modules/shiki/node_modules/@shikijs/langs/dist/handlebars.d.mts +3 -0
  394. package/node_modules/shiki/node_modules/@shikijs/langs/dist/handlebars.mjs +14 -0
  395. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haskell.d.mts +3 -0
  396. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haskell.mjs +5 -0
  397. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haxe.d.mts +3 -0
  398. package/node_modules/shiki/node_modules/@shikijs/langs/dist/haxe.mjs +5 -0
  399. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hbs.d.mts +3 -0
  400. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hbs.mjs +2 -0
  401. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hcl.d.mts +3 -0
  402. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hcl.mjs +5 -0
  403. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hjson.d.mts +3 -0
  404. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hjson.mjs +5 -0
  405. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hlsl.d.mts +3 -0
  406. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hlsl.mjs +5 -0
  407. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hs.d.mts +3 -0
  408. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hs.mjs +2 -0
  409. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html-derivative.d.mts +3 -0
  410. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html-derivative.mjs +8 -0
  411. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html.d.mts +3 -0
  412. package/node_modules/shiki/node_modules/@shikijs/langs/dist/html.mjs +10 -0
  413. package/node_modules/shiki/node_modules/@shikijs/langs/dist/http.d.mts +3 -0
  414. package/node_modules/shiki/node_modules/@shikijs/langs/dist/http.mjs +14 -0
  415. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hurl.d.mts +3 -0
  416. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hurl.mjs +12 -0
  417. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hxml.d.mts +3 -0
  418. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hxml.mjs +8 -0
  419. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hy.d.mts +3 -0
  420. package/node_modules/shiki/node_modules/@shikijs/langs/dist/hy.mjs +5 -0
  421. package/node_modules/shiki/node_modules/@shikijs/langs/dist/imba.d.mts +3 -0
  422. package/node_modules/shiki/node_modules/@shikijs/langs/dist/imba.mjs +5 -0
  423. package/node_modules/shiki/node_modules/@shikijs/langs/dist/index.d.mts +3 -0
  424. package/node_modules/shiki/node_modules/@shikijs/langs/dist/index.mjs +353 -0
  425. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ini.d.mts +3 -0
  426. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ini.mjs +5 -0
  427. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jade.d.mts +3 -0
  428. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jade.mjs +2 -0
  429. package/node_modules/shiki/node_modules/@shikijs/langs/dist/java.d.mts +3 -0
  430. package/node_modules/shiki/node_modules/@shikijs/langs/dist/java.mjs +5 -0
  431. package/node_modules/shiki/node_modules/@shikijs/langs/dist/javascript.d.mts +3 -0
  432. package/node_modules/shiki/node_modules/@shikijs/langs/dist/javascript.mjs +5 -0
  433. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja-html.d.mts +3 -0
  434. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja-html.mjs +8 -0
  435. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja.d.mts +3 -0
  436. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jinja.mjs +8 -0
  437. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jison.d.mts +3 -0
  438. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jison.mjs +8 -0
  439. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jl.d.mts +3 -0
  440. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jl.mjs +2 -0
  441. package/node_modules/shiki/node_modules/@shikijs/langs/dist/js.d.mts +3 -0
  442. package/node_modules/shiki/node_modules/@shikijs/langs/dist/js.mjs +2 -0
  443. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json.d.mts +3 -0
  444. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json.mjs +5 -0
  445. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json5.d.mts +3 -0
  446. package/node_modules/shiki/node_modules/@shikijs/langs/dist/json5.mjs +5 -0
  447. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonc.d.mts +3 -0
  448. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonc.mjs +5 -0
  449. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonl.d.mts +3 -0
  450. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonl.mjs +5 -0
  451. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonnet.d.mts +3 -0
  452. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsonnet.mjs +5 -0
  453. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jssm.d.mts +3 -0
  454. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jssm.mjs +5 -0
  455. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsx.d.mts +3 -0
  456. package/node_modules/shiki/node_modules/@shikijs/langs/dist/jsx.mjs +5 -0
  457. package/node_modules/shiki/node_modules/@shikijs/langs/dist/julia.d.mts +3 -0
  458. package/node_modules/shiki/node_modules/@shikijs/langs/dist/julia.mjs +16 -0
  459. package/node_modules/shiki/node_modules/@shikijs/langs/dist/just.d.mts +3 -0
  460. package/node_modules/shiki/node_modules/@shikijs/langs/dist/just.mjs +18 -0
  461. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kdl.d.mts +3 -0
  462. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kdl.mjs +5 -0
  463. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kotlin.d.mts +3 -0
  464. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kotlin.mjs +5 -0
  465. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kql.d.mts +3 -0
  466. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kql.mjs +2 -0
  467. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kt.d.mts +3 -0
  468. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kt.mjs +2 -0
  469. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kts.d.mts +3 -0
  470. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kts.mjs +2 -0
  471. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kusto.d.mts +3 -0
  472. package/node_modules/shiki/node_modules/@shikijs/langs/dist/kusto.mjs +5 -0
  473. package/node_modules/shiki/node_modules/@shikijs/langs/dist/latex.d.mts +3 -0
  474. package/node_modules/shiki/node_modules/@shikijs/langs/dist/latex.mjs +8 -0
  475. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean.d.mts +3 -0
  476. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean.mjs +5 -0
  477. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean4.d.mts +3 -0
  478. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lean4.mjs +2 -0
  479. package/node_modules/shiki/node_modules/@shikijs/langs/dist/less.d.mts +3 -0
  480. package/node_modules/shiki/node_modules/@shikijs/langs/dist/less.mjs +5 -0
  481. package/node_modules/shiki/node_modules/@shikijs/langs/dist/liquid.d.mts +3 -0
  482. package/node_modules/shiki/node_modules/@shikijs/langs/dist/liquid.mjs +14 -0
  483. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lisp.d.mts +3 -0
  484. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lisp.mjs +2 -0
  485. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lit.d.mts +3 -0
  486. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lit.mjs +2 -0
  487. package/node_modules/shiki/node_modules/@shikijs/langs/dist/llvm.d.mts +3 -0
  488. package/node_modules/shiki/node_modules/@shikijs/langs/dist/llvm.mjs +5 -0
  489. package/node_modules/shiki/node_modules/@shikijs/langs/dist/log.d.mts +3 -0
  490. package/node_modules/shiki/node_modules/@shikijs/langs/dist/log.mjs +5 -0
  491. package/node_modules/shiki/node_modules/@shikijs/langs/dist/logo.d.mts +3 -0
  492. package/node_modules/shiki/node_modules/@shikijs/langs/dist/logo.mjs +5 -0
  493. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lua.d.mts +3 -0
  494. package/node_modules/shiki/node_modules/@shikijs/langs/dist/lua.mjs +8 -0
  495. package/node_modules/shiki/node_modules/@shikijs/langs/dist/luau.d.mts +3 -0
  496. package/node_modules/shiki/node_modules/@shikijs/langs/dist/luau.mjs +5 -0
  497. package/node_modules/shiki/node_modules/@shikijs/langs/dist/make.d.mts +3 -0
  498. package/node_modules/shiki/node_modules/@shikijs/langs/dist/make.mjs +5 -0
  499. package/node_modules/shiki/node_modules/@shikijs/langs/dist/makefile.d.mts +3 -0
  500. package/node_modules/shiki/node_modules/@shikijs/langs/dist/makefile.mjs +2 -0
  501. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-nix.d.mts +3 -0
  502. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-nix.mjs +5 -0
  503. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-vue.d.mts +3 -0
  504. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown-vue.mjs +5 -0
  505. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown.d.mts +3 -0
  506. package/node_modules/shiki/node_modules/@shikijs/langs/dist/markdown.mjs +5 -0
  507. package/node_modules/shiki/node_modules/@shikijs/langs/dist/marko.d.mts +3 -0
  508. package/node_modules/shiki/node_modules/@shikijs/langs/dist/marko.mjs +14 -0
  509. package/node_modules/shiki/node_modules/@shikijs/langs/dist/matlab.d.mts +3 -0
  510. package/node_modules/shiki/node_modules/@shikijs/langs/dist/matlab.mjs +5 -0
  511. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbt.d.mts +3 -0
  512. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbt.mjs +2 -0
  513. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbti.d.mts +3 -0
  514. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mbti.mjs +2 -0
  515. package/node_modules/shiki/node_modules/@shikijs/langs/dist/md.d.mts +3 -0
  516. package/node_modules/shiki/node_modules/@shikijs/langs/dist/md.mjs +2 -0
  517. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdc.d.mts +3 -0
  518. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdc.mjs +12 -0
  519. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdx.d.mts +3 -0
  520. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mdx.mjs +5 -0
  521. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mediawiki.d.mts +3 -0
  522. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mediawiki.mjs +2 -0
  523. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mermaid.d.mts +3 -0
  524. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mermaid.mjs +5 -0
  525. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mips.d.mts +3 -0
  526. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mips.mjs +2 -0
  527. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mipsasm.d.mts +3 -0
  528. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mipsasm.mjs +5 -0
  529. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mjs.d.mts +3 -0
  530. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mjs.mjs +2 -0
  531. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mmd.d.mts +3 -0
  532. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mmd.mjs +2 -0
  533. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mojo.d.mts +3 -0
  534. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mojo.mjs +5 -0
  535. package/node_modules/shiki/node_modules/@shikijs/langs/dist/moonbit.d.mts +3 -0
  536. package/node_modules/shiki/node_modules/@shikijs/langs/dist/moonbit.mjs +5 -0
  537. package/node_modules/shiki/node_modules/@shikijs/langs/dist/move.d.mts +3 -0
  538. package/node_modules/shiki/node_modules/@shikijs/langs/dist/move.mjs +5 -0
  539. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mts.d.mts +3 -0
  540. package/node_modules/shiki/node_modules/@shikijs/langs/dist/mts.mjs +2 -0
  541. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nar.d.mts +3 -0
  542. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nar.mjs +2 -0
  543. package/node_modules/shiki/node_modules/@shikijs/langs/dist/narrat.d.mts +3 -0
  544. package/node_modules/shiki/node_modules/@shikijs/langs/dist/narrat.mjs +5 -0
  545. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow-groovy.d.mts +3 -0
  546. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow-groovy.mjs +5 -0
  547. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow.d.mts +3 -0
  548. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nextflow.mjs +8 -0
  549. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nf.d.mts +3 -0
  550. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nf.mjs +2 -0
  551. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nginx.d.mts +3 -0
  552. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nginx.mjs +8 -0
  553. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nim.d.mts +3 -0
  554. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nim.mjs +20 -0
  555. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nix.d.mts +3 -0
  556. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nix.mjs +8 -0
  557. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nu.d.mts +3 -0
  558. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nu.mjs +2 -0
  559. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nushell.d.mts +3 -0
  560. package/node_modules/shiki/node_modules/@shikijs/langs/dist/nushell.mjs +5 -0
  561. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objc.d.mts +3 -0
  562. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objc.mjs +2 -0
  563. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-c.d.mts +3 -0
  564. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-c.mjs +5 -0
  565. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-cpp.d.mts +3 -0
  566. package/node_modules/shiki/node_modules/@shikijs/langs/dist/objective-cpp.mjs +5 -0
  567. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ocaml.d.mts +3 -0
  568. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ocaml.mjs +5 -0
  569. package/node_modules/shiki/node_modules/@shikijs/langs/dist/odin.d.mts +3 -0
  570. package/node_modules/shiki/node_modules/@shikijs/langs/dist/odin.mjs +5 -0
  571. package/node_modules/shiki/node_modules/@shikijs/langs/dist/openscad.d.mts +3 -0
  572. package/node_modules/shiki/node_modules/@shikijs/langs/dist/openscad.mjs +5 -0
  573. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pascal.d.mts +3 -0
  574. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pascal.mjs +5 -0
  575. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl.d.mts +3 -0
  576. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl.mjs +16 -0
  577. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl6.d.mts +3 -0
  578. package/node_modules/shiki/node_modules/@shikijs/langs/dist/perl6.mjs +2 -0
  579. package/node_modules/shiki/node_modules/@shikijs/langs/dist/php.d.mts +3 -0
  580. package/node_modules/shiki/node_modules/@shikijs/langs/dist/php.mjs +18 -0
  581. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pkl.d.mts +3 -0
  582. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pkl.mjs +5 -0
  583. package/node_modules/shiki/node_modules/@shikijs/langs/dist/plsql.d.mts +3 -0
  584. package/node_modules/shiki/node_modules/@shikijs/langs/dist/plsql.mjs +5 -0
  585. package/node_modules/shiki/node_modules/@shikijs/langs/dist/po.d.mts +3 -0
  586. package/node_modules/shiki/node_modules/@shikijs/langs/dist/po.mjs +5 -0
  587. package/node_modules/shiki/node_modules/@shikijs/langs/dist/polar.d.mts +3 -0
  588. package/node_modules/shiki/node_modules/@shikijs/langs/dist/polar.mjs +5 -0
  589. package/node_modules/shiki/node_modules/@shikijs/langs/dist/postcss.d.mts +3 -0
  590. package/node_modules/shiki/node_modules/@shikijs/langs/dist/postcss.mjs +5 -0
  591. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pot.d.mts +3 -0
  592. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pot.mjs +2 -0
  593. package/node_modules/shiki/node_modules/@shikijs/langs/dist/potx.d.mts +3 -0
  594. package/node_modules/shiki/node_modules/@shikijs/langs/dist/potx.mjs +2 -0
  595. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powerquery.d.mts +3 -0
  596. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powerquery.mjs +5 -0
  597. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powershell.d.mts +3 -0
  598. package/node_modules/shiki/node_modules/@shikijs/langs/dist/powershell.mjs +5 -0
  599. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prisma.d.mts +3 -0
  600. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prisma.mjs +5 -0
  601. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prolog.d.mts +3 -0
  602. package/node_modules/shiki/node_modules/@shikijs/langs/dist/prolog.mjs +5 -0
  603. package/node_modules/shiki/node_modules/@shikijs/langs/dist/properties.d.mts +3 -0
  604. package/node_modules/shiki/node_modules/@shikijs/langs/dist/properties.mjs +2 -0
  605. package/node_modules/shiki/node_modules/@shikijs/langs/dist/proto.d.mts +3 -0
  606. package/node_modules/shiki/node_modules/@shikijs/langs/dist/proto.mjs +5 -0
  607. package/node_modules/shiki/node_modules/@shikijs/langs/dist/protobuf.d.mts +3 -0
  608. package/node_modules/shiki/node_modules/@shikijs/langs/dist/protobuf.mjs +2 -0
  609. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps.d.mts +3 -0
  610. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps.mjs +2 -0
  611. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps1.d.mts +3 -0
  612. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ps1.mjs +2 -0
  613. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pug.d.mts +3 -0
  614. package/node_modules/shiki/node_modules/@shikijs/langs/dist/pug.mjs +12 -0
  615. package/node_modules/shiki/node_modules/@shikijs/langs/dist/puppet.d.mts +3 -0
  616. package/node_modules/shiki/node_modules/@shikijs/langs/dist/puppet.mjs +5 -0
  617. package/node_modules/shiki/node_modules/@shikijs/langs/dist/purescript.d.mts +3 -0
  618. package/node_modules/shiki/node_modules/@shikijs/langs/dist/purescript.mjs +5 -0
  619. package/node_modules/shiki/node_modules/@shikijs/langs/dist/py.d.mts +3 -0
  620. package/node_modules/shiki/node_modules/@shikijs/langs/dist/py.mjs +2 -0
  621. package/node_modules/shiki/node_modules/@shikijs/langs/dist/python.d.mts +3 -0
  622. package/node_modules/shiki/node_modules/@shikijs/langs/dist/python.mjs +5 -0
  623. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ql.d.mts +3 -0
  624. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ql.mjs +2 -0
  625. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qml.d.mts +3 -0
  626. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qml.mjs +8 -0
  627. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qmldir.d.mts +3 -0
  628. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qmldir.mjs +5 -0
  629. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qss.d.mts +3 -0
  630. package/node_modules/shiki/node_modules/@shikijs/langs/dist/qss.mjs +5 -0
  631. package/node_modules/shiki/node_modules/@shikijs/langs/dist/r.d.mts +3 -0
  632. package/node_modules/shiki/node_modules/@shikijs/langs/dist/r.mjs +5 -0
  633. package/node_modules/shiki/node_modules/@shikijs/langs/dist/racket.d.mts +3 -0
  634. package/node_modules/shiki/node_modules/@shikijs/langs/dist/racket.mjs +5 -0
  635. package/node_modules/shiki/node_modules/@shikijs/langs/dist/raku.d.mts +3 -0
  636. package/node_modules/shiki/node_modules/@shikijs/langs/dist/raku.mjs +5 -0
  637. package/node_modules/shiki/node_modules/@shikijs/langs/dist/razor.d.mts +3 -0
  638. package/node_modules/shiki/node_modules/@shikijs/langs/dist/razor.mjs +10 -0
  639. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rb.d.mts +3 -0
  640. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rb.mjs +2 -0
  641. package/node_modules/shiki/node_modules/@shikijs/langs/dist/reg.d.mts +3 -0
  642. package/node_modules/shiki/node_modules/@shikijs/langs/dist/reg.mjs +5 -0
  643. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regex.d.mts +3 -0
  644. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regex.mjs +2 -0
  645. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regexp.d.mts +3 -0
  646. package/node_modules/shiki/node_modules/@shikijs/langs/dist/regexp.mjs +5 -0
  647. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rel.d.mts +3 -0
  648. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rel.mjs +5 -0
  649. package/node_modules/shiki/node_modules/@shikijs/langs/dist/riscv.d.mts +3 -0
  650. package/node_modules/shiki/node_modules/@shikijs/langs/dist/riscv.mjs +5 -0
  651. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ron.d.mts +3 -0
  652. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ron.mjs +5 -0
  653. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rosmsg.d.mts +3 -0
  654. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rosmsg.mjs +5 -0
  655. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rs.d.mts +3 -0
  656. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rs.mjs +2 -0
  657. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rst.d.mts +3 -0
  658. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rst.mjs +22 -0
  659. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ruby.d.mts +3 -0
  660. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ruby.mjs +30 -0
  661. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rust.d.mts +3 -0
  662. package/node_modules/shiki/node_modules/@shikijs/langs/dist/rust.mjs +5 -0
  663. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sas.d.mts +3 -0
  664. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sas.mjs +8 -0
  665. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sass.d.mts +3 -0
  666. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sass.mjs +5 -0
  667. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scad.d.mts +3 -0
  668. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scad.mjs +2 -0
  669. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scala.d.mts +3 -0
  670. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scala.mjs +5 -0
  671. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scheme.d.mts +3 -0
  672. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scheme.mjs +5 -0
  673. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scss.d.mts +3 -0
  674. package/node_modules/shiki/node_modules/@shikijs/langs/dist/scss.mjs +8 -0
  675. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sdbl.d.mts +3 -0
  676. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sdbl.mjs +5 -0
  677. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sh.d.mts +3 -0
  678. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sh.mjs +2 -0
  679. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shader.d.mts +3 -0
  680. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shader.mjs +2 -0
  681. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shaderlab.d.mts +3 -0
  682. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shaderlab.mjs +8 -0
  683. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shell.d.mts +3 -0
  684. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shell.mjs +2 -0
  685. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellscript.d.mts +3 -0
  686. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellscript.mjs +5 -0
  687. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellsession.d.mts +3 -0
  688. package/node_modules/shiki/node_modules/@shikijs/langs/dist/shellsession.mjs +8 -0
  689. package/node_modules/shiki/node_modules/@shikijs/langs/dist/smalltalk.d.mts +3 -0
  690. package/node_modules/shiki/node_modules/@shikijs/langs/dist/smalltalk.mjs +5 -0
  691. package/node_modules/shiki/node_modules/@shikijs/langs/dist/solidity.d.mts +3 -0
  692. package/node_modules/shiki/node_modules/@shikijs/langs/dist/solidity.mjs +5 -0
  693. package/node_modules/shiki/node_modules/@shikijs/langs/dist/soy.d.mts +3 -0
  694. package/node_modules/shiki/node_modules/@shikijs/langs/dist/soy.mjs +8 -0
  695. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sparql.d.mts +3 -0
  696. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sparql.mjs +8 -0
  697. package/node_modules/shiki/node_modules/@shikijs/langs/dist/spl.d.mts +3 -0
  698. package/node_modules/shiki/node_modules/@shikijs/langs/dist/spl.mjs +2 -0
  699. package/node_modules/shiki/node_modules/@shikijs/langs/dist/splunk.d.mts +3 -0
  700. package/node_modules/shiki/node_modules/@shikijs/langs/dist/splunk.mjs +5 -0
  701. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sql.d.mts +3 -0
  702. package/node_modules/shiki/node_modules/@shikijs/langs/dist/sql.mjs +5 -0
  703. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ssh-config.d.mts +3 -0
  704. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ssh-config.mjs +5 -0
  705. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stata.d.mts +3 -0
  706. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stata.mjs +8 -0
  707. package/node_modules/shiki/node_modules/@shikijs/langs/dist/styl.d.mts +3 -0
  708. package/node_modules/shiki/node_modules/@shikijs/langs/dist/styl.mjs +2 -0
  709. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stylus.d.mts +3 -0
  710. package/node_modules/shiki/node_modules/@shikijs/langs/dist/stylus.mjs +5 -0
  711. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surql.d.mts +3 -0
  712. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surql.mjs +2 -0
  713. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surrealql.d.mts +3 -0
  714. package/node_modules/shiki/node_modules/@shikijs/langs/dist/surrealql.mjs +8 -0
  715. package/node_modules/shiki/node_modules/@shikijs/langs/dist/svelte.d.mts +3 -0
  716. package/node_modules/shiki/node_modules/@shikijs/langs/dist/svelte.mjs +14 -0
  717. package/node_modules/shiki/node_modules/@shikijs/langs/dist/swift.d.mts +3 -0
  718. package/node_modules/shiki/node_modules/@shikijs/langs/dist/swift.mjs +5 -0
  719. package/node_modules/shiki/node_modules/@shikijs/langs/dist/system-verilog.d.mts +3 -0
  720. package/node_modules/shiki/node_modules/@shikijs/langs/dist/system-verilog.mjs +5 -0
  721. package/node_modules/shiki/node_modules/@shikijs/langs/dist/systemd.d.mts +3 -0
  722. package/node_modules/shiki/node_modules/@shikijs/langs/dist/systemd.mjs +5 -0
  723. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talon.d.mts +3 -0
  724. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talon.mjs +2 -0
  725. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talonscript.d.mts +3 -0
  726. package/node_modules/shiki/node_modules/@shikijs/langs/dist/talonscript.mjs +5 -0
  727. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tasl.d.mts +3 -0
  728. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tasl.mjs +5 -0
  729. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tcl.d.mts +3 -0
  730. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tcl.mjs +5 -0
  731. package/node_modules/shiki/node_modules/@shikijs/langs/dist/templ.d.mts +3 -0
  732. package/node_modules/shiki/node_modules/@shikijs/langs/dist/templ.mjs +12 -0
  733. package/node_modules/shiki/node_modules/@shikijs/langs/dist/terraform.d.mts +3 -0
  734. package/node_modules/shiki/node_modules/@shikijs/langs/dist/terraform.mjs +5 -0
  735. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tex.d.mts +3 -0
  736. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tex.mjs +8 -0
  737. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tf.d.mts +3 -0
  738. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tf.mjs +2 -0
  739. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tfvars.d.mts +3 -0
  740. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tfvars.mjs +2 -0
  741. package/node_modules/shiki/node_modules/@shikijs/langs/dist/toml.d.mts +3 -0
  742. package/node_modules/shiki/node_modules/@shikijs/langs/dist/toml.mjs +5 -0
  743. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tres.d.mts +3 -0
  744. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tres.mjs +2 -0
  745. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts-tags.d.mts +3 -0
  746. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts-tags.mjs +18 -0
  747. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts.d.mts +3 -0
  748. package/node_modules/shiki/node_modules/@shikijs/langs/dist/ts.mjs +2 -0
  749. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tscn.d.mts +3 -0
  750. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tscn.mjs +2 -0
  751. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsp.d.mts +3 -0
  752. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsp.mjs +2 -0
  753. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsv.d.mts +3 -0
  754. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsv.mjs +5 -0
  755. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsx.d.mts +3 -0
  756. package/node_modules/shiki/node_modules/@shikijs/langs/dist/tsx.mjs +5 -0
  757. package/node_modules/shiki/node_modules/@shikijs/langs/dist/turtle.d.mts +3 -0
  758. package/node_modules/shiki/node_modules/@shikijs/langs/dist/turtle.mjs +5 -0
  759. package/node_modules/shiki/node_modules/@shikijs/langs/dist/twig.d.mts +3 -0
  760. package/node_modules/shiki/node_modules/@shikijs/langs/dist/twig.mjs +18 -0
  761. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typ.d.mts +3 -0
  762. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typ.mjs +2 -0
  763. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typescript.d.mts +3 -0
  764. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typescript.mjs +5 -0
  765. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typespec.d.mts +3 -0
  766. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typespec.mjs +5 -0
  767. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typst.d.mts +3 -0
  768. package/node_modules/shiki/node_modules/@shikijs/langs/dist/typst.mjs +5 -0
  769. package/node_modules/shiki/node_modules/@shikijs/langs/dist/v.d.mts +3 -0
  770. package/node_modules/shiki/node_modules/@shikijs/langs/dist/v.mjs +5 -0
  771. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vala.d.mts +3 -0
  772. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vala.mjs +5 -0
  773. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vb.d.mts +3 -0
  774. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vb.mjs +5 -0
  775. package/node_modules/shiki/node_modules/@shikijs/langs/dist/verilog.d.mts +3 -0
  776. package/node_modules/shiki/node_modules/@shikijs/langs/dist/verilog.mjs +5 -0
  777. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vhdl.d.mts +3 -0
  778. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vhdl.mjs +5 -0
  779. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vim.d.mts +3 -0
  780. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vim.mjs +2 -0
  781. package/node_modules/shiki/node_modules/@shikijs/langs/dist/viml.d.mts +3 -0
  782. package/node_modules/shiki/node_modules/@shikijs/langs/dist/viml.mjs +5 -0
  783. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vimscript.d.mts +3 -0
  784. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vimscript.mjs +2 -0
  785. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-directives.d.mts +3 -0
  786. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-directives.mjs +5 -0
  787. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-html.d.mts +3 -0
  788. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-html.mjs +8 -0
  789. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-interpolations.d.mts +3 -0
  790. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-interpolations.mjs +5 -0
  791. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-sfc-style-variable-injection.d.mts +3 -0
  792. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-sfc-style-variable-injection.mjs +8 -0
  793. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-vine.d.mts +3 -0
  794. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue-vine.mjs +18 -0
  795. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue.d.mts +3 -0
  796. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vue.mjs +26 -0
  797. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vy.d.mts +3 -0
  798. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vy.mjs +2 -0
  799. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vyper.d.mts +3 -0
  800. package/node_modules/shiki/node_modules/@shikijs/langs/dist/vyper.mjs +5 -0
  801. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wasm.d.mts +3 -0
  802. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wasm.mjs +5 -0
  803. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wenyan.d.mts +3 -0
  804. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wenyan.mjs +5 -0
  805. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wgsl.d.mts +3 -0
  806. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wgsl.mjs +5 -0
  807. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wiki.d.mts +3 -0
  808. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wiki.mjs +2 -0
  809. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wikitext.d.mts +3 -0
  810. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wikitext.mjs +5 -0
  811. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wit.d.mts +3 -0
  812. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wit.mjs +5 -0
  813. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wl.d.mts +3 -0
  814. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wl.mjs +2 -0
  815. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wolfram.d.mts +3 -0
  816. package/node_modules/shiki/node_modules/@shikijs/langs/dist/wolfram.mjs +5 -0
  817. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xml.d.mts +3 -0
  818. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xml.mjs +8 -0
  819. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xsl.d.mts +3 -0
  820. package/node_modules/shiki/node_modules/@shikijs/langs/dist/xsl.mjs +8 -0
  821. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yaml.d.mts +3 -0
  822. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yaml.mjs +5 -0
  823. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yml.d.mts +3 -0
  824. package/node_modules/shiki/node_modules/@shikijs/langs/dist/yml.mjs +2 -0
  825. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zenscript.d.mts +3 -0
  826. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zenscript.mjs +5 -0
  827. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zig.d.mts +3 -0
  828. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zig.mjs +5 -0
  829. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zsh.d.mts +3 -0
  830. package/node_modules/shiki/node_modules/@shikijs/langs/dist/zsh.mjs +2 -0
  831. package/node_modules/shiki/node_modules/@shikijs/langs/package.json +384 -0
  832. package/node_modules/shiki/node_modules/@shikijs/types/LICENSE +22 -0
  833. package/node_modules/shiki/node_modules/@shikijs/types/README.md +7 -0
  834. package/node_modules/shiki/node_modules/@shikijs/types/dist/index.d.mts +885 -0
  835. package/node_modules/shiki/node_modules/@shikijs/types/dist/index.mjs +8 -0
  836. package/node_modules/shiki/node_modules/@shikijs/types/package.json +36 -0
  837. package/npm-shrinkwrap.json +90 -14
  838. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"iterateOverDiff.js","names":["state: IterationState","unifiedLineIndex","splitLineIndex","deletionLineIndex","additionLineIndex","deletionLineNumber","additionLineNumber","counts","prefixCounts: HunkPrefixCounts[]","ranges: EqualLineIterationRange[]","start","end","iterationRanges: EqualLineIterationRange[]","merged: EqualLineIterationRange[]","deletionLine: DiffLineMetadata | undefined","additionLine: DiffLineMetadata | undefined"],"sources":["../../src/utils/iterateOverDiff.ts"],"sourcesContent":["import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n ChangeContent,\n FileDiffMetadata,\n Hunk,\n HunkExpansionRegion,\n} from '../types';\n\nexport interface DiffLineMetadata {\n unifiedLineIndex: number;\n splitLineIndex: number;\n lineIndex: number;\n lineNumber: number;\n noEOFCR: boolean;\n}\n\nexport interface DiffLineCallbackBase {\n hunkIndex: number;\n hunk: Hunk | undefined; // undefined for trailing expansion region\n collapsedBefore: number; // > 0 means separator before this line, value = hidden lines\n collapsedAfter: number; // > 0 only on final line if trailing collapsed content\n}\n\ninterface DiffLineCallbackContextChange extends DiffLineCallbackBase {\n type: 'change' | 'context' | 'context-expanded';\n deletionLine: DiffLineMetadata;\n additionLine: DiffLineMetadata;\n}\n\ninterface DiffLineCallbackChangeDeletion extends DiffLineCallbackBase {\n type: 'change';\n deletionLine: DiffLineMetadata;\n additionLine?: undefined;\n}\n\ninterface DiffLineCallbackChangeAddition extends DiffLineCallbackBase {\n type: 'change';\n deletionLine?: undefined;\n additionLine: DiffLineMetadata;\n}\n\nexport type DiffLineCallbackProps =\n | DiffLineCallbackContextChange\n | DiffLineCallbackChangeDeletion\n | DiffLineCallbackChangeAddition;\n\ntype DiffStyle = 'unified' | 'split' | 'both';\n\ntype EqualLineIterationRange = [startIndex: number, endIndex: number];\n\ntype ChangeContentSide = 'deletions' | 'additions';\n\ninterface IterationState {\n finalHunk: Hunk | undefined;\n isWindowedHighlight: boolean;\n viewportStart: number;\n viewportEnd: number;\n splitCount: number;\n unifiedCount: number;\n shouldBreak(): boolean;\n shouldSkip(unifiedHeight: number, splitHeight: number): boolean;\n incrementCounts(unifiedValue: number, splitValue: number): void;\n isInWindow(unifiedHeight: number, splitHeight: number): boolean;\n isInUnifiedWindow(height: number): boolean;\n isInSplitWindow(height: number): boolean;\n emit(props: DiffLineCallbackProps, silent?: boolean): boolean;\n}\n\ninterface IterationStartState {\n hunkIndex: number;\n splitCount: number;\n unifiedCount: number;\n}\n\ninterface HunkPrefixCounts {\n splitCount: number;\n unifiedCount: number;\n}\n\ninterface IterationStartStateProps extends Omit<\n IterateOverDiffProps,\n 'callback' | 'totalLines'\n> {\n startingLine: number;\n collapsedContextThreshold: number;\n}\n\ninterface HunkPrefixCountsProps extends Pick<\n IterationStartStateProps,\n 'diff' | 'expandedHunks' | 'collapsedContextThreshold'\n> {}\n\nexport type DiffLineCallback = (props: DiffLineCallbackProps) => boolean | void;\n\nexport interface IterateOverDiffProps {\n diff: FileDiffMetadata;\n diffStyle: DiffStyle;\n startingLine?: number;\n totalLines?: number;\n expandedHunks?: Map<number, HunkExpansionRegion> | true;\n collapsedContextThreshold?: number;\n callback: DiffLineCallback;\n}\n\nexport function iterateOverDiff({\n diff,\n diffStyle,\n startingLine = 0,\n totalLines = Infinity,\n expandedHunks,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n callback,\n}: IterateOverDiffProps): void {\n const iterationStart = getIterationStartState({\n diff,\n diffStyle,\n startingLine,\n expandedHunks,\n collapsedContextThreshold,\n });\n const state: IterationState = {\n finalHunk: diff.hunks.at(-1),\n viewportStart: startingLine,\n viewportEnd: startingLine + totalLines,\n isWindowedHighlight: startingLine > 0 || totalLines < Infinity,\n splitCount: iterationStart.splitCount,\n unifiedCount: iterationStart.unifiedCount,\n shouldBreak() {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const breakUnified = state.unifiedCount >= startingLine + totalLines;\n const breakSplit = state.splitCount >= startingLine + totalLines;\n\n if (diffStyle === 'unified') {\n return breakUnified;\n } else if (diffStyle === 'split') {\n return breakSplit;\n } else {\n return breakUnified && breakSplit;\n }\n },\n shouldSkip(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const skipUnified = state.unifiedCount + unifiedHeight < startingLine;\n const skipSplit = state.splitCount + splitHeight < startingLine;\n\n if (diffStyle === 'unified') {\n return skipUnified;\n } else if (diffStyle === 'split') {\n return skipSplit;\n } else {\n return skipUnified && skipSplit;\n }\n },\n incrementCounts(unifiedValue: number, splitValue: number) {\n if (diffStyle === 'unified' || diffStyle === 'both') {\n state.unifiedCount += unifiedValue;\n }\n if (diffStyle === 'split' || diffStyle === 'both') {\n state.splitCount += splitValue;\n }\n },\n isInWindow(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return true;\n }\n\n const unifiedInWindow = state.isInUnifiedWindow(unifiedHeight);\n const splitInWindow = state.isInSplitWindow(splitHeight);\n\n if (diffStyle === 'unified') {\n return unifiedInWindow;\n } else if (diffStyle === 'split') {\n return splitInWindow;\n } else {\n return unifiedInWindow || splitInWindow;\n }\n },\n isInUnifiedWindow(unifiedHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.unifiedCount >= startingLine - unifiedHeight &&\n state.unifiedCount < startingLine + totalLines)\n );\n },\n isInSplitWindow(splitHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.splitCount >= startingLine - splitHeight &&\n state.splitCount < startingLine + totalLines)\n );\n },\n emit(props: DiffLineCallbackProps, silent = false): boolean {\n if (!silent) {\n if (diffStyle === 'unified') {\n state.incrementCounts(1, 0);\n } else if (diffStyle === 'split') {\n state.incrementCounts(0, 1);\n } else {\n state.incrementCounts(1, 1);\n // FIXME MAYBE\n // state.incrementCounts(\n // state.isInUnifiedWindow(0) ? 1 : 0,\n // state.isInSplitWindow(0) ? 1 : 0\n // );\n }\n }\n return callback(props) ?? false;\n },\n };\n\n hunkIterator: for (\n let hunkIndex = iterationStart.hunkIndex;\n hunkIndex < diff.hunks.length;\n hunkIndex++\n ) {\n const hunk = diff.hunks[hunkIndex];\n if (hunk == null) {\n throw new Error('iterateOverDiff: invalid hunk index');\n }\n if (state.shouldBreak()) {\n break;\n }\n\n const leadingRegion = getExpandedRegion(\n diff.isPartial,\n hunk.collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold\n );\n // We only create a trailing region if it's the last hunk\n const trailingRegion = (() => {\n if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) {\n return undefined;\n }\n const additionRemaining =\n diff.additionLines.length -\n (hunk.additionLineIndex + hunk.additionCount);\n const deletionRemaining =\n diff.deletionLines.length -\n (hunk.deletionLineIndex + hunk.deletionCount);\n\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`\n );\n }\n const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);\n return getExpandedRegion(\n diff.isPartial,\n trailingRangeSize,\n expandedHunks,\n // hunkIndex for trailing region\n diff.hunks.length,\n collapsedContextThreshold\n );\n })();\n const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;\n\n function getTrailingCollapsedAfter(\n unifiedLineIndex: number,\n splitLineIndex: number\n ) {\n if (\n trailingRegion == null ||\n trailingRegion.collapsedLines <= 0 ||\n trailingRegion.fromStart + trailingRegion.fromEnd > 0\n ) {\n return 0;\n }\n if (diffStyle === 'unified') {\n return unifiedLineIndex ===\n hunk.unifiedLineStart + hunk.unifiedLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n return splitLineIndex === hunk.splitLineStart + hunk.splitLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n function getPendingCollapsed() {\n if (leadingRegion.collapsedLines === 0) {\n return 0;\n }\n const value = leadingRegion.collapsedLines;\n leadingRegion.collapsedLines = 0;\n return value;\n }\n\n // Emit for expanded lines\n if (!state.shouldSkip(expandedLineCount, expandedLineCount)) {\n let unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.rangeSize;\n let splitLineIndex = hunk.splitLineStart - leadingRegion.rangeSize;\n\n let deletionLineIndex = hunk.deletionLineIndex - leadingRegion.rangeSize;\n let additionLineIndex = hunk.additionLineIndex - leadingRegion.rangeSize;\n let deletionLineNumber = hunk.deletionStart - leadingRegion.rangeSize;\n let additionLineNumber = hunk.additionStart - leadingRegion.rangeSize;\n\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n leadingRegion.fromStart,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < leadingRegion.fromStart) {\n if (index >= endIndex) {\n state.incrementCounts(\n leadingRegion.fromStart - index,\n leadingRegion.fromStart - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk: hunk,\n collapsedBefore: 0,\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n type: 'context-expanded',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n\n unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.fromEnd;\n splitLineIndex = hunk.splitLineStart - leadingRegion.fromEnd;\n\n deletionLineIndex = hunk.deletionLineIndex - leadingRegion.fromEnd;\n additionLineIndex = hunk.additionLineIndex - leadingRegion.fromEnd;\n deletionLineNumber = hunk.deletionStart - leadingRegion.fromEnd;\n additionLineNumber = hunk.additionStart - leadingRegion.fromEnd;\n const [fromEndStartIndex, fromEndEndIndex] = getEqualLineIterationRange(\n state,\n leadingRegion.fromEnd,\n diffStyle\n );\n if (fromEndStartIndex > 0) {\n state.incrementCounts(fromEndStartIndex, fromEndStartIndex);\n }\n index = fromEndStartIndex;\n\n while (index < leadingRegion.fromEnd) {\n if (index >= fromEndEndIndex) {\n state.incrementCounts(\n leadingRegion.fromEnd - index,\n leadingRegion.fromEnd - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n type: 'context-expanded',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(expandedLineCount, expandedLineCount);\n getPendingCollapsed();\n }\n\n let unifiedLineIndex = hunk.unifiedLineStart;\n let splitLineIndex = hunk.splitLineStart;\n\n let deletionLineIndex = hunk.deletionLineIndex;\n let additionLineIndex = hunk.additionLineIndex;\n let deletionLineNumber = hunk.deletionStart;\n let additionLineNumber = hunk.additionStart;\n const lastContent = hunk.hunkContent.at(-1);\n\n for (const content of hunk.hunkContent) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n\n const isLastContent = content === lastContent;\n\n // Hunk Context Content\n if (content.type === 'context') {\n if (!state.shouldSkip(content.lines, content.lines)) {\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n content.lines,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < content.lines) {\n if (index >= endIndex) {\n state.incrementCounts(\n content.lines - index,\n content.lines - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n const isLastLine = isLastContent && index === content.lines - 1;\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex = splitLineIndex + index;\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n ),\n type: 'context',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: isLastLine && hunk.noEOFCRDeletions,\n unifiedLineIndex: unifiedRowIndex,\n splitLineIndex: splitRowIndex,\n },\n additionLine: {\n unifiedLineIndex: unifiedRowIndex,\n splitLineIndex: splitRowIndex,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: isLastLine && hunk.noEOFCRAdditions,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(content.lines, content.lines);\n getPendingCollapsed();\n }\n unifiedLineIndex += content.lines;\n splitLineIndex += content.lines;\n\n deletionLineIndex += content.lines;\n additionLineIndex += content.lines;\n deletionLineNumber += content.lines;\n additionLineNumber += content.lines;\n }\n // Hunk Change Content\n else {\n const splitCount = Math.max(content.deletions, content.additions);\n const unifiedCount = content.deletions + content.additions;\n const shouldSkipChange = state.shouldSkip(unifiedCount, splitCount);\n if (!shouldSkipChange) {\n const iterationRanges = getChangeIterationRanges(\n state,\n content,\n diffStyle\n );\n\n // No need for any skipping because the render ranges skip for us\n for (const [rangeStart, rangeEnd] of iterationRanges) {\n for (let index = rangeStart; index < rangeEnd; index++) {\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex =\n diffStyle === 'unified'\n ? splitLineIndex +\n (index < content.deletions\n ? index\n : index - content.deletions)\n : splitLineIndex + index;\n const collapsedAfter = getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n );\n if (\n state.emit(\n getChangeLineData({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n }),\n true\n )\n ) {\n break hunkIterator;\n }\n }\n }\n }\n\n getPendingCollapsed();\n state.incrementCounts(unifiedCount, splitCount);\n unifiedLineIndex += unifiedCount;\n splitLineIndex += splitCount;\n deletionLineIndex += content.deletions;\n additionLineIndex += content.additions;\n deletionLineNumber += content.deletions;\n additionLineNumber += content.additions;\n }\n }\n\n if (trailingRegion != null) {\n const { collapsedLines, fromStart, fromEnd } = trailingRegion;\n const len = fromStart + fromEnd;\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n len,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < len) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n if (index >= endIndex) {\n state.incrementCounts(len - index, len - index);\n break;\n }\n if (state.isInWindow(0, 0)) {\n const isLastLine = index === len - 1;\n if (\n state.emit({\n hunkIndex: diff.hunks.length,\n hunk: undefined,\n collapsedBefore: 0,\n collapsedAfter: isLastLine ? collapsedLines : 0,\n type: 'context-expanded',\n // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n }\n }\n}\n\n// Seek the iterator to the hunk that contains `startingLine` without changing\n// the public meaning of `startingLine`: it is a dense rendered-row index, not\n// a raw split/unified line index. We first build prefix counts for each hunk\n// under the current expansion/collapse settings, binary-search those counts to\n// find the first hunk whose rendered rows cross `startingLine`, then seed the\n// running split/unified counters as if every prior hunk had already been\n// walked.\nfunction getIterationStartState({\n diff,\n diffStyle,\n startingLine,\n expandedHunks,\n collapsedContextThreshold,\n}: IterationStartStateProps): IterationStartState {\n if (startingLine <= 0 || diffStyle === 'both') {\n return { hunkIndex: 0, splitCount: 0, unifiedCount: 0 };\n }\n\n const prefixCounts = getHunkPrefixCounts({\n diff,\n expandedHunks,\n collapsedContextThreshold,\n });\n\n let low = 0;\n let high = diff.hunks.length - 1;\n let result = diff.hunks.length;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const counts = prefixCounts[mid + 1];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid hunk prefix index');\n }\n const selectedCount =\n diffStyle === 'unified' ? counts.unifiedCount : counts.splitCount;\n\n if (selectedCount > startingLine) {\n result = mid;\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n if (result >= diff.hunks.length) {\n const counts = prefixCounts[diff.hunks.length];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid terminal hunk prefix index');\n }\n return {\n hunkIndex: diff.hunks.length,\n splitCount: counts.splitCount,\n unifiedCount: counts.unifiedCount,\n };\n }\n\n const counts = prefixCounts[result];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid selected hunk prefix index');\n }\n return {\n hunkIndex: result,\n splitCount: counts.splitCount,\n unifiedCount: counts.unifiedCount,\n };\n}\n\n// Build cumulative rendered-row counts at every hunk boundary for the current\n// expansion state. Entry 0 is always zero rows before the first hunk; entry N\n// is the split/unified row count after hunks [0, N). These counts let\n// getIterationStartState binary-search by dense rendered row without replaying\n// every prior hunk.\nfunction getHunkPrefixCounts({\n diff,\n expandedHunks,\n collapsedContextThreshold,\n}: HunkPrefixCountsProps): HunkPrefixCounts[] {\n let splitCount = 0;\n let unifiedCount = 0;\n const finalHunkIndex = diff.hunks.length - 1;\n const prefixCounts: HunkPrefixCounts[] = [\n {\n splitCount: 0,\n unifiedCount: 0,\n },\n ];\n\n for (let index = 0; index < diff.hunks.length; index++) {\n const hunk = diff.hunks[index];\n if (hunk == null) {\n throw new Error('iterateOverDiff: invalid hunk summary index');\n }\n\n const leadingRegion = getExpandedRegion(\n diff.isPartial,\n hunk.collapsedBefore,\n expandedHunks,\n index,\n collapsedContextThreshold\n );\n const leadingCount = leadingRegion.fromStart + leadingRegion.fromEnd;\n splitCount += leadingCount + hunk.splitLineCount;\n unifiedCount += leadingCount + hunk.unifiedLineCount;\n\n if (index === finalHunkIndex && hasFinalCollapsedHunk(diff)) {\n const trailingRangeSize = getTrailingRangeSize(diff, hunk);\n const trailingRegion = getExpandedRegion(\n diff.isPartial,\n trailingRangeSize,\n expandedHunks,\n diff.hunks.length,\n collapsedContextThreshold\n );\n const trailingCount = trailingRegion.fromStart + trailingRegion.fromEnd;\n splitCount += trailingCount;\n unifiedCount += trailingCount;\n }\n\n prefixCounts.push({ splitCount, unifiedCount });\n }\n\n return prefixCounts;\n}\n\n// Clip a run of unchanged rows to the active rendered window. Equal rows advance\n// split and unified counters together, but `diffStyle: both` needs the union of\n// the split and unified visible ranges because either view can make the row\n// worth emitting.\nfunction getEqualLineIterationRange(\n state: IterationState,\n count: number,\n diffStyle: DiffStyle\n): EqualLineIterationRange {\n if (!state.isWindowedHighlight || count <= 0) {\n return [0, count];\n }\n\n const ranges: EqualLineIterationRange[] = [];\n function pushRange(currentCount: number): void {\n const start = Math.max(0, state.viewportStart - currentCount);\n const end = Math.min(count, state.viewportEnd - currentCount);\n if (end > start) {\n ranges.push([start, end]);\n }\n }\n\n if (diffStyle !== 'split') {\n pushRange(state.unifiedCount);\n }\n if (diffStyle !== 'unified') {\n pushRange(state.splitCount);\n }\n\n if (ranges.length === 0) {\n return [0, 0];\n }\n\n let start = ranges[0][0];\n let end = ranges[0][1];\n for (let index = 1; index < ranges.length; index++) {\n const range = ranges[index];\n start = Math.min(start, range[0]);\n end = Math.max(end, range[1]);\n }\n return [start, end];\n}\n\n// Measure the unchanged tail after the final hunk so it can be collapsed or\n// expanded like leading hunk context. Both sides must have the same remaining\n// length because trailing context represents paired unchanged lines.\nfunction getTrailingRangeSize(diff: FileDiffMetadata, hunk: Hunk): number {\n const additionRemaining =\n diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);\n const deletionRemaining =\n diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);\n\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n}\n\ninterface ExpandedRegionResult {\n fromStart: number;\n fromEnd: number;\n rangeSize: number;\n collapsedLines: number;\n}\n\nfunction getExpandedRegion(\n isPartial: boolean,\n rangeSize: number,\n expandedHunks: Map<number, HunkExpansionRegion> | true | undefined,\n hunkIndex: number,\n collapsedContextThreshold: number\n): ExpandedRegionResult {\n rangeSize = Math.max(rangeSize, 0);\n if (rangeSize === 0 || isPartial) {\n return {\n fromStart: 0,\n fromEnd: 0,\n rangeSize,\n collapsedLines: Math.max(rangeSize, 0),\n };\n }\n if (expandedHunks === true || rangeSize <= collapsedContextThreshold) {\n return {\n fromStart: rangeSize,\n fromEnd: 0,\n rangeSize,\n collapsedLines: 0,\n };\n }\n const region = expandedHunks?.get(hunkIndex);\n const fromStart = Math.min(Math.max(region?.fromStart ?? 0, 0), rangeSize);\n const fromEnd = Math.min(Math.max(region?.fromEnd ?? 0, 0), rangeSize);\n const expandedCount = fromStart + fromEnd;\n const renderAll = expandedCount >= rangeSize;\n return {\n fromStart: renderAll ? rangeSize : fromStart,\n fromEnd: renderAll ? 0 : fromEnd,\n rangeSize,\n collapsedLines: Math.max(rangeSize - expandedCount, 0),\n };\n}\n\nfunction hasFinalCollapsedHunk(diff: FileDiffMetadata): boolean {\n const lastHunk = diff.hunks.at(-1);\n if (\n lastHunk == null ||\n diff.isPartial ||\n diff.additionLines.length === 0 ||\n diff.deletionLines.length === 0\n ) {\n return false;\n }\n return (\n lastHunk.additionLineIndex + lastHunk.additionCount <\n diff.additionLines.length ||\n lastHunk.deletionLineIndex + lastHunk.deletionCount <\n diff.deletionLines.length\n );\n}\n\n// The intention of this function is to grab the appropriate windowed ranges of\n// the change content. If diffStyle is both, we will iterate AS split, however\n// we will encompass all needed lines to allow us to render split or unified\nfunction getChangeIterationRanges(\n state: IterationState,\n content: ChangeContent,\n diffStyle: DiffStyle\n): EqualLineIterationRange[] {\n // If not a window highlight, then we should just render the entire range\n if (!state.isWindowedHighlight) {\n return [\n [\n 0,\n diffStyle === 'unified'\n ? content.deletions + content.additions\n : Math.max(content.deletions, content.additions),\n ],\n ];\n }\n const useUnified = diffStyle !== 'split';\n const useSplit = diffStyle !== 'unified';\n const iterationSpace = diffStyle === 'unified' ? 'unified' : 'split';\n const iterationRanges: EqualLineIterationRange[] = [];\n function getVisibleRange(\n start: number,\n count: number\n ): EqualLineIterationRange | undefined {\n const end = start + count;\n if (end <= state.viewportStart || start >= state.viewportEnd) {\n return undefined;\n }\n const visibleStart = Math.max(0, state.viewportStart - start);\n const visibleEnd = Math.min(count, state.viewportEnd - start);\n return visibleEnd > visibleStart ? [visibleStart, visibleEnd] : undefined;\n }\n function mapRangeToIteration(\n range: EqualLineIterationRange,\n kind: ChangeContentSide\n ): EqualLineIterationRange {\n if (iterationSpace === 'split') {\n // For split iteration, additions/deletions are already in split row space.\n return range;\n }\n return kind === 'additions'\n ? [range[0] + content.deletions, range[1] + content.deletions]\n : range;\n }\n function pushRange(\n range: EqualLineIterationRange | undefined,\n kind: ChangeContentSide\n ) {\n if (range == null) {\n return;\n }\n const [start, end] = mapRangeToIteration(range, kind);\n if (end > start) {\n iterationRanges.push([start, end]);\n }\n }\n\n if (useUnified) {\n pushRange(\n getVisibleRange(state.unifiedCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(\n state.unifiedCount + content.deletions,\n content.additions\n ),\n 'additions'\n );\n }\n\n if (useSplit) {\n pushRange(\n getVisibleRange(state.splitCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(state.splitCount, content.additions),\n 'additions'\n );\n }\n\n if (iterationRanges.length === 0) {\n return iterationRanges;\n }\n\n iterationRanges.sort((a, b) => a[0] - b[0]);\n const merged: EqualLineIterationRange[] = [iterationRanges[0]];\n for (const [start, end] of iterationRanges.slice(1)) {\n const last = merged[merged.length - 1];\n if (start <= last[1]) {\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n\ninterface GetChangeLineDataProps {\n hunkIndex: number;\n hunk: Hunk;\n collapsedBefore: number;\n collapsedAfter: number;\n diffStyle: DiffStyle;\n index: number;\n unifiedLineIndex: number;\n splitLineIndex: number;\n additionLineIndex: number;\n additionLineNumber: number;\n deletionLineNumber: number;\n deletionLineIndex: number;\n content: ChangeContent;\n isLastContent: boolean;\n unifiedCount: number;\n splitCount: number;\n}\n\n// NOTE(amadeus): It's quite tedious to grab the appropriate line info and\n// related props for change content regions, so I made it a specialized\n// function to help make the main hunkIterator easy to reason about\nfunction getChangeLineData({\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n}: GetChangeLineDataProps): DiffLineCallbackProps {\n const unifiedDeletionLineIndex =\n index < content.deletions ? unifiedLineIndex + index : undefined;\n const unifiedAdditionLineIndex =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? unifiedLineIndex + index\n : undefined\n : index < content.additions\n ? unifiedLineIndex + content.deletions + index\n : undefined;\n\n const resolvedSplitLineIndex =\n diffStyle === 'unified'\n ? splitLineIndex +\n (index < content.deletions ? index : index - content.deletions)\n : splitLineIndex + index;\n\n const deletionLineIndexValue =\n index < content.deletions ? deletionLineIndex + index : undefined;\n const deletionLineNumberValue =\n index < content.deletions ? deletionLineNumber + index : undefined;\n const additionLineIndexValue =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? additionLineIndex + (index - content.deletions)\n : undefined\n : index < content.additions\n ? additionLineIndex + index\n : undefined;\n const additionLineNumberValue =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? additionLineNumber + (index - content.deletions)\n : undefined\n : index < content.additions\n ? additionLineNumber + index\n : undefined;\n\n const noEOFCRDeletion =\n diffStyle === 'unified'\n ? isLastContent &&\n index === content.deletions - 1 &&\n hunk.noEOFCRDeletions\n : isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions;\n const noEOFCRAddition =\n diffStyle === 'unified'\n ? isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions\n : isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions;\n\n const deletionLine: DiffLineMetadata | undefined =\n deletionLineIndexValue != null &&\n deletionLineNumberValue != null &&\n unifiedDeletionLineIndex != null\n ? // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n {\n lineNumber: deletionLineNumberValue,\n lineIndex: deletionLineIndexValue,\n noEOFCR: noEOFCRDeletion,\n unifiedLineIndex: unifiedDeletionLineIndex,\n splitLineIndex: resolvedSplitLineIndex,\n }\n : undefined;\n const additionLine: DiffLineMetadata | undefined =\n additionLineIndexValue != null &&\n additionLineNumberValue != null &&\n unifiedAdditionLineIndex != null\n ? // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n {\n unifiedLineIndex: unifiedAdditionLineIndex,\n splitLineIndex: resolvedSplitLineIndex,\n lineIndex: additionLineIndexValue,\n lineNumber: additionLineNumberValue,\n noEOFCR: noEOFCRAddition,\n }\n : undefined;\n\n if (deletionLine == null && additionLine != null) {\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine: undefined,\n additionLine,\n };\n } else if (deletionLine != null && additionLine == null) {\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine,\n additionLine: undefined,\n };\n }\n\n if (deletionLine == null || additionLine == null) {\n throw new Error('iterateOverDiff: missing change line data');\n }\n\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine,\n additionLine,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"iterateOverDiff.js","names":["state: IterationState","unifiedLineIndex","splitLineIndex","deletionLineIndex","additionLineIndex","deletionLineNumber","additionLineNumber","counts","prefixCounts: HunkPrefixCounts[]","ranges: EqualLineIterationRange[]","start","end","iterationRanges: EqualLineIterationRange[]","merged: EqualLineIterationRange[]","deletionLine: DiffLineMetadata | undefined","additionLine: DiffLineMetadata | undefined"],"sources":["../../src/utils/iterateOverDiff.ts"],"sourcesContent":["import { DEFAULT_COLLAPSED_CONTEXT_THRESHOLD } from '../constants';\nimport type {\n ChangeContent,\n FileDiffMetadata,\n Hunk,\n HunkExpansionRegion,\n} from '../types';\nimport { getExpandedRegion } from './virtualDiffLayout';\n\nexport interface DiffLineMetadata {\n unifiedLineIndex: number;\n splitLineIndex: number;\n lineIndex: number;\n lineNumber: number;\n noEOFCR: boolean;\n}\n\nexport interface DiffLineCallbackBase {\n hunkIndex: number;\n hunk: Hunk | undefined; // undefined for trailing expansion region\n collapsedBefore: number; // > 0 means separator before this line, value = hidden lines\n collapsedAfter: number; // > 0 only on final line if trailing collapsed content\n}\n\ninterface DiffLineCallbackContextChange extends DiffLineCallbackBase {\n type: 'change' | 'context' | 'context-expanded';\n deletionLine: DiffLineMetadata;\n additionLine: DiffLineMetadata;\n}\n\ninterface DiffLineCallbackChangeDeletion extends DiffLineCallbackBase {\n type: 'change';\n deletionLine: DiffLineMetadata;\n additionLine?: undefined;\n}\n\ninterface DiffLineCallbackChangeAddition extends DiffLineCallbackBase {\n type: 'change';\n deletionLine?: undefined;\n additionLine: DiffLineMetadata;\n}\n\nexport type DiffLineCallbackProps =\n | DiffLineCallbackContextChange\n | DiffLineCallbackChangeDeletion\n | DiffLineCallbackChangeAddition;\n\ntype DiffStyle = 'unified' | 'split' | 'both';\n\ntype EqualLineIterationRange = [startIndex: number, endIndex: number];\n\ntype ChangeContentSide = 'deletions' | 'additions';\n\ninterface IterationState {\n finalHunk: Hunk | undefined;\n isWindowedHighlight: boolean;\n viewportStart: number;\n viewportEnd: number;\n splitCount: number;\n unifiedCount: number;\n shouldBreak(): boolean;\n shouldSkip(unifiedHeight: number, splitHeight: number): boolean;\n incrementCounts(unifiedValue: number, splitValue: number): void;\n isInWindow(unifiedHeight: number, splitHeight: number): boolean;\n isInUnifiedWindow(height: number): boolean;\n isInSplitWindow(height: number): boolean;\n emit(props: DiffLineCallbackProps, silent?: boolean): boolean;\n}\n\ninterface IterationStartState {\n hunkIndex: number;\n splitCount: number;\n unifiedCount: number;\n}\n\ninterface HunkPrefixCounts {\n splitCount: number;\n unifiedCount: number;\n}\n\ninterface IterationStartStateProps extends Omit<\n IterateOverDiffProps,\n 'callback' | 'totalLines'\n> {\n startingLine: number;\n collapsedContextThreshold: number;\n}\n\ninterface HunkPrefixCountsProps extends Pick<\n IterationStartStateProps,\n 'diff' | 'expandedHunks' | 'collapsedContextThreshold'\n> {}\n\nexport type DiffLineCallback = (props: DiffLineCallbackProps) => boolean | void;\n\nexport interface IterateOverDiffProps {\n diff: FileDiffMetadata;\n diffStyle: DiffStyle;\n startingLine?: number;\n totalLines?: number;\n expandedHunks?: Map<number, HunkExpansionRegion> | true;\n collapsedContextThreshold?: number;\n callback: DiffLineCallback;\n}\n\nexport function iterateOverDiff({\n diff,\n diffStyle,\n startingLine = 0,\n totalLines = Infinity,\n expandedHunks,\n collapsedContextThreshold = DEFAULT_COLLAPSED_CONTEXT_THRESHOLD,\n callback,\n}: IterateOverDiffProps): void {\n const iterationStart = getIterationStartState({\n diff,\n diffStyle,\n startingLine,\n expandedHunks,\n collapsedContextThreshold,\n });\n const state: IterationState = {\n finalHunk: diff.hunks.at(-1),\n viewportStart: startingLine,\n viewportEnd: startingLine + totalLines,\n isWindowedHighlight: startingLine > 0 || totalLines < Infinity,\n splitCount: iterationStart.splitCount,\n unifiedCount: iterationStart.unifiedCount,\n shouldBreak() {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const breakUnified = state.unifiedCount >= startingLine + totalLines;\n const breakSplit = state.splitCount >= startingLine + totalLines;\n\n if (diffStyle === 'unified') {\n return breakUnified;\n } else if (diffStyle === 'split') {\n return breakSplit;\n } else {\n return breakUnified && breakSplit;\n }\n },\n shouldSkip(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return false;\n }\n\n const skipUnified = state.unifiedCount + unifiedHeight < startingLine;\n const skipSplit = state.splitCount + splitHeight < startingLine;\n\n if (diffStyle === 'unified') {\n return skipUnified;\n } else if (diffStyle === 'split') {\n return skipSplit;\n } else {\n return skipUnified && skipSplit;\n }\n },\n incrementCounts(unifiedValue: number, splitValue: number) {\n if (diffStyle === 'unified' || diffStyle === 'both') {\n state.unifiedCount += unifiedValue;\n }\n if (diffStyle === 'split' || diffStyle === 'both') {\n state.splitCount += splitValue;\n }\n },\n isInWindow(unifiedHeight: number, splitHeight: number) {\n if (!state.isWindowedHighlight) {\n return true;\n }\n\n const unifiedInWindow = state.isInUnifiedWindow(unifiedHeight);\n const splitInWindow = state.isInSplitWindow(splitHeight);\n\n if (diffStyle === 'unified') {\n return unifiedInWindow;\n } else if (diffStyle === 'split') {\n return splitInWindow;\n } else {\n return unifiedInWindow || splitInWindow;\n }\n },\n isInUnifiedWindow(unifiedHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.unifiedCount >= startingLine - unifiedHeight &&\n state.unifiedCount < startingLine + totalLines)\n );\n },\n isInSplitWindow(splitHeight: number) {\n return (\n !state.isWindowedHighlight ||\n (state.splitCount >= startingLine - splitHeight &&\n state.splitCount < startingLine + totalLines)\n );\n },\n emit(props: DiffLineCallbackProps, silent = false): boolean {\n if (!silent) {\n if (diffStyle === 'unified') {\n state.incrementCounts(1, 0);\n } else if (diffStyle === 'split') {\n state.incrementCounts(0, 1);\n } else {\n state.incrementCounts(1, 1);\n // FIXME MAYBE\n // state.incrementCounts(\n // state.isInUnifiedWindow(0) ? 1 : 0,\n // state.isInSplitWindow(0) ? 1 : 0\n // );\n }\n }\n return callback(props) ?? false;\n },\n };\n\n hunkIterator: for (\n let hunkIndex = iterationStart.hunkIndex;\n hunkIndex < diff.hunks.length;\n hunkIndex++\n ) {\n const hunk = diff.hunks[hunkIndex];\n if (hunk == null) {\n throw new Error('iterateOverDiff: invalid hunk index');\n }\n if (state.shouldBreak()) {\n break;\n }\n\n const leadingRegion = getExpandedRegion({\n isPartial: diff.isPartial,\n rangeSize: hunk.collapsedBefore,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n });\n // We only create a trailing region if it's the last hunk\n const trailingRegion = (() => {\n if (hunk !== state.finalHunk || !hasFinalCollapsedHunk(diff)) {\n return undefined;\n }\n const additionRemaining =\n diff.additionLines.length -\n (hunk.additionLineIndex + hunk.additionCount);\n const deletionRemaining =\n diff.deletionLines.length -\n (hunk.deletionLineIndex + hunk.deletionCount);\n\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`\n );\n }\n const trailingRangeSize = Math.min(additionRemaining, deletionRemaining);\n return getExpandedRegion({\n isPartial: diff.isPartial,\n rangeSize: trailingRangeSize,\n expandedHunks,\n // hunkIndex for trailing region\n hunkIndex: diff.hunks.length,\n collapsedContextThreshold,\n });\n })();\n const expandedLineCount = leadingRegion.fromStart + leadingRegion.fromEnd;\n\n function getTrailingCollapsedAfter(\n unifiedLineIndex: number,\n splitLineIndex: number\n ) {\n if (\n trailingRegion == null ||\n trailingRegion.collapsedLines <= 0 ||\n trailingRegion.fromStart + trailingRegion.fromEnd > 0\n ) {\n return 0;\n }\n if (diffStyle === 'unified') {\n return unifiedLineIndex ===\n hunk.unifiedLineStart + hunk.unifiedLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n return splitLineIndex === hunk.splitLineStart + hunk.splitLineCount - 1\n ? trailingRegion.collapsedLines\n : 0;\n }\n function getPendingCollapsed() {\n if (leadingRegion.collapsedLines === 0) {\n return 0;\n }\n const value = leadingRegion.collapsedLines;\n leadingRegion.collapsedLines = 0;\n return value;\n }\n\n // Emit for expanded lines\n if (!state.shouldSkip(expandedLineCount, expandedLineCount)) {\n let unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.rangeSize;\n let splitLineIndex = hunk.splitLineStart - leadingRegion.rangeSize;\n\n let deletionLineIndex = hunk.deletionLineIndex - leadingRegion.rangeSize;\n let additionLineIndex = hunk.additionLineIndex - leadingRegion.rangeSize;\n let deletionLineNumber = hunk.deletionStart - leadingRegion.rangeSize;\n let additionLineNumber = hunk.additionStart - leadingRegion.rangeSize;\n\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n leadingRegion.fromStart,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < leadingRegion.fromStart) {\n if (index >= endIndex) {\n state.incrementCounts(\n leadingRegion.fromStart - index,\n leadingRegion.fromStart - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk: hunk,\n collapsedBefore: 0,\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n type: 'context-expanded',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n\n unifiedLineIndex = hunk.unifiedLineStart - leadingRegion.fromEnd;\n splitLineIndex = hunk.splitLineStart - leadingRegion.fromEnd;\n\n deletionLineIndex = hunk.deletionLineIndex - leadingRegion.fromEnd;\n additionLineIndex = hunk.additionLineIndex - leadingRegion.fromEnd;\n deletionLineNumber = hunk.deletionStart - leadingRegion.fromEnd;\n additionLineNumber = hunk.additionStart - leadingRegion.fromEnd;\n const [fromEndStartIndex, fromEndEndIndex] = getEqualLineIterationRange(\n state,\n leadingRegion.fromEnd,\n diffStyle\n );\n if (fromEndStartIndex > 0) {\n state.incrementCounts(fromEndStartIndex, fromEndStartIndex);\n }\n index = fromEndStartIndex;\n\n while (index < leadingRegion.fromEnd) {\n if (index >= fromEndEndIndex) {\n state.incrementCounts(\n leadingRegion.fromEnd - index,\n leadingRegion.fromEnd - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: 0,\n // NOTE(amadeus): Pretty sure this is would never return a value,\n // so lets not call it, but if i notice a bug, i may need to\n // bring this back.\n // collapsedAfter: getTrailingCollapsedAfter(\n // unifiedRowIndex,\n // splitRowIndex\n // ),\n type: 'context-expanded',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(expandedLineCount, expandedLineCount);\n getPendingCollapsed();\n }\n\n let unifiedLineIndex = hunk.unifiedLineStart;\n let splitLineIndex = hunk.splitLineStart;\n\n let deletionLineIndex = hunk.deletionLineIndex;\n let additionLineIndex = hunk.additionLineIndex;\n let deletionLineNumber = hunk.deletionStart;\n let additionLineNumber = hunk.additionStart;\n const lastContent = hunk.hunkContent.at(-1);\n\n for (const content of hunk.hunkContent) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n\n const isLastContent = content === lastContent;\n\n // Hunk Context Content\n if (content.type === 'context') {\n if (!state.shouldSkip(content.lines, content.lines)) {\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n content.lines,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < content.lines) {\n if (index >= endIndex) {\n state.incrementCounts(\n content.lines - index,\n content.lines - index\n );\n break;\n }\n if (state.isInWindow(0, 0)) {\n const isLastLine = isLastContent && index === content.lines - 1;\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex = splitLineIndex + index;\n if (\n state.emit({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter: getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n ),\n type: 'context',\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: isLastLine && hunk.noEOFCRDeletions,\n unifiedLineIndex: unifiedRowIndex,\n splitLineIndex: splitRowIndex,\n },\n additionLine: {\n unifiedLineIndex: unifiedRowIndex,\n splitLineIndex: splitRowIndex,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: isLastLine && hunk.noEOFCRAdditions,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n } else {\n state.incrementCounts(content.lines, content.lines);\n getPendingCollapsed();\n }\n unifiedLineIndex += content.lines;\n splitLineIndex += content.lines;\n\n deletionLineIndex += content.lines;\n additionLineIndex += content.lines;\n deletionLineNumber += content.lines;\n additionLineNumber += content.lines;\n }\n // Hunk Change Content\n else {\n const splitCount = Math.max(content.deletions, content.additions);\n const unifiedCount = content.deletions + content.additions;\n const shouldSkipChange = state.shouldSkip(unifiedCount, splitCount);\n if (!shouldSkipChange) {\n const iterationRanges = getChangeIterationRanges(\n state,\n content,\n diffStyle\n );\n\n // No need for any skipping because the render ranges skip for us\n for (const [rangeStart, rangeEnd] of iterationRanges) {\n for (let index = rangeStart; index < rangeEnd; index++) {\n const unifiedRowIndex = unifiedLineIndex + index;\n const splitRowIndex =\n diffStyle === 'unified'\n ? splitLineIndex +\n (index < content.deletions\n ? index\n : index - content.deletions)\n : splitLineIndex + index;\n const collapsedAfter = getTrailingCollapsedAfter(\n unifiedRowIndex,\n splitRowIndex\n );\n if (\n state.emit(\n getChangeLineData({\n hunkIndex,\n hunk,\n collapsedBefore: getPendingCollapsed(),\n collapsedAfter,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n }),\n true\n )\n ) {\n break hunkIterator;\n }\n }\n }\n }\n\n getPendingCollapsed();\n state.incrementCounts(unifiedCount, splitCount);\n unifiedLineIndex += unifiedCount;\n splitLineIndex += splitCount;\n deletionLineIndex += content.deletions;\n additionLineIndex += content.additions;\n deletionLineNumber += content.deletions;\n additionLineNumber += content.additions;\n }\n }\n\n if (trailingRegion != null) {\n const { collapsedLines, fromStart, fromEnd } = trailingRegion;\n const len = fromStart + fromEnd;\n const [startIndex, endIndex] = getEqualLineIterationRange(\n state,\n len,\n diffStyle\n );\n if (startIndex > 0) {\n state.incrementCounts(startIndex, startIndex);\n }\n let index = startIndex;\n while (index < len) {\n if (state.shouldBreak()) {\n break hunkIterator;\n }\n if (index >= endIndex) {\n state.incrementCounts(len - index, len - index);\n break;\n }\n if (state.isInWindow(0, 0)) {\n const isLastLine = index === len - 1;\n if (\n state.emit({\n hunkIndex: diff.hunks.length,\n hunk: undefined,\n collapsedBefore: 0,\n collapsedAfter: isLastLine ? collapsedLines : 0,\n type: 'context-expanded',\n // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n deletionLine: {\n lineNumber: deletionLineNumber + index,\n lineIndex: deletionLineIndex + index,\n noEOFCR: false,\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n },\n additionLine: {\n unifiedLineIndex: unifiedLineIndex + index,\n splitLineIndex: splitLineIndex + index,\n lineIndex: additionLineIndex + index,\n lineNumber: additionLineNumber + index,\n noEOFCR: false,\n },\n })\n ) {\n break hunkIterator;\n }\n } else {\n state.incrementCounts(1, 1);\n }\n index++;\n }\n }\n }\n}\n\n// Seek the iterator to the hunk that contains `startingLine` without changing\n// the public meaning of `startingLine`: it is a dense rendered-row index, not\n// a raw split/unified line index. We first build prefix counts for each hunk\n// under the current expansion/collapse settings, binary-search those counts to\n// find the first hunk whose rendered rows cross `startingLine`, then seed the\n// running split/unified counters as if every prior hunk had already been\n// walked.\nfunction getIterationStartState({\n diff,\n diffStyle,\n startingLine,\n expandedHunks,\n collapsedContextThreshold,\n}: IterationStartStateProps): IterationStartState {\n if (startingLine <= 0 || diffStyle === 'both') {\n return { hunkIndex: 0, splitCount: 0, unifiedCount: 0 };\n }\n\n const prefixCounts = getHunkPrefixCounts({\n diff,\n expandedHunks,\n collapsedContextThreshold,\n });\n\n let low = 0;\n let high = diff.hunks.length - 1;\n let result = diff.hunks.length;\n\n while (low <= high) {\n const mid = (low + high) >> 1;\n const counts = prefixCounts[mid + 1];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid hunk prefix index');\n }\n const selectedCount =\n diffStyle === 'unified' ? counts.unifiedCount : counts.splitCount;\n\n if (selectedCount > startingLine) {\n result = mid;\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n if (result >= diff.hunks.length) {\n const counts = prefixCounts[diff.hunks.length];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid terminal hunk prefix index');\n }\n return {\n hunkIndex: diff.hunks.length,\n splitCount: counts.splitCount,\n unifiedCount: counts.unifiedCount,\n };\n }\n\n const counts = prefixCounts[result];\n if (counts == null) {\n throw new Error('iterateOverDiff: invalid selected hunk prefix index');\n }\n return {\n hunkIndex: result,\n splitCount: counts.splitCount,\n unifiedCount: counts.unifiedCount,\n };\n}\n\n// Build cumulative rendered-row counts at every hunk boundary for the current\n// expansion state. Entry 0 is always zero rows before the first hunk; entry N\n// is the split/unified row count after hunks [0, N). These counts let\n// getIterationStartState binary-search by dense rendered row without replaying\n// every prior hunk.\nfunction getHunkPrefixCounts({\n diff,\n expandedHunks,\n collapsedContextThreshold,\n}: HunkPrefixCountsProps): HunkPrefixCounts[] {\n let splitCount = 0;\n let unifiedCount = 0;\n const finalHunkIndex = diff.hunks.length - 1;\n const prefixCounts: HunkPrefixCounts[] = [\n {\n splitCount: 0,\n unifiedCount: 0,\n },\n ];\n\n for (let index = 0; index < diff.hunks.length; index++) {\n const hunk = diff.hunks[index];\n if (hunk == null) {\n throw new Error('iterateOverDiff: invalid hunk summary index');\n }\n\n const leadingRegion = getExpandedRegion({\n isPartial: diff.isPartial,\n rangeSize: hunk.collapsedBefore,\n expandedHunks,\n hunkIndex: index,\n collapsedContextThreshold,\n });\n const leadingCount = leadingRegion.fromStart + leadingRegion.fromEnd;\n splitCount += leadingCount + hunk.splitLineCount;\n unifiedCount += leadingCount + hunk.unifiedLineCount;\n\n if (index === finalHunkIndex && hasFinalCollapsedHunk(diff)) {\n const trailingRangeSize = getTrailingRangeSize(diff, hunk);\n const trailingRegion = getExpandedRegion({\n isPartial: diff.isPartial,\n rangeSize: trailingRangeSize,\n expandedHunks,\n hunkIndex: diff.hunks.length,\n collapsedContextThreshold,\n });\n const trailingCount = trailingRegion.fromStart + trailingRegion.fromEnd;\n splitCount += trailingCount;\n unifiedCount += trailingCount;\n }\n\n prefixCounts.push({ splitCount, unifiedCount });\n }\n\n return prefixCounts;\n}\n\n// Clip a run of unchanged rows to the active rendered window. Equal rows advance\n// split and unified counters together, but `diffStyle: both` needs the union of\n// the split and unified visible ranges because either view can make the row\n// worth emitting.\nfunction getEqualLineIterationRange(\n state: IterationState,\n count: number,\n diffStyle: DiffStyle\n): EqualLineIterationRange {\n if (!state.isWindowedHighlight || count <= 0) {\n return [0, count];\n }\n\n const ranges: EqualLineIterationRange[] = [];\n function pushRange(currentCount: number): void {\n const start = Math.max(0, state.viewportStart - currentCount);\n const end = Math.min(count, state.viewportEnd - currentCount);\n if (end > start) {\n ranges.push([start, end]);\n }\n }\n\n if (diffStyle !== 'split') {\n pushRange(state.unifiedCount);\n }\n if (diffStyle !== 'unified') {\n pushRange(state.splitCount);\n }\n\n if (ranges.length === 0) {\n return [0, 0];\n }\n\n let start = ranges[0][0];\n let end = ranges[0][1];\n for (let index = 1; index < ranges.length; index++) {\n const range = ranges[index];\n start = Math.min(start, range[0]);\n end = Math.max(end, range[1]);\n }\n return [start, end];\n}\n\n// Measure the unchanged tail after the final hunk so it can be collapsed or\n// expanded like leading hunk context. Both sides must have the same remaining\n// length because trailing context represents paired unchanged lines.\nfunction getTrailingRangeSize(diff: FileDiffMetadata, hunk: Hunk): number {\n const additionRemaining =\n diff.additionLines.length - (hunk.additionLineIndex + hunk.additionCount);\n const deletionRemaining =\n diff.deletionLines.length - (hunk.deletionLineIndex + hunk.deletionCount);\n\n if (additionRemaining !== deletionRemaining) {\n throw new Error(\n `iterateOverDiff: trailing context mismatch (additions=${additionRemaining}, deletions=${deletionRemaining}) for ${diff.name}`\n );\n }\n return Math.min(additionRemaining, deletionRemaining);\n}\n\nfunction hasFinalCollapsedHunk(diff: FileDiffMetadata): boolean {\n const lastHunk = diff.hunks.at(-1);\n if (\n lastHunk == null ||\n diff.isPartial ||\n diff.additionLines.length === 0 ||\n diff.deletionLines.length === 0\n ) {\n return false;\n }\n return (\n lastHunk.additionLineIndex + lastHunk.additionCount <\n diff.additionLines.length ||\n lastHunk.deletionLineIndex + lastHunk.deletionCount <\n diff.deletionLines.length\n );\n}\n\n// The intention of this function is to grab the appropriate windowed ranges of\n// the change content. If diffStyle is both, we will iterate AS split, however\n// we will encompass all needed lines to allow us to render split or unified\nfunction getChangeIterationRanges(\n state: IterationState,\n content: ChangeContent,\n diffStyle: DiffStyle\n): EqualLineIterationRange[] {\n // If not a window highlight, then we should just render the entire range\n if (!state.isWindowedHighlight) {\n return [\n [\n 0,\n diffStyle === 'unified'\n ? content.deletions + content.additions\n : Math.max(content.deletions, content.additions),\n ],\n ];\n }\n const useUnified = diffStyle !== 'split';\n const useSplit = diffStyle !== 'unified';\n const iterationSpace = diffStyle === 'unified' ? 'unified' : 'split';\n const iterationRanges: EqualLineIterationRange[] = [];\n function getVisibleRange(\n start: number,\n count: number\n ): EqualLineIterationRange | undefined {\n const end = start + count;\n if (end <= state.viewportStart || start >= state.viewportEnd) {\n return undefined;\n }\n const visibleStart = Math.max(0, state.viewportStart - start);\n const visibleEnd = Math.min(count, state.viewportEnd - start);\n return visibleEnd > visibleStart ? [visibleStart, visibleEnd] : undefined;\n }\n function mapRangeToIteration(\n range: EqualLineIterationRange,\n kind: ChangeContentSide\n ): EqualLineIterationRange {\n if (iterationSpace === 'split') {\n // For split iteration, additions/deletions are already in split row space.\n return range;\n }\n return kind === 'additions'\n ? [range[0] + content.deletions, range[1] + content.deletions]\n : range;\n }\n function pushRange(\n range: EqualLineIterationRange | undefined,\n kind: ChangeContentSide\n ) {\n if (range == null) {\n return;\n }\n const [start, end] = mapRangeToIteration(range, kind);\n if (end > start) {\n iterationRanges.push([start, end]);\n }\n }\n\n if (useUnified) {\n pushRange(\n getVisibleRange(state.unifiedCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(\n state.unifiedCount + content.deletions,\n content.additions\n ),\n 'additions'\n );\n }\n\n if (useSplit) {\n pushRange(\n getVisibleRange(state.splitCount, content.deletions),\n 'deletions'\n );\n pushRange(\n getVisibleRange(state.splitCount, content.additions),\n 'additions'\n );\n }\n\n if (iterationRanges.length === 0) {\n return iterationRanges;\n }\n\n iterationRanges.sort((a, b) => a[0] - b[0]);\n const merged: EqualLineIterationRange[] = [iterationRanges[0]];\n for (const [start, end] of iterationRanges.slice(1)) {\n const last = merged[merged.length - 1];\n if (start <= last[1]) {\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n\ninterface GetChangeLineDataProps {\n hunkIndex: number;\n hunk: Hunk;\n collapsedBefore: number;\n collapsedAfter: number;\n diffStyle: DiffStyle;\n index: number;\n unifiedLineIndex: number;\n splitLineIndex: number;\n additionLineIndex: number;\n additionLineNumber: number;\n deletionLineNumber: number;\n deletionLineIndex: number;\n content: ChangeContent;\n isLastContent: boolean;\n unifiedCount: number;\n splitCount: number;\n}\n\n// NOTE(amadeus): It's quite tedious to grab the appropriate line info and\n// related props for change content regions, so I made it a specialized\n// function to help make the main hunkIterator easy to reason about\nfunction getChangeLineData({\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n diffStyle,\n index,\n unifiedLineIndex,\n splitLineIndex,\n additionLineIndex,\n deletionLineIndex,\n additionLineNumber,\n deletionLineNumber,\n content,\n isLastContent,\n unifiedCount,\n splitCount,\n}: GetChangeLineDataProps): DiffLineCallbackProps {\n const unifiedDeletionLineIndex =\n index < content.deletions ? unifiedLineIndex + index : undefined;\n const unifiedAdditionLineIndex =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? unifiedLineIndex + index\n : undefined\n : index < content.additions\n ? unifiedLineIndex + content.deletions + index\n : undefined;\n\n const resolvedSplitLineIndex =\n diffStyle === 'unified'\n ? splitLineIndex +\n (index < content.deletions ? index : index - content.deletions)\n : splitLineIndex + index;\n\n const deletionLineIndexValue =\n index < content.deletions ? deletionLineIndex + index : undefined;\n const deletionLineNumberValue =\n index < content.deletions ? deletionLineNumber + index : undefined;\n const additionLineIndexValue =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? additionLineIndex + (index - content.deletions)\n : undefined\n : index < content.additions\n ? additionLineIndex + index\n : undefined;\n const additionLineNumberValue =\n diffStyle === 'unified'\n ? index >= content.deletions\n ? additionLineNumber + (index - content.deletions)\n : undefined\n : index < content.additions\n ? additionLineNumber + index\n : undefined;\n\n const noEOFCRDeletion =\n diffStyle === 'unified'\n ? isLastContent &&\n index === content.deletions - 1 &&\n hunk.noEOFCRDeletions\n : isLastContent && index === splitCount - 1 && hunk.noEOFCRDeletions;\n const noEOFCRAddition =\n diffStyle === 'unified'\n ? isLastContent && index === unifiedCount - 1 && hunk.noEOFCRAdditions\n : isLastContent && index === splitCount - 1 && hunk.noEOFCRAdditions;\n\n const deletionLine: DiffLineMetadata | undefined =\n deletionLineIndexValue != null &&\n deletionLineNumberValue != null &&\n unifiedDeletionLineIndex != null\n ? // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n {\n lineNumber: deletionLineNumberValue,\n lineIndex: deletionLineIndexValue,\n noEOFCR: noEOFCRDeletion,\n unifiedLineIndex: unifiedDeletionLineIndex,\n splitLineIndex: resolvedSplitLineIndex,\n }\n : undefined;\n const additionLine: DiffLineMetadata | undefined =\n additionLineIndexValue != null &&\n additionLineNumberValue != null &&\n unifiedAdditionLineIndex != null\n ? // NOTE(amadeus): Maybe create an object cache for this to reduce\n // garbage collection?\n {\n unifiedLineIndex: unifiedAdditionLineIndex,\n splitLineIndex: resolvedSplitLineIndex,\n lineIndex: additionLineIndexValue,\n lineNumber: additionLineNumberValue,\n noEOFCR: noEOFCRAddition,\n }\n : undefined;\n\n if (deletionLine == null && additionLine != null) {\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine: undefined,\n additionLine,\n };\n } else if (deletionLine != null && additionLine == null) {\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine,\n additionLine: undefined,\n };\n }\n\n if (deletionLine == null || additionLine == null) {\n throw new Error('iterateOverDiff: missing change line data');\n }\n\n return {\n type: 'change',\n hunkIndex,\n hunk,\n collapsedAfter,\n collapsedBefore,\n deletionLine,\n additionLine,\n };\n}\n"],"mappings":";;;;AAyGA,SAAgB,gBAAgB,EAC9B,MACA,WACA,eAAe,GACf,aAAa,UACb,eACA,4BAA4B,qCAC5B,YAC6B;CAC7B,MAAM,iBAAiB,uBAAuB;EAC5C;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,MAAMA,QAAwB;EAC5B,WAAW,KAAK,MAAM,GAAG,GAAG;EAC5B,eAAe;EACf,aAAa,eAAe;EAC5B,qBAAqB,eAAe,KAAK,aAAa;EACtD,YAAY,eAAe;EAC3B,cAAc,eAAe;EAC7B,cAAc;AACZ,OAAI,CAAC,MAAM,oBACT,QAAO;GAGT,MAAM,eAAe,MAAM,gBAAgB,eAAe;GAC1D,MAAM,aAAa,MAAM,cAAc,eAAe;AAEtD,OAAI,cAAc,UAChB,QAAO;YACE,cAAc,QACvB,QAAO;OAEP,QAAO,gBAAgB;;EAG3B,WAAW,eAAuB,aAAqB;AACrD,OAAI,CAAC,MAAM,oBACT,QAAO;GAGT,MAAM,cAAc,MAAM,eAAe,gBAAgB;GACzD,MAAM,YAAY,MAAM,aAAa,cAAc;AAEnD,OAAI,cAAc,UAChB,QAAO;YACE,cAAc,QACvB,QAAO;OAEP,QAAO,eAAe;;EAG1B,gBAAgB,cAAsB,YAAoB;AACxD,OAAI,cAAc,aAAa,cAAc,OAC3C,OAAM,gBAAgB;AAExB,OAAI,cAAc,WAAW,cAAc,OACzC,OAAM,cAAc;;EAGxB,WAAW,eAAuB,aAAqB;AACrD,OAAI,CAAC,MAAM,oBACT,QAAO;GAGT,MAAM,kBAAkB,MAAM,kBAAkB,cAAc;GAC9D,MAAM,gBAAgB,MAAM,gBAAgB,YAAY;AAExD,OAAI,cAAc,UAChB,QAAO;YACE,cAAc,QACvB,QAAO;OAEP,QAAO,mBAAmB;;EAG9B,kBAAkB,eAAuB;AACvC,UACE,CAAC,MAAM,uBACN,MAAM,gBAAgB,eAAe,iBACpC,MAAM,eAAe,eAAe;;EAG1C,gBAAgB,aAAqB;AACnC,UACE,CAAC,MAAM,uBACN,MAAM,cAAc,eAAe,eAClC,MAAM,aAAa,eAAe;;EAGxC,KAAK,OAA8B,SAAS,OAAgB;AAC1D,OAAI,CAAC,OACH,KAAI,cAAc,UAChB,OAAM,gBAAgB,GAAG,EAAE;YAClB,cAAc,QACvB,OAAM,gBAAgB,GAAG,EAAE;OAE3B,OAAM,gBAAgB,GAAG,EAAE;AAQ/B,UAAO,SAAS,MAAM,IAAI;;EAE7B;AAED,cAAc,MACZ,IAAI,YAAY,eAAe,WAC/B,YAAY,KAAK,MAAM,QACvB,aACA;EACA,MAAM,OAAO,KAAK,MAAM;AACxB,MAAI,QAAQ,KACV,OAAM,IAAI,MAAM,sCAAsC;AAExD,MAAI,MAAM,aAAa,CACrB;EAGF,MAAM,gBAAgB,kBAAkB;GACtC,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB;GACA;GACA;GACD,CAAC;EAEF,MAAM,wBAAwB;AAC5B,OAAI,SAAS,MAAM,aAAa,CAAC,sBAAsB,KAAK,CAC1D;GAEF,MAAM,oBACJ,KAAK,cAAc,UAClB,KAAK,oBAAoB,KAAK;GACjC,MAAM,oBACJ,KAAK,cAAc,UAClB,KAAK,oBAAoB,KAAK;AAEjC,OAAI,sBAAsB,kBACxB,OAAM,IAAI,MACR,yDAAyD,kBAAkB,cAAc,kBAAkB,QAAQ,KAAK,OACzH;GAEH,MAAM,oBAAoB,KAAK,IAAI,mBAAmB,kBAAkB;AACxE,UAAO,kBAAkB;IACvB,WAAW,KAAK;IAChB,WAAW;IACX;IAEA,WAAW,KAAK,MAAM;IACtB;IACD,CAAC;MACA;EACJ,MAAM,oBAAoB,cAAc,YAAY,cAAc;EAElE,SAAS,0BACP,oBACA,kBACA;AACA,OACE,kBAAkB,QAClB,eAAe,kBAAkB,KACjC,eAAe,YAAY,eAAe,UAAU,EAEpD,QAAO;AAET,OAAI,cAAc,UAChB,QAAOC,uBACL,KAAK,mBAAmB,KAAK,mBAAmB,IAC9C,eAAe,iBACf;AAEN,UAAOC,qBAAmB,KAAK,iBAAiB,KAAK,iBAAiB,IAClE,eAAe,iBACf;;EAEN,SAAS,sBAAsB;AAC7B,OAAI,cAAc,mBAAmB,EACnC,QAAO;GAET,MAAM,QAAQ,cAAc;AAC5B,iBAAc,iBAAiB;AAC/B,UAAO;;AAIT,MAAI,CAAC,MAAM,WAAW,mBAAmB,kBAAkB,EAAE;GAC3D,IAAID,qBAAmB,KAAK,mBAAmB,cAAc;GAC7D,IAAIC,mBAAiB,KAAK,iBAAiB,cAAc;GAEzD,IAAIC,sBAAoB,KAAK,oBAAoB,cAAc;GAC/D,IAAIC,sBAAoB,KAAK,oBAAoB,cAAc;GAC/D,IAAIC,uBAAqB,KAAK,gBAAgB,cAAc;GAC5D,IAAIC,uBAAqB,KAAK,gBAAgB,cAAc;GAE5D,MAAM,CAAC,YAAY,YAAY,2BAC7B,OACA,cAAc,WACd,UACD;AACD,OAAI,aAAa,EACf,OAAM,gBAAgB,YAAY,WAAW;GAE/C,IAAI,QAAQ;AACZ,UAAO,QAAQ,cAAc,WAAW;AACtC,QAAI,SAAS,UAAU;AACrB,WAAM,gBACJ,cAAc,YAAY,OAC1B,cAAc,YAAY,MAC3B;AACD;;AAEF,QAAI,MAAM,WAAW,GAAG,EAAE,EACxB;SACE,MAAM,KAAK;MACT;MACM;MACN,iBAAiB;MACjB,gBAAgB;MAQhB,MAAM;MACN,cAAc;OACZ,YAAYD,uBAAqB;OACjC,WAAWF,sBAAoB;OAC/B,SAAS;OACT,kBAAkBF,qBAAmB;OACrC,gBAAgBC,mBAAiB;OAClC;MACD,cAAc;OACZ,kBAAkBD,qBAAmB;OACrC,gBAAgBC,mBAAiB;OACjC,WAAWE,sBAAoB;OAC/B,YAAYE,uBAAqB;OACjC,SAAS;OACV;MACF,CAAC,CAEF,OAAM;UAGR,OAAM,gBAAgB,GAAG,EAAE;AAE7B;;AAGF,wBAAmB,KAAK,mBAAmB,cAAc;AACzD,sBAAiB,KAAK,iBAAiB,cAAc;AAErD,yBAAoB,KAAK,oBAAoB,cAAc;AAC3D,yBAAoB,KAAK,oBAAoB,cAAc;AAC3D,0BAAqB,KAAK,gBAAgB,cAAc;AACxD,0BAAqB,KAAK,gBAAgB,cAAc;GACxD,MAAM,CAAC,mBAAmB,mBAAmB,2BAC3C,OACA,cAAc,SACd,UACD;AACD,OAAI,oBAAoB,EACtB,OAAM,gBAAgB,mBAAmB,kBAAkB;AAE7D,WAAQ;AAER,UAAO,QAAQ,cAAc,SAAS;AACpC,QAAI,SAAS,iBAAiB;AAC5B,WAAM,gBACJ,cAAc,UAAU,OACxB,cAAc,UAAU,MACzB;AACD;;AAEF,QAAI,MAAM,WAAW,GAAG,EAAE,EACxB;SACE,MAAM,KAAK;MACT;MACA;MACA,iBAAiB,qBAAqB;MACtC,gBAAgB;MAQhB,MAAM;MACN,cAAc;OACZ,YAAYD,uBAAqB;OACjC,WAAWF,sBAAoB;OAC/B,SAAS;OACT,kBAAkBF,qBAAmB;OACrC,gBAAgBC,mBAAiB;OAClC;MACD,cAAc;OACZ,kBAAkBD,qBAAmB;OACrC,gBAAgBC,mBAAiB;OACjC,WAAWE,sBAAoB;OAC/B,YAAYE,uBAAqB;OACjC,SAAS;OACV;MACF,CAAC,CAEF,OAAM;UAGR,OAAM,gBAAgB,GAAG,EAAE;AAE7B;;SAEG;AACL,SAAM,gBAAgB,mBAAmB,kBAAkB;AAC3D,wBAAqB;;EAGvB,IAAI,mBAAmB,KAAK;EAC5B,IAAI,iBAAiB,KAAK;EAE1B,IAAI,oBAAoB,KAAK;EAC7B,IAAI,oBAAoB,KAAK;EAC7B,IAAI,qBAAqB,KAAK;EAC9B,IAAI,qBAAqB,KAAK;EAC9B,MAAM,cAAc,KAAK,YAAY,GAAG,GAAG;AAE3C,OAAK,MAAM,WAAW,KAAK,aAAa;AACtC,OAAI,MAAM,aAAa,CACrB,OAAM;GAGR,MAAM,gBAAgB,YAAY;AAGlC,OAAI,QAAQ,SAAS,WAAW;AAC9B,QAAI,CAAC,MAAM,WAAW,QAAQ,OAAO,QAAQ,MAAM,EAAE;KACnD,MAAM,CAAC,YAAY,YAAY,2BAC7B,OACA,QAAQ,OACR,UACD;AACD,SAAI,aAAa,EACf,OAAM,gBAAgB,YAAY,WAAW;KAE/C,IAAI,QAAQ;AACZ,YAAO,QAAQ,QAAQ,OAAO;AAC5B,UAAI,SAAS,UAAU;AACrB,aAAM,gBACJ,QAAQ,QAAQ,OAChB,QAAQ,QAAQ,MACjB;AACD;;AAEF,UAAI,MAAM,WAAW,GAAG,EAAE,EAAE;OAC1B,MAAM,aAAa,iBAAiB,UAAU,QAAQ,QAAQ;OAC9D,MAAM,kBAAkB,mBAAmB;OAC3C,MAAM,gBAAgB,iBAAiB;AACvC,WACE,MAAM,KAAK;QACT;QACA;QACA,iBAAiB,qBAAqB;QACtC,gBAAgB,0BACd,iBACA,cACD;QACD,MAAM;QACN,cAAc;SACZ,YAAY,qBAAqB;SACjC,WAAW,oBAAoB;SAC/B,SAAS,cAAc,KAAK;SAC5B,kBAAkB;SAClB,gBAAgB;SACjB;QACD,cAAc;SACZ,kBAAkB;SAClB,gBAAgB;SAChB,WAAW,oBAAoB;SAC/B,YAAY,qBAAqB;SACjC,SAAS,cAAc,KAAK;SAC7B;QACF,CAAC,CAEF,OAAM;YAGR,OAAM,gBAAgB,GAAG,EAAE;AAE7B;;WAEG;AACL,WAAM,gBAAgB,QAAQ,OAAO,QAAQ,MAAM;AACnD,0BAAqB;;AAEvB,wBAAoB,QAAQ;AAC5B,sBAAkB,QAAQ;AAE1B,yBAAqB,QAAQ;AAC7B,yBAAqB,QAAQ;AAC7B,0BAAsB,QAAQ;AAC9B,0BAAsB,QAAQ;UAG3B;IACH,MAAM,aAAa,KAAK,IAAI,QAAQ,WAAW,QAAQ,UAAU;IACjE,MAAM,eAAe,QAAQ,YAAY,QAAQ;AAEjD,QAAI,CADqB,MAAM,WAAW,cAAc,WAAW,EAC5C;KACrB,MAAM,kBAAkB,yBACtB,OACA,SACA,UACD;AAGD,UAAK,MAAM,CAAC,YAAY,aAAa,gBACnC,MAAK,IAAI,QAAQ,YAAY,QAAQ,UAAU,SAAS;MAStD,MAAM,iBAAiB,0BARC,mBAAmB,OAEzC,cAAc,YACV,kBACC,QAAQ,QAAQ,YACb,QACA,QAAQ,QAAQ,aACpB,iBAAiB,MAItB;AACD,UACE,MAAM,KACJ,kBAAkB;OAChB;OACA;OACA,iBAAiB,qBAAqB;OACtC;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACA;OACD,CAAC,EACF,KACD,CAED,OAAM;;;AAMd,yBAAqB;AACrB,UAAM,gBAAgB,cAAc,WAAW;AAC/C,wBAAoB;AACpB,sBAAkB;AAClB,yBAAqB,QAAQ;AAC7B,yBAAqB,QAAQ;AAC7B,0BAAsB,QAAQ;AAC9B,0BAAsB,QAAQ;;;AAIlC,MAAI,kBAAkB,MAAM;GAC1B,MAAM,EAAE,gBAAgB,WAAW,YAAY;GAC/C,MAAM,MAAM,YAAY;GACxB,MAAM,CAAC,YAAY,YAAY,2BAC7B,OACA,KACA,UACD;AACD,OAAI,aAAa,EACf,OAAM,gBAAgB,YAAY,WAAW;GAE/C,IAAI,QAAQ;AACZ,UAAO,QAAQ,KAAK;AAClB,QAAI,MAAM,aAAa,CACrB,OAAM;AAER,QAAI,SAAS,UAAU;AACrB,WAAM,gBAAgB,MAAM,OAAO,MAAM,MAAM;AAC/C;;AAEF,QAAI,MAAM,WAAW,GAAG,EAAE,EAAE;KAC1B,MAAM,aAAa,UAAU,MAAM;AACnC,SACE,MAAM,KAAK;MACT,WAAW,KAAK,MAAM;MACtB,MAAM;MACN,iBAAiB;MACjB,gBAAgB,aAAa,iBAAiB;MAC9C,MAAM;MAGN,cAAc;OACZ,YAAY,qBAAqB;OACjC,WAAW,oBAAoB;OAC/B,SAAS;OACT,kBAAkB,mBAAmB;OACrC,gBAAgB,iBAAiB;OAClC;MACD,cAAc;OACZ,kBAAkB,mBAAmB;OACrC,gBAAgB,iBAAiB;OACjC,WAAW,oBAAoB;OAC/B,YAAY,qBAAqB;OACjC,SAAS;OACV;MACF,CAAC,CAEF,OAAM;UAGR,OAAM,gBAAgB,GAAG,EAAE;AAE7B;;;;;AAaR,SAAS,uBAAuB,EAC9B,MACA,WACA,cACA,eACA,6BACgD;AAChD,KAAI,gBAAgB,KAAK,cAAc,OACrC,QAAO;EAAE,WAAW;EAAG,YAAY;EAAG,cAAc;EAAG;CAGzD,MAAM,eAAe,oBAAoB;EACvC;EACA;EACA;EACD,CAAC;CAEF,IAAI,MAAM;CACV,IAAI,OAAO,KAAK,MAAM,SAAS;CAC/B,IAAI,SAAS,KAAK,MAAM;AAExB,QAAO,OAAO,MAAM;EAClB,MAAM,MAAO,MAAM,QAAS;EAC5B,MAAMC,WAAS,aAAa,MAAM;AAClC,MAAIA,YAAU,KACZ,OAAM,IAAI,MAAM,6CAA6C;AAK/D,OAFE,cAAc,YAAYA,SAAO,eAAeA,SAAO,cAErC,cAAc;AAChC,YAAS;AACT,UAAO,MAAM;QAEb,OAAM,MAAM;;AAIhB,KAAI,UAAU,KAAK,MAAM,QAAQ;EAC/B,MAAMA,WAAS,aAAa,KAAK,MAAM;AACvC,MAAIA,YAAU,KACZ,OAAM,IAAI,MAAM,sDAAsD;AAExE,SAAO;GACL,WAAW,KAAK,MAAM;GACtB,YAAYA,SAAO;GACnB,cAAcA,SAAO;GACtB;;CAGH,MAAM,SAAS,aAAa;AAC5B,KAAI,UAAU,KACZ,OAAM,IAAI,MAAM,sDAAsD;AAExE,QAAO;EACL,WAAW;EACX,YAAY,OAAO;EACnB,cAAc,OAAO;EACtB;;AAQH,SAAS,oBAAoB,EAC3B,MACA,eACA,6BAC4C;CAC5C,IAAI,aAAa;CACjB,IAAI,eAAe;CACnB,MAAM,iBAAiB,KAAK,MAAM,SAAS;CAC3C,MAAMC,eAAmC,CACvC;EACE,YAAY;EACZ,cAAc;EACf,CACF;AAED,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,MAAM,QAAQ,SAAS;EACtD,MAAM,OAAO,KAAK,MAAM;AACxB,MAAI,QAAQ,KACV,OAAM,IAAI,MAAM,8CAA8C;EAGhE,MAAM,gBAAgB,kBAAkB;GACtC,WAAW,KAAK;GAChB,WAAW,KAAK;GAChB;GACA,WAAW;GACX;GACD,CAAC;EACF,MAAM,eAAe,cAAc,YAAY,cAAc;AAC7D,gBAAc,eAAe,KAAK;AAClC,kBAAgB,eAAe,KAAK;AAEpC,MAAI,UAAU,kBAAkB,sBAAsB,KAAK,EAAE;GAC3D,MAAM,oBAAoB,qBAAqB,MAAM,KAAK;GAC1D,MAAM,iBAAiB,kBAAkB;IACvC,WAAW,KAAK;IAChB,WAAW;IACX;IACA,WAAW,KAAK,MAAM;IACtB;IACD,CAAC;GACF,MAAM,gBAAgB,eAAe,YAAY,eAAe;AAChE,iBAAc;AACd,mBAAgB;;AAGlB,eAAa,KAAK;GAAE;GAAY;GAAc,CAAC;;AAGjD,QAAO;;AAOT,SAAS,2BACP,OACA,OACA,WACyB;AACzB,KAAI,CAAC,MAAM,uBAAuB,SAAS,EACzC,QAAO,CAAC,GAAG,MAAM;CAGnB,MAAMC,SAAoC,EAAE;CAC5C,SAAS,UAAU,cAA4B;EAC7C,MAAMC,UAAQ,KAAK,IAAI,GAAG,MAAM,gBAAgB,aAAa;EAC7D,MAAMC,QAAM,KAAK,IAAI,OAAO,MAAM,cAAc,aAAa;AAC7D,MAAIA,QAAMD,QACR,QAAO,KAAK,CAACA,SAAOC,MAAI,CAAC;;AAI7B,KAAI,cAAc,QAChB,WAAU,MAAM,aAAa;AAE/B,KAAI,cAAc,UAChB,WAAU,MAAM,WAAW;AAG7B,KAAI,OAAO,WAAW,EACpB,QAAO,CAAC,GAAG,EAAE;CAGf,IAAI,QAAQ,OAAO,GAAG;CACtB,IAAI,MAAM,OAAO,GAAG;AACpB,MAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS;EAClD,MAAM,QAAQ,OAAO;AACrB,UAAQ,KAAK,IAAI,OAAO,MAAM,GAAG;AACjC,QAAM,KAAK,IAAI,KAAK,MAAM,GAAG;;AAE/B,QAAO,CAAC,OAAO,IAAI;;AAMrB,SAAS,qBAAqB,MAAwB,MAAoB;CACxE,MAAM,oBACJ,KAAK,cAAc,UAAU,KAAK,oBAAoB,KAAK;CAC7D,MAAM,oBACJ,KAAK,cAAc,UAAU,KAAK,oBAAoB,KAAK;AAE7D,KAAI,sBAAsB,kBACxB,OAAM,IAAI,MACR,yDAAyD,kBAAkB,cAAc,kBAAkB,QAAQ,KAAK,OACzH;AAEH,QAAO,KAAK,IAAI,mBAAmB,kBAAkB;;AAGvD,SAAS,sBAAsB,MAAiC;CAC9D,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG;AAClC,KACE,YAAY,QACZ,KAAK,aACL,KAAK,cAAc,WAAW,KAC9B,KAAK,cAAc,WAAW,EAE9B,QAAO;AAET,QACE,SAAS,oBAAoB,SAAS,gBACpC,KAAK,cAAc,UACrB,SAAS,oBAAoB,SAAS,gBACpC,KAAK,cAAc;;AAOzB,SAAS,yBACP,OACA,SACA,WAC2B;AAE3B,KAAI,CAAC,MAAM,oBACT,QAAO,CACL,CACE,GACA,cAAc,YACV,QAAQ,YAAY,QAAQ,YAC5B,KAAK,IAAI,QAAQ,WAAW,QAAQ,UAAU,CACnD,CACF;CAEH,MAAM,aAAa,cAAc;CACjC,MAAM,WAAW,cAAc;CAC/B,MAAM,iBAAiB,cAAc,YAAY,YAAY;CAC7D,MAAMC,kBAA6C,EAAE;CACrD,SAAS,gBACP,OACA,OACqC;AAErC,MADY,QAAQ,SACT,MAAM,iBAAiB,SAAS,MAAM,YAC/C;EAEF,MAAM,eAAe,KAAK,IAAI,GAAG,MAAM,gBAAgB,MAAM;EAC7D,MAAM,aAAa,KAAK,IAAI,OAAO,MAAM,cAAc,MAAM;AAC7D,SAAO,aAAa,eAAe,CAAC,cAAc,WAAW,GAAG;;CAElE,SAAS,oBACP,OACA,MACyB;AACzB,MAAI,mBAAmB,QAErB,QAAO;AAET,SAAO,SAAS,cACZ,CAAC,MAAM,KAAK,QAAQ,WAAW,MAAM,KAAK,QAAQ,UAAU,GAC5D;;CAEN,SAAS,UACP,OACA,MACA;AACA,MAAI,SAAS,KACX;EAEF,MAAM,CAAC,OAAO,OAAO,oBAAoB,OAAO,KAAK;AACrD,MAAI,MAAM,MACR,iBAAgB,KAAK,CAAC,OAAO,IAAI,CAAC;;AAItC,KAAI,YAAY;AACd,YACE,gBAAgB,MAAM,cAAc,QAAQ,UAAU,EACtD,YACD;AACD,YACE,gBACE,MAAM,eAAe,QAAQ,WAC7B,QAAQ,UACT,EACD,YACD;;AAGH,KAAI,UAAU;AACZ,YACE,gBAAgB,MAAM,YAAY,QAAQ,UAAU,EACpD,YACD;AACD,YACE,gBAAgB,MAAM,YAAY,QAAQ,UAAU,EACpD,YACD;;AAGH,KAAI,gBAAgB,WAAW,EAC7B,QAAO;AAGT,iBAAgB,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,GAAG;CAC3C,MAAMC,SAAoC,CAAC,gBAAgB,GAAG;AAC9D,MAAK,MAAM,CAAC,OAAO,QAAQ,gBAAgB,MAAM,EAAE,EAAE;EACnD,MAAM,OAAO,OAAO,OAAO,SAAS;AACpC,MAAI,SAAS,KAAK,GAChB,MAAK,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI;MAEhC,QAAO,KAAK,CAAC,OAAO,IAAI,CAAC;;AAI7B,QAAO;;AAyBT,SAAS,kBAAkB,EACzB,WACA,MACA,gBACA,iBACA,WACA,OACA,kBACA,gBACA,mBACA,mBACA,oBACA,oBACA,SACA,eACA,cACA,cACgD;CAChD,MAAM,2BACJ,QAAQ,QAAQ,YAAY,mBAAmB,QAAQ;CACzD,MAAM,2BACJ,cAAc,YACV,SAAS,QAAQ,YACf,mBAAmB,QACnB,SACF,QAAQ,QAAQ,YACd,mBAAmB,QAAQ,YAAY,QACvC;CAER,MAAM,yBACJ,cAAc,YACV,kBACC,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,aACrD,iBAAiB;CAEvB,MAAM,yBACJ,QAAQ,QAAQ,YAAY,oBAAoB,QAAQ;CAC1D,MAAM,0BACJ,QAAQ,QAAQ,YAAY,qBAAqB,QAAQ;CAC3D,MAAM,yBACJ,cAAc,YACV,SAAS,QAAQ,YACf,qBAAqB,QAAQ,QAAQ,aACrC,SACF,QAAQ,QAAQ,YACd,oBAAoB,QACpB;CACR,MAAM,0BACJ,cAAc,YACV,SAAS,QAAQ,YACf,sBAAsB,QAAQ,QAAQ,aACtC,SACF,QAAQ,QAAQ,YACd,qBAAqB,QACrB;CAER,MAAM,kBACJ,cAAc,YACV,iBACA,UAAU,QAAQ,YAAY,KAC9B,KAAK,mBACL,iBAAiB,UAAU,aAAa,KAAK,KAAK;CACxD,MAAM,kBACJ,cAAc,YACV,iBAAiB,UAAU,eAAe,KAAK,KAAK,mBACpD,iBAAiB,UAAU,aAAa,KAAK,KAAK;CAExD,MAAMC,eACJ,0BAA0B,QAC1B,2BAA2B,QAC3B,4BAA4B,OAGxB;EACE,YAAY;EACZ,WAAW;EACX,SAAS;EACT,kBAAkB;EAClB,gBAAgB;EACjB,GACD;CACN,MAAMC,eACJ,0BAA0B,QAC1B,2BAA2B,QAC3B,4BAA4B,OAGxB;EACE,kBAAkB;EAClB,gBAAgB;EAChB,WAAW;EACX,YAAY;EACZ,SAAS;EACV,GACD;AAEN,KAAI,gBAAgB,QAAQ,gBAAgB,KAC1C,QAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA,cAAc;EACd;EACD;UACQ,gBAAgB,QAAQ,gBAAgB,KACjD,QAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA;EACA,cAAc;EACf;AAGH,KAAI,gBAAgB,QAAQ,gBAAgB,KAC1C,OAAM,IAAI,MAAM,4CAA4C;AAG9D,QAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -85,7 +85,14 @@ function _processFile(fileDiffString, { cacheKey, isGitDiff = GIT_DIFF_FILE_BREA
85
85
  if (currentFile.deletionLines.length === 1 && oldFile?.contents === "") currentFile.deletionLines.length = 0;
86
86
  for (const line of lines) {
87
87
  if (line.startsWith("diff --git")) {
88
- const [, , prevName, , name] = line.trim().match(ALTERNATE_FILE_NAMES_GIT) ?? [];
88
+ const filenameMatch$1 = line.trim().match(ALTERNATE_FILE_NAMES_GIT);
89
+ const prevName = filenameMatch$1?.[1] ?? filenameMatch$1?.[2];
90
+ const name = filenameMatch$1?.[3] ?? filenameMatch$1?.[4];
91
+ if (prevName == null || name == null) {
92
+ if (throwOnError) throw Error("parsePatchContent: invalid git diff header");
93
+ else console.error("parsePatchContent: invalid git diff header", line);
94
+ continue;
95
+ }
89
96
  currentFile.name = detachString(name.trim());
90
97
  if (prevName !== name) currentFile.prevName = detachString(prevName.trim());
91
98
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"parsePatchFiles.js","names":["patchMetadata: string | undefined","files: FileDiffMetadata[]","currentFile: FileDiffMetadata | undefined","currentContent: ContextContent | ChangeContent | undefined","lastLineType: 'context' | 'addition' | 'deletion' | undefined","hunkData: Hunk","lastHunkEnd","patches: ParsedPatch[]","lines: string[]","hunkContext: string | undefined","parts: string[]"],"sources":["../../src/utils/parsePatchFiles.ts"],"sourcesContent":["import {\n ALTERNATE_FILE_NAMES_GIT,\n COMMIT_METADATA_SPLIT,\n FILENAME_HEADER_REGEX,\n FILENAME_HEADER_REGEX_GIT,\n GIT_DIFF_FILE_BREAK_REGEX,\n INDEX_LINE_METADATA,\n UNIFIED_DIFF_FILE_BREAK_REGEX,\n} from '../constants';\nimport type {\n ChangeContent,\n ContextContent,\n FileContents,\n FileDiffMetadata,\n Hunk,\n HunkLineType,\n ParsedPatch,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { detachString, releaseStringDetachBuffer } from './detachString';\n\ninterface ParsedHunkHeader {\n additionCount: number;\n additionStart: number;\n deletionCount: number;\n deletionStart: number;\n hunkContext?: string;\n}\n\nexport function processPatch(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError?: boolean\n): ParsedPatch {\n try {\n return _processPatch(data, cacheKeyPrefix, throwOnError);\n } finally {\n releaseStringDetachBuffer();\n }\n}\n\nfunction _processPatch(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError = false\n): ParsedPatch {\n const isGitDiff = isGitDiffPatch(data);\n const rawFiles = isGitDiff\n ? splitAtLinePrefix(data, 'diff --git')\n : data.split(UNIFIED_DIFF_FILE_BREAK_REGEX);\n let patchMetadata: string | undefined;\n const files: FileDiffMetadata[] = [];\n for (const fileOrPatchMetadata of rawFiles) {\n if (isGitDiff && !GIT_DIFF_FILE_BREAK_REGEX.test(fileOrPatchMetadata)) {\n if (patchMetadata == null) {\n patchMetadata = detachString(fileOrPatchMetadata);\n } else {\n if (throwOnError) {\n throw Error('parsePatchContent: unknown file blob');\n } else {\n console.error(\n 'parsePatchContent: unknown file blob:',\n fileOrPatchMetadata\n );\n }\n }\n // If we get in here, it's most likely the introductory metadata from the\n // patch, or something is fucked with the diff format\n continue;\n } else if (\n !isGitDiff &&\n !UNIFIED_DIFF_FILE_BREAK_REGEX.test(fileOrPatchMetadata)\n ) {\n if (patchMetadata == null) {\n patchMetadata = detachString(fileOrPatchMetadata);\n } else {\n if (throwOnError) {\n throw Error('parsePatchContent: unknown file blob');\n } else {\n console.error(\n 'parsePatchContent: unknown file blob:',\n fileOrPatchMetadata\n );\n }\n }\n continue;\n }\n const currentFile = _processFile(fileOrPatchMetadata, {\n cacheKey:\n cacheKeyPrefix != null\n ? `${cacheKeyPrefix}-${files.length}`\n : undefined,\n isGitDiff,\n throwOnError,\n });\n if (currentFile != null) {\n files.push(currentFile);\n }\n }\n return { patchMetadata, files };\n}\n\ninterface ProcessFileOptions {\n cacheKey?: string;\n isGitDiff?: boolean;\n oldFile?: FileContents;\n newFile?: FileContents;\n throwOnError?: boolean;\n}\n\nexport function processFile(\n fileDiffString: string,\n options?: ProcessFileOptions\n): FileDiffMetadata | undefined {\n try {\n return _processFile(fileDiffString, options);\n } finally {\n releaseStringDetachBuffer();\n }\n}\n\nfunction _processFile(\n fileDiffString: string,\n {\n cacheKey,\n isGitDiff = GIT_DIFF_FILE_BREAK_REGEX.test(fileDiffString),\n oldFile,\n newFile,\n throwOnError = false,\n }: ProcessFileOptions = {}\n): FileDiffMetadata | undefined {\n let lastHunkEnd = 0;\n const hunks = splitAtLinePrefix(fileDiffString, '@@ ');\n let currentFile: FileDiffMetadata | undefined;\n const isPartial = oldFile == null || newFile == null;\n let deletionLineIndex = 0;\n let additionLineIndex = 0;\n for (const hunk of hunks) {\n const lines = splitWithNewlines(hunk);\n const firstLine = lines[0];\n if (firstLine == null) {\n if (throwOnError) {\n throw Error('parsePatchContent: invalid hunk');\n } else {\n console.error('parsePatchContent: invalid hunk', hunk);\n }\n continue;\n }\n const fileHeader = parseHunkHeader(firstLine);\n let additionLines = 0;\n let deletionLines = 0;\n // Setup currentFile, this should be the first iteration of our hunks, and\n // technically not a hunk\n if (fileHeader == null || currentFile == null) {\n if (currentFile != null) {\n if (throwOnError) {\n throw Error('parsePatchContent: Invalid hunk');\n } else {\n console.error('parsePatchContent: Invalid hunk', hunk);\n }\n continue;\n }\n currentFile = {\n name: '',\n type: 'change',\n hunks: [],\n splitLineCount: 0,\n unifiedLineCount: 0,\n isPartial,\n additionLines:\n !isPartial && oldFile != null && newFile != null\n ? splitFileContents(newFile.contents)\n : [],\n deletionLines:\n !isPartial && oldFile != null && newFile != null\n ? splitFileContents(oldFile.contents)\n : [],\n cacheKey: maybeDetachOptionalString(cacheKey),\n };\n // If either file is technically empty, then we should empty the\n // arrays respectively\n if (currentFile.additionLines.length === 1 && newFile?.contents === '') {\n currentFile.additionLines.length = 0;\n }\n if (currentFile.deletionLines.length === 1 && oldFile?.contents === '') {\n currentFile.deletionLines.length = 0;\n }\n\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n const [, , prevName, , name] =\n line.trim().match(ALTERNATE_FILE_NAMES_GIT) ?? [];\n currentFile.name = detachString(name.trim());\n if (prevName !== name) {\n currentFile.prevName = detachString(prevName.trim());\n }\n continue;\n }\n\n const filenameMatch =\n line.startsWith('---') || line.startsWith('+++')\n ? line.match(\n isGitDiff ? FILENAME_HEADER_REGEX_GIT : FILENAME_HEADER_REGEX\n )\n : null;\n if (filenameMatch != null) {\n const [, type, fileName] = filenameMatch;\n if (type === '---' && fileName !== '/dev/null') {\n const detachedFileName = detachString(fileName.trim());\n currentFile.prevName = detachedFileName;\n currentFile.name = detachedFileName;\n } else if (type === '+++' && fileName !== '/dev/null') {\n currentFile.name = detachString(fileName.trim());\n }\n }\n // Git diffs have a bunch of additional metadata we can pull from\n else if (isGitDiff) {\n if (line.startsWith('new mode ')) {\n currentFile.mode = detachString(\n line.slice('new mode'.length).trim()\n );\n }\n if (line.startsWith('old mode ')) {\n currentFile.prevMode = detachString(\n line.slice('old mode'.length).trim()\n );\n }\n if (line.startsWith('new file mode')) {\n currentFile.type = 'new';\n currentFile.mode = detachString(\n line.slice('new file mode'.length).trim()\n );\n }\n if (line.startsWith('deleted file mode')) {\n currentFile.type = 'deleted';\n currentFile.mode = detachString(\n line.slice('deleted file mode'.length).trim()\n );\n }\n if (line.startsWith('similarity index')) {\n if (line.startsWith('similarity index 100%')) {\n currentFile.type = 'rename-pure';\n } else {\n currentFile.type = 'rename-changed';\n }\n }\n if (line.startsWith('index ')) {\n const [, prevObjectId, newObjectId, mode] =\n line.trim().match(INDEX_LINE_METADATA) ?? [];\n if (prevObjectId != null) {\n currentFile.prevObjectId = detachString(prevObjectId);\n }\n if (newObjectId != null) {\n currentFile.newObjectId = detachString(newObjectId);\n }\n if (mode != null) {\n currentFile.mode = detachString(mode);\n }\n }\n // We have to handle these for pure renames because there won't be\n // --- and +++ lines\n if (line.startsWith('rename from ')) {\n currentFile.prevName = detachString(\n line.slice('rename from '.length).trim()\n );\n }\n if (line.startsWith('rename to ')) {\n currentFile.name = detachString(\n line.slice('rename to '.length).trim()\n );\n }\n }\n }\n continue;\n }\n\n // Otherwise, time to start parsing out the hunk\n let currentContent: ContextContent | ChangeContent | undefined;\n let lastLineType: 'context' | 'addition' | 'deletion' | undefined;\n\n // Strip trailing bare newlines (format-patch separators between commits)\n // if needed\n while (\n lines.length > 0 &&\n (lines[lines.length - 1] === '\\n' ||\n lines[lines.length - 1] === '\\r' ||\n lines[lines.length - 1] === '\\r\\n' ||\n lines[lines.length - 1] === '')\n ) {\n lines.pop();\n }\n\n const { additionStart, deletionStart } = fileHeader;\n deletionLineIndex = isPartial ? deletionLineIndex : deletionStart - 1;\n additionLineIndex = isPartial ? additionLineIndex : additionStart - 1;\n\n const hunkData: Hunk = {\n collapsedBefore: 0,\n\n splitLineCount: 0,\n splitLineStart: 0,\n\n unifiedLineCount: 0,\n unifiedLineStart: 0,\n\n additionCount: fileHeader.additionCount,\n additionStart,\n additionLines,\n\n deletionCount: fileHeader.deletionCount,\n deletionStart,\n deletionLines,\n\n deletionLineIndex,\n additionLineIndex,\n\n hunkContent: [],\n hunkContext: maybeDetachOptionalString(fileHeader.hunkContext),\n hunkSpecs: detachString(firstLine),\n\n noEOFCRAdditions: false,\n noEOFCRDeletions: false,\n };\n\n // Now we process each line of the hunk\n let parsedAdditionLines = 0;\n let parsedDeletionLines = 0;\n for (let lineIndex = 1; lineIndex < lines.length; lineIndex++) {\n const rawLine = lines[lineIndex];\n if (\n parsedAdditionLines >= hunkData.additionCount &&\n parsedDeletionLines >= hunkData.deletionCount &&\n !rawLine.startsWith('\\\\')\n ) {\n break;\n }\n\n const firstChar = rawLine[0];\n // If we can't properly process the line, well, lets just try to salvage\n // things and continue... It's possible an AI generated diff might have\n // some stray blank lines or something in there\n if (\n firstChar !== '+' &&\n firstChar !== '-' &&\n firstChar !== ' ' &&\n firstChar !== '\\\\'\n ) {\n console.error(\n `parseLineType: Invalid firstChar: \"${firstChar}\", full line: \"${rawLine}\"`\n );\n console.error('processFile: invalid rawLine:', rawLine);\n continue;\n }\n\n const type = parseRawLineType(firstChar);\n if (type === 'addition') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'change') {\n currentContent = createContentGroup(\n 'change',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n additionLineIndex++;\n parsedAdditionLines++;\n if (isPartial) {\n currentFile.additionLines.push(line);\n }\n currentContent.additions++;\n additionLines++;\n lastLineType = 'addition';\n } else if (type === 'deletion') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'change') {\n currentContent = createContentGroup(\n 'change',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n deletionLineIndex++;\n parsedDeletionLines++;\n if (isPartial) {\n currentFile.deletionLines.push(line);\n }\n currentContent.deletions++;\n deletionLines++;\n lastLineType = 'deletion';\n } else if (type === 'context') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'context') {\n currentContent = createContentGroup(\n 'context',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n additionLineIndex++;\n deletionLineIndex++;\n parsedAdditionLines++;\n parsedDeletionLines++;\n if (isPartial) {\n currentFile.deletionLines.push(line);\n currentFile.additionLines.push(line);\n }\n currentContent.lines++;\n lastLineType = 'context';\n } else if (type === 'metadata' && currentContent != null) {\n if (currentContent.type === 'context') {\n hunkData.noEOFCRAdditions = true;\n hunkData.noEOFCRDeletions = true;\n } else if (lastLineType === 'deletion') {\n hunkData.noEOFCRDeletions = true;\n } else if (lastLineType === 'addition') {\n hunkData.noEOFCRAdditions = true;\n }\n // If we're dealing with partial content from a diff, we need to strip\n // newlines manually from the content\n if (\n isPartial &&\n (lastLineType === 'addition' || lastLineType === 'context')\n ) {\n const lastIndex = currentFile.additionLines.length - 1;\n if (lastIndex >= 0) {\n currentFile.additionLines[lastIndex] = cleanLastNewline(\n currentFile.additionLines[lastIndex]\n );\n }\n }\n if (\n isPartial &&\n (lastLineType === 'deletion' || lastLineType === 'context')\n ) {\n const lastIndex = currentFile.deletionLines.length - 1;\n if (lastIndex >= 0) {\n currentFile.deletionLines[lastIndex] = cleanLastNewline(\n currentFile.deletionLines[lastIndex]\n );\n }\n }\n }\n }\n\n hunkData.additionLines = additionLines;\n hunkData.deletionLines = deletionLines;\n\n hunkData.collapsedBefore = Math.max(\n hunkData.additionStart - 1 - lastHunkEnd,\n 0\n );\n currentFile.hunks.push(hunkData);\n lastHunkEnd = hunkData.additionStart + hunkData.additionCount - 1;\n for (const content of hunkData.hunkContent) {\n if (content.type === 'context') {\n hunkData.splitLineCount += content.lines;\n hunkData.unifiedLineCount += content.lines;\n } else {\n hunkData.splitLineCount += Math.max(\n content.additions,\n content.deletions\n );\n hunkData.unifiedLineCount += content.deletions + content.additions;\n }\n }\n hunkData.splitLineStart =\n currentFile.splitLineCount + hunkData.collapsedBefore;\n hunkData.unifiedLineStart =\n currentFile.unifiedLineCount + hunkData.collapsedBefore;\n\n currentFile.splitLineCount +=\n hunkData.collapsedBefore + hunkData.splitLineCount;\n currentFile.unifiedLineCount +=\n hunkData.collapsedBefore + hunkData.unifiedLineCount;\n }\n if (currentFile == null) {\n return undefined;\n }\n\n // Account for collapsed lines after the final hunk and increment the\n // split/unified counts properly\n if (\n currentFile.hunks.length > 0 &&\n !isPartial &&\n currentFile.additionLines.length > 0 &&\n currentFile.deletionLines.length > 0\n ) {\n const lastHunk = currentFile.hunks[currentFile.hunks.length - 1];\n const lastHunkEnd = lastHunk.additionStart + lastHunk.additionCount - 1;\n const totalFileLines = currentFile.additionLines.length;\n const collapsedAfter = Math.max(totalFileLines - lastHunkEnd, 0);\n currentFile.splitLineCount += collapsedAfter;\n currentFile.unifiedLineCount += collapsedAfter;\n }\n\n // If this isn't a git diff style patch, then we'll need to sus out some\n // additional metadata manually\n if (!isGitDiff) {\n if (\n currentFile.prevName != null &&\n currentFile.name !== currentFile.prevName\n ) {\n if (currentFile.hunks.length > 0) {\n currentFile.type = 'rename-changed';\n } else {\n currentFile.type = 'rename-pure';\n }\n }\n // Sort of a hack for detecting deleted/added files...\n else if (\n (oldFile == null || oldFile.contents === '') &&\n newFile != null &&\n newFile.contents !== ''\n ) {\n currentFile.type = 'new';\n } else if (\n oldFile != null &&\n oldFile.contents !== '' &&\n (newFile == null || newFile.contents === '')\n ) {\n currentFile.type = 'deleted';\n }\n }\n if (\n currentFile.type !== 'rename-pure' &&\n currentFile.type !== 'rename-changed'\n ) {\n currentFile.prevName = undefined;\n }\n return currentFile;\n}\n\n/**\n * Parses a patch file string into an array of parsed patches.\n *\n * @param data - The raw patch file content (supports multi-commit patches)\n * @param cacheKeyPrefix - Optional prefix for generating cache keys. When provided,\n * each file in the patch will get a cache key in the format `prefix-patchIndex-fileIndex`.\n * This enables caching of rendered diff results in the worker pool.\n */\nexport function parsePatchFiles(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError = false\n): ParsedPatch[] {\n // NOTE(amadeus): This function is pretty forgiving in that it can accept a\n // patch file that includes commit metdata, multiple commits, or not\n const patches: ParsedPatch[] = [];\n const rawPatches = hasCommitMetadataBoundary(data)\n ? data.split(COMMIT_METADATA_SPLIT)\n : [data];\n for (const patch of rawPatches) {\n try {\n patches.push(\n processPatch(\n patch,\n cacheKeyPrefix != null\n ? `${cacheKeyPrefix}-${patches.length}`\n : undefined,\n throwOnError\n )\n );\n } catch (error) {\n if (throwOnError) {\n throw error;\n } else {\n console.error(error);\n }\n }\n }\n return patches;\n}\n\nfunction hasCommitMetadataBoundary(data: string): boolean {\n return data.startsWith('From ') || data.includes('\\nFrom ');\n}\n\nfunction splitFileContents(contents: string): string[] {\n const lines = splitWithNewlines(contents);\n for (let index = 0; index < lines.length; index++) {\n lines[index] = detachString(lines[index]);\n }\n return lines;\n}\n\nfunction splitWithNewlines(contents: string): string[] {\n if (contents.length === 0) {\n return [''];\n }\n\n const lines: string[] = [];\n let startIndex = 0;\n for (;;) {\n const newlineIndex = contents.indexOf('\\n', startIndex);\n if (newlineIndex === -1) {\n break;\n }\n\n lines.push(contents.slice(startIndex, newlineIndex + 1));\n startIndex = newlineIndex + 1;\n }\n\n if (startIndex < contents.length) {\n lines.push(contents.slice(startIndex));\n }\n return lines;\n}\n\nfunction parseHunkHeader(line: string): ParsedHunkHeader | undefined {\n if (!line.startsWith('@@ -')) {\n return undefined;\n }\n\n let index = 4;\n const deletionStartResult = readPositiveInteger(line, index);\n if (deletionStartResult == null) {\n return undefined;\n }\n const deletionStart = deletionStartResult.value;\n index = deletionStartResult.endIndex;\n\n let deletionCount = 1;\n if (line[index] === ',') {\n const deletionCountResult = readPositiveInteger(line, index + 1);\n if (deletionCountResult == null) {\n return undefined;\n }\n deletionCount = deletionCountResult.value;\n index = deletionCountResult.endIndex;\n }\n\n if (line[index] !== ' ' || line[index + 1] !== '+') {\n return undefined;\n }\n index += 2;\n\n const additionStartResult = readPositiveInteger(line, index);\n if (additionStartResult == null) {\n return undefined;\n }\n const additionStart = additionStartResult.value;\n index = additionStartResult.endIndex;\n\n let additionCount = 1;\n if (line[index] === ',') {\n const additionCountResult = readPositiveInteger(line, index + 1);\n if (additionCountResult == null) {\n return undefined;\n }\n additionCount = additionCountResult.value;\n index = additionCountResult.endIndex;\n }\n\n if (\n line[index] !== ' ' ||\n line[index + 1] !== '@' ||\n line[index + 2] !== '@'\n ) {\n return undefined;\n }\n\n let hunkContext: string | undefined;\n const contextStartIndex = index + 3;\n if (line[contextStartIndex] === ' ') {\n hunkContext = trimLineEnd(line.slice(contextStartIndex + 1));\n }\n\n return {\n additionCount,\n additionStart,\n deletionCount,\n deletionStart,\n hunkContext,\n };\n}\n\nfunction readPositiveInteger(\n value: string,\n startIndex: number\n): { value: number; endIndex: number } | undefined {\n let index = startIndex;\n let parsedValue = 0;\n for (; index < value.length; index++) {\n const digit = value.charCodeAt(index) - 48;\n if (digit < 0 || digit > 9) {\n break;\n }\n parsedValue = parsedValue * 10 + digit;\n }\n\n if (index === startIndex) {\n return undefined;\n }\n return { value: parsedValue, endIndex: index };\n}\n\nfunction trimLineEnd(value: string): string {\n if (value.endsWith('\\r\\n')) {\n return value.slice(0, -2);\n }\n if (value.endsWith('\\n')) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction isGitDiffPatch(data: string): boolean {\n return data.startsWith('diff --git') || data.includes('\\ndiff --git');\n}\n\nfunction splitAtLinePrefix(contents: string, prefix: string): string[] {\n if (contents.length === 0) {\n return [''];\n }\n\n const newlinePrefix = `\\n${prefix}`;\n const firstBoundaryIndex = contents.startsWith(prefix)\n ? 0\n : findLinePrefixIndex(contents, newlinePrefix, 0);\n if (firstBoundaryIndex === -1) {\n return [contents];\n }\n\n const parts: string[] = [];\n if (firstBoundaryIndex > 0) {\n parts.push(contents.slice(0, firstBoundaryIndex));\n }\n\n let startIndex = firstBoundaryIndex;\n for (;;) {\n const nextBoundaryIndex = findLinePrefixIndex(\n contents,\n newlinePrefix,\n startIndex + 1\n );\n if (nextBoundaryIndex === -1) {\n break;\n }\n\n parts.push(contents.slice(startIndex, nextBoundaryIndex));\n startIndex = nextBoundaryIndex;\n }\n parts.push(contents.slice(startIndex));\n return parts;\n}\n\nfunction findLinePrefixIndex(\n contents: string,\n newlinePrefix: string,\n fromIndex: number\n): number {\n const index = contents.indexOf(newlinePrefix, fromIndex);\n return index === -1 ? -1 : index + 1;\n}\n\nfunction maybeDetachOptionalString<T extends string | undefined>(value: T): T {\n return (value == null ? value : detachString(value)) as T;\n}\n\nfunction parseRawLineType(\n firstChar: string | undefined\n): Exclude<HunkLineType, 'expanded'> {\n return firstChar === ' '\n ? 'context'\n : firstChar === '\\\\'\n ? 'metadata'\n : firstChar === '+'\n ? 'addition'\n : 'deletion';\n}\n\nfunction getParsedLineContent(rawLine: string): string {\n const processedLine = rawLine.slice(1);\n return detachString(processedLine === '' ? '\\n' : processedLine);\n}\n\nfunction createContentGroup(\n type: 'change',\n deletionLineIndex: number,\n additionLineIndex: number\n): ChangeContent;\nfunction createContentGroup(\n type: 'context',\n deletionLineIndex: number,\n additionLineIndex: number\n): ContextContent;\nfunction createContentGroup(\n type: 'change' | 'context',\n deletionLineIndex: number,\n additionLineIndex: number\n): ChangeContent | ContextContent {\n if (type === 'change') {\n return {\n type: 'change',\n additions: 0,\n deletions: 0,\n additionLineIndex,\n deletionLineIndex,\n };\n }\n return {\n type: 'context',\n lines: 0,\n additionLineIndex,\n deletionLineIndex,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"parsePatchFiles.js","names":["patchMetadata: string | undefined","files: FileDiffMetadata[]","currentFile: FileDiffMetadata | undefined","filenameMatch","currentContent: ContextContent | ChangeContent | undefined","lastLineType: 'context' | 'addition' | 'deletion' | undefined","hunkData: Hunk","lastHunkEnd","patches: ParsedPatch[]","lines: string[]","hunkContext: string | undefined","parts: string[]"],"sources":["../../src/utils/parsePatchFiles.ts"],"sourcesContent":["import {\n ALTERNATE_FILE_NAMES_GIT,\n COMMIT_METADATA_SPLIT,\n FILENAME_HEADER_REGEX,\n FILENAME_HEADER_REGEX_GIT,\n GIT_DIFF_FILE_BREAK_REGEX,\n INDEX_LINE_METADATA,\n UNIFIED_DIFF_FILE_BREAK_REGEX,\n} from '../constants';\nimport type {\n ChangeContent,\n ContextContent,\n FileContents,\n FileDiffMetadata,\n Hunk,\n HunkLineType,\n ParsedPatch,\n} from '../types';\nimport { cleanLastNewline } from './cleanLastNewline';\nimport { detachString, releaseStringDetachBuffer } from './detachString';\n\ninterface ParsedHunkHeader {\n additionCount: number;\n additionStart: number;\n deletionCount: number;\n deletionStart: number;\n hunkContext?: string;\n}\n\nexport function processPatch(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError?: boolean\n): ParsedPatch {\n try {\n return _processPatch(data, cacheKeyPrefix, throwOnError);\n } finally {\n releaseStringDetachBuffer();\n }\n}\n\nfunction _processPatch(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError = false\n): ParsedPatch {\n const isGitDiff = isGitDiffPatch(data);\n const rawFiles = isGitDiff\n ? splitAtLinePrefix(data, 'diff --git')\n : data.split(UNIFIED_DIFF_FILE_BREAK_REGEX);\n let patchMetadata: string | undefined;\n const files: FileDiffMetadata[] = [];\n for (const fileOrPatchMetadata of rawFiles) {\n if (isGitDiff && !GIT_DIFF_FILE_BREAK_REGEX.test(fileOrPatchMetadata)) {\n if (patchMetadata == null) {\n patchMetadata = detachString(fileOrPatchMetadata);\n } else {\n if (throwOnError) {\n throw Error('parsePatchContent: unknown file blob');\n } else {\n console.error(\n 'parsePatchContent: unknown file blob:',\n fileOrPatchMetadata\n );\n }\n }\n // If we get in here, it's most likely the introductory metadata from the\n // patch, or something is fucked with the diff format\n continue;\n } else if (\n !isGitDiff &&\n !UNIFIED_DIFF_FILE_BREAK_REGEX.test(fileOrPatchMetadata)\n ) {\n if (patchMetadata == null) {\n patchMetadata = detachString(fileOrPatchMetadata);\n } else {\n if (throwOnError) {\n throw Error('parsePatchContent: unknown file blob');\n } else {\n console.error(\n 'parsePatchContent: unknown file blob:',\n fileOrPatchMetadata\n );\n }\n }\n continue;\n }\n const currentFile = _processFile(fileOrPatchMetadata, {\n cacheKey:\n cacheKeyPrefix != null\n ? `${cacheKeyPrefix}-${files.length}`\n : undefined,\n isGitDiff,\n throwOnError,\n });\n if (currentFile != null) {\n files.push(currentFile);\n }\n }\n return { patchMetadata, files };\n}\n\ninterface ProcessFileOptions {\n cacheKey?: string;\n isGitDiff?: boolean;\n oldFile?: FileContents;\n newFile?: FileContents;\n throwOnError?: boolean;\n}\n\nexport function processFile(\n fileDiffString: string,\n options?: ProcessFileOptions\n): FileDiffMetadata | undefined {\n try {\n return _processFile(fileDiffString, options);\n } finally {\n releaseStringDetachBuffer();\n }\n}\n\nfunction _processFile(\n fileDiffString: string,\n {\n cacheKey,\n isGitDiff = GIT_DIFF_FILE_BREAK_REGEX.test(fileDiffString),\n oldFile,\n newFile,\n throwOnError = false,\n }: ProcessFileOptions = {}\n): FileDiffMetadata | undefined {\n let lastHunkEnd = 0;\n const hunks = splitAtLinePrefix(fileDiffString, '@@ ');\n let currentFile: FileDiffMetadata | undefined;\n const isPartial = oldFile == null || newFile == null;\n let deletionLineIndex = 0;\n let additionLineIndex = 0;\n for (const hunk of hunks) {\n const lines = splitWithNewlines(hunk);\n const firstLine = lines[0];\n if (firstLine == null) {\n if (throwOnError) {\n throw Error('parsePatchContent: invalid hunk');\n } else {\n console.error('parsePatchContent: invalid hunk', hunk);\n }\n continue;\n }\n const fileHeader = parseHunkHeader(firstLine);\n let additionLines = 0;\n let deletionLines = 0;\n // Setup currentFile, this should be the first iteration of our hunks, and\n // technically not a hunk\n if (fileHeader == null || currentFile == null) {\n if (currentFile != null) {\n if (throwOnError) {\n throw Error('parsePatchContent: Invalid hunk');\n } else {\n console.error('parsePatchContent: Invalid hunk', hunk);\n }\n continue;\n }\n currentFile = {\n name: '',\n type: 'change',\n hunks: [],\n splitLineCount: 0,\n unifiedLineCount: 0,\n isPartial,\n additionLines:\n !isPartial && oldFile != null && newFile != null\n ? splitFileContents(newFile.contents)\n : [],\n deletionLines:\n !isPartial && oldFile != null && newFile != null\n ? splitFileContents(oldFile.contents)\n : [],\n cacheKey: maybeDetachOptionalString(cacheKey),\n };\n // If either file is technically empty, then we should empty the\n // arrays respectively\n if (currentFile.additionLines.length === 1 && newFile?.contents === '') {\n currentFile.additionLines.length = 0;\n }\n if (currentFile.deletionLines.length === 1 && oldFile?.contents === '') {\n currentFile.deletionLines.length = 0;\n }\n\n for (const line of lines) {\n if (line.startsWith('diff --git')) {\n const filenameMatch = line.trim().match(ALTERNATE_FILE_NAMES_GIT);\n const prevName = filenameMatch?.[1] ?? filenameMatch?.[2];\n const name = filenameMatch?.[3] ?? filenameMatch?.[4];\n if (prevName == null || name == null) {\n if (throwOnError) {\n throw Error('parsePatchContent: invalid git diff header');\n } else {\n console.error('parsePatchContent: invalid git diff header', line);\n }\n continue;\n }\n currentFile.name = detachString(name.trim());\n if (prevName !== name) {\n currentFile.prevName = detachString(prevName.trim());\n }\n continue;\n }\n\n const filenameMatch =\n line.startsWith('---') || line.startsWith('+++')\n ? line.match(\n isGitDiff ? FILENAME_HEADER_REGEX_GIT : FILENAME_HEADER_REGEX\n )\n : null;\n if (filenameMatch != null) {\n const [, type, fileName] = filenameMatch;\n if (type === '---' && fileName !== '/dev/null') {\n const detachedFileName = detachString(fileName.trim());\n currentFile.prevName = detachedFileName;\n currentFile.name = detachedFileName;\n } else if (type === '+++' && fileName !== '/dev/null') {\n currentFile.name = detachString(fileName.trim());\n }\n }\n // Git diffs have a bunch of additional metadata we can pull from\n else if (isGitDiff) {\n if (line.startsWith('new mode ')) {\n currentFile.mode = detachString(\n line.slice('new mode'.length).trim()\n );\n }\n if (line.startsWith('old mode ')) {\n currentFile.prevMode = detachString(\n line.slice('old mode'.length).trim()\n );\n }\n if (line.startsWith('new file mode')) {\n currentFile.type = 'new';\n currentFile.mode = detachString(\n line.slice('new file mode'.length).trim()\n );\n }\n if (line.startsWith('deleted file mode')) {\n currentFile.type = 'deleted';\n currentFile.mode = detachString(\n line.slice('deleted file mode'.length).trim()\n );\n }\n if (line.startsWith('similarity index')) {\n if (line.startsWith('similarity index 100%')) {\n currentFile.type = 'rename-pure';\n } else {\n currentFile.type = 'rename-changed';\n }\n }\n if (line.startsWith('index ')) {\n const [, prevObjectId, newObjectId, mode] =\n line.trim().match(INDEX_LINE_METADATA) ?? [];\n if (prevObjectId != null) {\n currentFile.prevObjectId = detachString(prevObjectId);\n }\n if (newObjectId != null) {\n currentFile.newObjectId = detachString(newObjectId);\n }\n if (mode != null) {\n currentFile.mode = detachString(mode);\n }\n }\n // We have to handle these for pure renames because there won't be\n // --- and +++ lines\n if (line.startsWith('rename from ')) {\n currentFile.prevName = detachString(\n line.slice('rename from '.length).trim()\n );\n }\n if (line.startsWith('rename to ')) {\n currentFile.name = detachString(\n line.slice('rename to '.length).trim()\n );\n }\n }\n }\n continue;\n }\n\n // Otherwise, time to start parsing out the hunk\n let currentContent: ContextContent | ChangeContent | undefined;\n let lastLineType: 'context' | 'addition' | 'deletion' | undefined;\n\n // Strip trailing bare newlines (format-patch separators between commits)\n // if needed\n while (\n lines.length > 0 &&\n (lines[lines.length - 1] === '\\n' ||\n lines[lines.length - 1] === '\\r' ||\n lines[lines.length - 1] === '\\r\\n' ||\n lines[lines.length - 1] === '')\n ) {\n lines.pop();\n }\n\n const { additionStart, deletionStart } = fileHeader;\n deletionLineIndex = isPartial ? deletionLineIndex : deletionStart - 1;\n additionLineIndex = isPartial ? additionLineIndex : additionStart - 1;\n\n const hunkData: Hunk = {\n collapsedBefore: 0,\n\n splitLineCount: 0,\n splitLineStart: 0,\n\n unifiedLineCount: 0,\n unifiedLineStart: 0,\n\n additionCount: fileHeader.additionCount,\n additionStart,\n additionLines,\n\n deletionCount: fileHeader.deletionCount,\n deletionStart,\n deletionLines,\n\n deletionLineIndex,\n additionLineIndex,\n\n hunkContent: [],\n hunkContext: maybeDetachOptionalString(fileHeader.hunkContext),\n hunkSpecs: detachString(firstLine),\n\n noEOFCRAdditions: false,\n noEOFCRDeletions: false,\n };\n\n // Now we process each line of the hunk\n let parsedAdditionLines = 0;\n let parsedDeletionLines = 0;\n for (let lineIndex = 1; lineIndex < lines.length; lineIndex++) {\n const rawLine = lines[lineIndex];\n if (\n parsedAdditionLines >= hunkData.additionCount &&\n parsedDeletionLines >= hunkData.deletionCount &&\n !rawLine.startsWith('\\\\')\n ) {\n break;\n }\n\n const firstChar = rawLine[0];\n // If we can't properly process the line, well, lets just try to salvage\n // things and continue... It's possible an AI generated diff might have\n // some stray blank lines or something in there\n if (\n firstChar !== '+' &&\n firstChar !== '-' &&\n firstChar !== ' ' &&\n firstChar !== '\\\\'\n ) {\n console.error(\n `parseLineType: Invalid firstChar: \"${firstChar}\", full line: \"${rawLine}\"`\n );\n console.error('processFile: invalid rawLine:', rawLine);\n continue;\n }\n\n const type = parseRawLineType(firstChar);\n if (type === 'addition') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'change') {\n currentContent = createContentGroup(\n 'change',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n additionLineIndex++;\n parsedAdditionLines++;\n if (isPartial) {\n currentFile.additionLines.push(line);\n }\n currentContent.additions++;\n additionLines++;\n lastLineType = 'addition';\n } else if (type === 'deletion') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'change') {\n currentContent = createContentGroup(\n 'change',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n deletionLineIndex++;\n parsedDeletionLines++;\n if (isPartial) {\n currentFile.deletionLines.push(line);\n }\n currentContent.deletions++;\n deletionLines++;\n lastLineType = 'deletion';\n } else if (type === 'context') {\n const line = getParsedLineContent(rawLine);\n if (currentContent == null || currentContent.type !== 'context') {\n currentContent = createContentGroup(\n 'context',\n deletionLineIndex,\n additionLineIndex\n );\n hunkData.hunkContent.push(currentContent);\n }\n additionLineIndex++;\n deletionLineIndex++;\n parsedAdditionLines++;\n parsedDeletionLines++;\n if (isPartial) {\n currentFile.deletionLines.push(line);\n currentFile.additionLines.push(line);\n }\n currentContent.lines++;\n lastLineType = 'context';\n } else if (type === 'metadata' && currentContent != null) {\n if (currentContent.type === 'context') {\n hunkData.noEOFCRAdditions = true;\n hunkData.noEOFCRDeletions = true;\n } else if (lastLineType === 'deletion') {\n hunkData.noEOFCRDeletions = true;\n } else if (lastLineType === 'addition') {\n hunkData.noEOFCRAdditions = true;\n }\n // If we're dealing with partial content from a diff, we need to strip\n // newlines manually from the content\n if (\n isPartial &&\n (lastLineType === 'addition' || lastLineType === 'context')\n ) {\n const lastIndex = currentFile.additionLines.length - 1;\n if (lastIndex >= 0) {\n currentFile.additionLines[lastIndex] = cleanLastNewline(\n currentFile.additionLines[lastIndex]\n );\n }\n }\n if (\n isPartial &&\n (lastLineType === 'deletion' || lastLineType === 'context')\n ) {\n const lastIndex = currentFile.deletionLines.length - 1;\n if (lastIndex >= 0) {\n currentFile.deletionLines[lastIndex] = cleanLastNewline(\n currentFile.deletionLines[lastIndex]\n );\n }\n }\n }\n }\n\n hunkData.additionLines = additionLines;\n hunkData.deletionLines = deletionLines;\n\n hunkData.collapsedBefore = Math.max(\n hunkData.additionStart - 1 - lastHunkEnd,\n 0\n );\n currentFile.hunks.push(hunkData);\n lastHunkEnd = hunkData.additionStart + hunkData.additionCount - 1;\n for (const content of hunkData.hunkContent) {\n if (content.type === 'context') {\n hunkData.splitLineCount += content.lines;\n hunkData.unifiedLineCount += content.lines;\n } else {\n hunkData.splitLineCount += Math.max(\n content.additions,\n content.deletions\n );\n hunkData.unifiedLineCount += content.deletions + content.additions;\n }\n }\n hunkData.splitLineStart =\n currentFile.splitLineCount + hunkData.collapsedBefore;\n hunkData.unifiedLineStart =\n currentFile.unifiedLineCount + hunkData.collapsedBefore;\n\n currentFile.splitLineCount +=\n hunkData.collapsedBefore + hunkData.splitLineCount;\n currentFile.unifiedLineCount +=\n hunkData.collapsedBefore + hunkData.unifiedLineCount;\n }\n if (currentFile == null) {\n return undefined;\n }\n\n // Account for collapsed lines after the final hunk and increment the\n // split/unified counts properly\n if (\n currentFile.hunks.length > 0 &&\n !isPartial &&\n currentFile.additionLines.length > 0 &&\n currentFile.deletionLines.length > 0\n ) {\n const lastHunk = currentFile.hunks[currentFile.hunks.length - 1];\n const lastHunkEnd = lastHunk.additionStart + lastHunk.additionCount - 1;\n const totalFileLines = currentFile.additionLines.length;\n const collapsedAfter = Math.max(totalFileLines - lastHunkEnd, 0);\n currentFile.splitLineCount += collapsedAfter;\n currentFile.unifiedLineCount += collapsedAfter;\n }\n\n // If this isn't a git diff style patch, then we'll need to sus out some\n // additional metadata manually\n if (!isGitDiff) {\n if (\n currentFile.prevName != null &&\n currentFile.name !== currentFile.prevName\n ) {\n if (currentFile.hunks.length > 0) {\n currentFile.type = 'rename-changed';\n } else {\n currentFile.type = 'rename-pure';\n }\n }\n // Sort of a hack for detecting deleted/added files...\n else if (\n (oldFile == null || oldFile.contents === '') &&\n newFile != null &&\n newFile.contents !== ''\n ) {\n currentFile.type = 'new';\n } else if (\n oldFile != null &&\n oldFile.contents !== '' &&\n (newFile == null || newFile.contents === '')\n ) {\n currentFile.type = 'deleted';\n }\n }\n if (\n currentFile.type !== 'rename-pure' &&\n currentFile.type !== 'rename-changed'\n ) {\n currentFile.prevName = undefined;\n }\n return currentFile;\n}\n\n/**\n * Parses a patch file string into an array of parsed patches.\n *\n * @param data - The raw patch file content (supports multi-commit patches)\n * @param cacheKeyPrefix - Optional prefix for generating cache keys. When provided,\n * each file in the patch will get a cache key in the format `prefix-patchIndex-fileIndex`.\n * This enables caching of rendered diff results in the worker pool.\n */\nexport function parsePatchFiles(\n data: string,\n cacheKeyPrefix?: string,\n throwOnError = false\n): ParsedPatch[] {\n // NOTE(amadeus): This function is pretty forgiving in that it can accept a\n // patch file that includes commit metdata, multiple commits, or not\n const patches: ParsedPatch[] = [];\n const rawPatches = hasCommitMetadataBoundary(data)\n ? data.split(COMMIT_METADATA_SPLIT)\n : [data];\n for (const patch of rawPatches) {\n try {\n patches.push(\n processPatch(\n patch,\n cacheKeyPrefix != null\n ? `${cacheKeyPrefix}-${patches.length}`\n : undefined,\n throwOnError\n )\n );\n } catch (error) {\n if (throwOnError) {\n throw error;\n } else {\n console.error(error);\n }\n }\n }\n return patches;\n}\n\nfunction hasCommitMetadataBoundary(data: string): boolean {\n return data.startsWith('From ') || data.includes('\\nFrom ');\n}\n\nfunction splitFileContents(contents: string): string[] {\n const lines = splitWithNewlines(contents);\n for (let index = 0; index < lines.length; index++) {\n lines[index] = detachString(lines[index]);\n }\n return lines;\n}\n\nfunction splitWithNewlines(contents: string): string[] {\n if (contents.length === 0) {\n return [''];\n }\n\n const lines: string[] = [];\n let startIndex = 0;\n for (;;) {\n const newlineIndex = contents.indexOf('\\n', startIndex);\n if (newlineIndex === -1) {\n break;\n }\n\n lines.push(contents.slice(startIndex, newlineIndex + 1));\n startIndex = newlineIndex + 1;\n }\n\n if (startIndex < contents.length) {\n lines.push(contents.slice(startIndex));\n }\n return lines;\n}\n\nfunction parseHunkHeader(line: string): ParsedHunkHeader | undefined {\n if (!line.startsWith('@@ -')) {\n return undefined;\n }\n\n let index = 4;\n const deletionStartResult = readPositiveInteger(line, index);\n if (deletionStartResult == null) {\n return undefined;\n }\n const deletionStart = deletionStartResult.value;\n index = deletionStartResult.endIndex;\n\n let deletionCount = 1;\n if (line[index] === ',') {\n const deletionCountResult = readPositiveInteger(line, index + 1);\n if (deletionCountResult == null) {\n return undefined;\n }\n deletionCount = deletionCountResult.value;\n index = deletionCountResult.endIndex;\n }\n\n if (line[index] !== ' ' || line[index + 1] !== '+') {\n return undefined;\n }\n index += 2;\n\n const additionStartResult = readPositiveInteger(line, index);\n if (additionStartResult == null) {\n return undefined;\n }\n const additionStart = additionStartResult.value;\n index = additionStartResult.endIndex;\n\n let additionCount = 1;\n if (line[index] === ',') {\n const additionCountResult = readPositiveInteger(line, index + 1);\n if (additionCountResult == null) {\n return undefined;\n }\n additionCount = additionCountResult.value;\n index = additionCountResult.endIndex;\n }\n\n if (\n line[index] !== ' ' ||\n line[index + 1] !== '@' ||\n line[index + 2] !== '@'\n ) {\n return undefined;\n }\n\n let hunkContext: string | undefined;\n const contextStartIndex = index + 3;\n if (line[contextStartIndex] === ' ') {\n hunkContext = trimLineEnd(line.slice(contextStartIndex + 1));\n }\n\n return {\n additionCount,\n additionStart,\n deletionCount,\n deletionStart,\n hunkContext,\n };\n}\n\nfunction readPositiveInteger(\n value: string,\n startIndex: number\n): { value: number; endIndex: number } | undefined {\n let index = startIndex;\n let parsedValue = 0;\n for (; index < value.length; index++) {\n const digit = value.charCodeAt(index) - 48;\n if (digit < 0 || digit > 9) {\n break;\n }\n parsedValue = parsedValue * 10 + digit;\n }\n\n if (index === startIndex) {\n return undefined;\n }\n return { value: parsedValue, endIndex: index };\n}\n\nfunction trimLineEnd(value: string): string {\n if (value.endsWith('\\r\\n')) {\n return value.slice(0, -2);\n }\n if (value.endsWith('\\n')) {\n return value.slice(0, -1);\n }\n return value;\n}\n\nfunction isGitDiffPatch(data: string): boolean {\n return data.startsWith('diff --git') || data.includes('\\ndiff --git');\n}\n\nfunction splitAtLinePrefix(contents: string, prefix: string): string[] {\n if (contents.length === 0) {\n return [''];\n }\n\n const newlinePrefix = `\\n${prefix}`;\n const firstBoundaryIndex = contents.startsWith(prefix)\n ? 0\n : findLinePrefixIndex(contents, newlinePrefix, 0);\n if (firstBoundaryIndex === -1) {\n return [contents];\n }\n\n const parts: string[] = [];\n if (firstBoundaryIndex > 0) {\n parts.push(contents.slice(0, firstBoundaryIndex));\n }\n\n let startIndex = firstBoundaryIndex;\n for (;;) {\n const nextBoundaryIndex = findLinePrefixIndex(\n contents,\n newlinePrefix,\n startIndex + 1\n );\n if (nextBoundaryIndex === -1) {\n break;\n }\n\n parts.push(contents.slice(startIndex, nextBoundaryIndex));\n startIndex = nextBoundaryIndex;\n }\n parts.push(contents.slice(startIndex));\n return parts;\n}\n\nfunction findLinePrefixIndex(\n contents: string,\n newlinePrefix: string,\n fromIndex: number\n): number {\n const index = contents.indexOf(newlinePrefix, fromIndex);\n return index === -1 ? -1 : index + 1;\n}\n\nfunction maybeDetachOptionalString<T extends string | undefined>(value: T): T {\n return (value == null ? value : detachString(value)) as T;\n}\n\nfunction parseRawLineType(\n firstChar: string | undefined\n): Exclude<HunkLineType, 'expanded'> {\n return firstChar === ' '\n ? 'context'\n : firstChar === '\\\\'\n ? 'metadata'\n : firstChar === '+'\n ? 'addition'\n : 'deletion';\n}\n\nfunction getParsedLineContent(rawLine: string): string {\n const processedLine = rawLine.slice(1);\n return detachString(processedLine === '' ? '\\n' : processedLine);\n}\n\nfunction createContentGroup(\n type: 'change',\n deletionLineIndex: number,\n additionLineIndex: number\n): ChangeContent;\nfunction createContentGroup(\n type: 'context',\n deletionLineIndex: number,\n additionLineIndex: number\n): ContextContent;\nfunction createContentGroup(\n type: 'change' | 'context',\n deletionLineIndex: number,\n additionLineIndex: number\n): ChangeContent | ContextContent {\n if (type === 'change') {\n return {\n type: 'change',\n additions: 0,\n deletions: 0,\n additionLineIndex,\n deletionLineIndex,\n };\n }\n return {\n type: 'context',\n lines: 0,\n additionLineIndex,\n deletionLineIndex,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { HunkExpansionRegion, HunkSeparators, VirtualFileMetrics } from "../types.js";
2
+
3
+ //#region src/utils/virtualDiffLayout.d.ts
4
+ interface ExpandedRegionResult {
5
+ fromStart: number;
6
+ fromEnd: number;
7
+ rangeSize: number;
8
+ collapsedLines: number;
9
+ renderAll: boolean;
10
+ }
11
+ interface GetExpandedRegionProps {
12
+ isPartial: boolean;
13
+ rangeSize: number;
14
+ expandedHunks: Map<number, HunkExpansionRegion> | true | undefined;
15
+ hunkIndex: number;
16
+ collapsedContextThreshold: number;
17
+ }
18
+ interface HunkSeparatorLayout {
19
+ height: number;
20
+ gapBefore: number;
21
+ gapAfter: number;
22
+ totalHeight: number;
23
+ }
24
+ interface HunkSeparatorBaseProps {
25
+ type: HunkSeparators;
26
+ metrics: VirtualFileMetrics;
27
+ }
28
+ interface LeadingHunkSeparatorLayoutProps extends HunkSeparatorBaseProps {
29
+ hunkIndex: number;
30
+ hunkSpecs: string | undefined;
31
+ }
32
+ declare function getExpandedRegion({
33
+ isPartial,
34
+ rangeSize,
35
+ expandedHunks,
36
+ hunkIndex,
37
+ collapsedContextThreshold
38
+ }: GetExpandedRegionProps): ExpandedRegionResult;
39
+ declare function getHunkSeparatorHeight({
40
+ type,
41
+ metrics
42
+ }: HunkSeparatorBaseProps): number;
43
+ declare function getHunkSeparatorGap({
44
+ type,
45
+ metrics
46
+ }: HunkSeparatorBaseProps): number;
47
+ declare function hasLeadingHunkSeparator({
48
+ type,
49
+ hunkIndex,
50
+ hunkSpecs
51
+ }: Omit<LeadingHunkSeparatorLayoutProps, 'metrics'>): boolean;
52
+ declare function hasTrailingHunkSeparator(type: HunkSeparators): boolean;
53
+ declare function getLeadingHunkSeparatorLayout({
54
+ type,
55
+ metrics,
56
+ hunkIndex,
57
+ hunkSpecs
58
+ }: LeadingHunkSeparatorLayoutProps): HunkSeparatorLayout | undefined;
59
+ declare function getTrailingHunkSeparatorLayout({
60
+ type,
61
+ metrics
62
+ }: HunkSeparatorBaseProps): HunkSeparatorLayout | undefined;
63
+ //#endregion
64
+ export { ExpandedRegionResult, GetExpandedRegionProps, HunkSeparatorLayout, getExpandedRegion, getHunkSeparatorGap, getHunkSeparatorHeight, getLeadingHunkSeparatorLayout, getTrailingHunkSeparatorLayout, hasLeadingHunkSeparator, hasTrailingHunkSeparator };
65
+ //# sourceMappingURL=virtualDiffLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualDiffLayout.d.ts","names":["HunkExpansionRegion","HunkSeparators","VirtualFileMetrics","ExpandedRegionResult","GetExpandedRegionProps","Map","HunkSeparatorLayout","HunkSeparatorBaseProps","LeadingHunkSeparatorLayoutProps","getExpandedRegion","isPartial","rangeSize","expandedHunks","hunkIndex","collapsedContextThreshold","getHunkSeparatorHeight","type","metrics","getHunkSeparatorGap","hasLeadingHunkSeparator","hunkSpecs","Omit","hasTrailingHunkSeparator","getLeadingHunkSeparatorLayout","getTrailingHunkSeparatorLayout"],"sources":["../../src/utils/virtualDiffLayout.d.ts"],"sourcesContent":["import type { HunkExpansionRegion, HunkSeparators, VirtualFileMetrics } from '../types';\nexport interface ExpandedRegionResult {\n fromStart: number;\n fromEnd: number;\n rangeSize: number;\n collapsedLines: number;\n renderAll: boolean;\n}\nexport interface GetExpandedRegionProps {\n isPartial: boolean;\n rangeSize: number;\n expandedHunks: Map<number, HunkExpansionRegion> | true | undefined;\n hunkIndex: number;\n collapsedContextThreshold: number;\n}\nexport interface HunkSeparatorLayout {\n height: number;\n gapBefore: number;\n gapAfter: number;\n totalHeight: number;\n}\ninterface HunkSeparatorBaseProps {\n type: HunkSeparators;\n metrics: VirtualFileMetrics;\n}\ninterface LeadingHunkSeparatorLayoutProps extends HunkSeparatorBaseProps {\n hunkIndex: number;\n hunkSpecs: string | undefined;\n}\nexport declare function getExpandedRegion({ isPartial, rangeSize, expandedHunks, hunkIndex, collapsedContextThreshold }: GetExpandedRegionProps): ExpandedRegionResult;\nexport declare function getHunkSeparatorHeight({ type, metrics }: HunkSeparatorBaseProps): number;\nexport declare function getHunkSeparatorGap({ type, metrics }: HunkSeparatorBaseProps): number;\nexport declare function hasLeadingHunkSeparator({ type, hunkIndex, hunkSpecs }: Omit<LeadingHunkSeparatorLayoutProps, 'metrics'>): boolean;\nexport declare function hasTrailingHunkSeparator(type: HunkSeparators): boolean;\nexport declare function getLeadingHunkSeparatorLayout({ type, metrics, hunkIndex, hunkSpecs }: LeadingHunkSeparatorLayoutProps): HunkSeparatorLayout | undefined;\nexport declare function getTrailingHunkSeparatorLayout({ type, metrics }: HunkSeparatorBaseProps): HunkSeparatorLayout | undefined;\nexport {};\n//# sourceMappingURL=virtualDiffLayout.d.ts.map"],"mappings":";;;UACiBG,oBAAAA;;EAAAA,OAAAA,EAAAA,MAAAA;EAOAC,SAAAA,EAAAA,MAAAA;EAOAE,cAAAA,EAAAA,MAAmB;EAM1BC,SAAAA,EAAAA,OAAAA;AAEqB;AAMPE,UArBPL,sBAAAA,CAqBwB;EAAGM,SAAAA,EAAAA,OAAAA;EAAWC,SAAAA,EAAAA,MAAAA;EAAWC,aAAAA,EAlB/CP,GAkB+CO,CAAAA,MAAAA,EAlBnCZ,mBAkBmCY,CAAAA,GAAAA,IAAAA,GAAAA,SAAAA;EAAeC,SAAAA,EAAAA,MAAAA;EAAWC,yBAAAA,EAAAA,MAAAA;;AAAsDX,UAdjIG,mBAAAA,CAciIH;EAAoB,MAAA,EAAA,MAAA;EAC9IY,SAAAA,EAAAA,MAAAA;EAAyBC,QAAAA,EAAAA,MAAAA;EAAMC,WAAAA,EAAAA,MAAAA;;UAT7CV,sBAAAA,CAS8E;EAChEW,IAAAA,EATdjB,cASciB;EAAsBF,OAAAA,EARjCd,kBAQiCc;;UANpCR,+BAAAA,SAAwCD,sBAMaA,CAAAA;EAAsB,SAAA,EAAA,MAAA;EAC7DY,SAAAA,EAAAA,MAAAA,GAAAA,SAAuB;;AAASN,iBAHhCJ,iBAAAA,CAGgCI;EAAAA,SAAAA;EAAAA,SAAAA;EAAAA,aAAAA;EAAAA,SAAAA;EAAAA;AAAAA,CAAAA,EAHiET,sBAGjES,CAAAA,EAH0FV,oBAG1FU;AAAWO,iBAF3CL,sBAAAA,CAE2CK;EAAAA,IAAAA;EAAAA;AAAAA,CAAAA,EAFDb,sBAECa,CAAAA,EAAAA,MAAAA;AAAkBZ,iBAD7DU,mBAAAA,CAC6DV;EAAAA,IAAAA;EAAAA;AAAAA,CAAAA,EADtBD,sBACsBC,CAAAA,EAAAA,MAAAA;AAALa,iBAAxDF,uBAAAA,CAAwDE;EAAAA,IAAAA;EAAAA,SAAAA;EAAAA;AAAAA,CAAAA,EAAAA,IAAAA,CAAKb,+BAALa,EAAAA,SAAAA,CAAAA,CAAAA,EAAAA,OAAAA;AAAI,iBAC5DC,wBAAAA,CAD4D,IAAA,EAC7BrB,cAD6B,CAAA,EAAA,OAAA;AAC5DqB,iBACAC,6BAAAA,CAD+BtB;EAAAA,IAAc;EAAA,OAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EAC0BO,+BAD1B,CAAA,EAC4DF,mBAD5D,GAAA,SAAA;AAC7CiB,iBACAC,8BAAAA,CAD6B;EAAA,IAAA;EAAA;AAAA,CAAA,EACqBjB,sBADrB,CAAA,EAC8CD,mBAD9C,GAAA,SAAA"}
@@ -0,0 +1,94 @@
1
+ import { getDefaultHunkSeparatorHeight } from "./computeVirtualFileMetrics.js";
2
+
3
+ //#region src/utils/virtualDiffLayout.ts
4
+ function getExpandedRegion({ isPartial, rangeSize, expandedHunks, hunkIndex, collapsedContextThreshold }) {
5
+ const normalizedRangeSize = Math.max(rangeSize, 0);
6
+ if (normalizedRangeSize === 0 || isPartial) return {
7
+ fromStart: 0,
8
+ fromEnd: 0,
9
+ rangeSize: normalizedRangeSize,
10
+ collapsedLines: normalizedRangeSize,
11
+ renderAll: false
12
+ };
13
+ if (expandedHunks === true || normalizedRangeSize <= collapsedContextThreshold) return {
14
+ fromStart: normalizedRangeSize,
15
+ fromEnd: 0,
16
+ rangeSize: normalizedRangeSize,
17
+ collapsedLines: 0,
18
+ renderAll: true
19
+ };
20
+ const region = expandedHunks?.get(hunkIndex);
21
+ const fromStart = Math.min(Math.max(region?.fromStart ?? 0, 0), normalizedRangeSize);
22
+ const fromEnd = Math.min(Math.max(region?.fromEnd ?? 0, 0), normalizedRangeSize);
23
+ const expandedCount = fromStart + fromEnd;
24
+ const renderAll = expandedCount >= normalizedRangeSize;
25
+ return {
26
+ fromStart: renderAll ? normalizedRangeSize : fromStart,
27
+ fromEnd: renderAll ? 0 : fromEnd,
28
+ rangeSize: normalizedRangeSize,
29
+ collapsedLines: Math.max(normalizedRangeSize - expandedCount, 0),
30
+ renderAll
31
+ };
32
+ }
33
+ function getHunkSeparatorHeight({ type, metrics }) {
34
+ return metrics.hunkSeparatorHeight ?? getDefaultHunkSeparatorHeight(type);
35
+ }
36
+ function getHunkSeparatorGap({ type, metrics }) {
37
+ return type === "simple" || type === "metadata" || type === "line-info-basic" ? 0 : metrics.spacing;
38
+ }
39
+ function hasLeadingHunkSeparator({ type, hunkIndex, hunkSpecs }) {
40
+ switch (type) {
41
+ case "simple": return hunkIndex > 0;
42
+ case "metadata": return hunkSpecs != null;
43
+ case "line-info":
44
+ case "line-info-basic":
45
+ case "custom": return true;
46
+ }
47
+ }
48
+ function hasTrailingHunkSeparator(type) {
49
+ return type !== "simple" && type !== "metadata";
50
+ }
51
+ function getLeadingHunkSeparatorLayout({ type, metrics, hunkIndex, hunkSpecs }) {
52
+ if (!hasLeadingHunkSeparator({
53
+ type,
54
+ hunkIndex,
55
+ hunkSpecs
56
+ })) return;
57
+ const height = getHunkSeparatorHeight({
58
+ type,
59
+ metrics
60
+ });
61
+ const gap = getHunkSeparatorGap({
62
+ type,
63
+ metrics
64
+ });
65
+ const gapBefore = hunkIndex > 0 ? gap : 0;
66
+ const gapAfter = gap;
67
+ return {
68
+ height,
69
+ gapBefore,
70
+ gapAfter,
71
+ totalHeight: gapBefore + height + gapAfter
72
+ };
73
+ }
74
+ function getTrailingHunkSeparatorLayout({ type, metrics }) {
75
+ if (!hasTrailingHunkSeparator(type)) return;
76
+ const height = getHunkSeparatorHeight({
77
+ type,
78
+ metrics
79
+ });
80
+ const gapBefore = getHunkSeparatorGap({
81
+ type,
82
+ metrics
83
+ });
84
+ return {
85
+ height,
86
+ gapBefore,
87
+ gapAfter: 0,
88
+ totalHeight: gapBefore + height
89
+ };
90
+ }
91
+
92
+ //#endregion
93
+ export { getExpandedRegion, getHunkSeparatorGap, getHunkSeparatorHeight, getLeadingHunkSeparatorLayout, getTrailingHunkSeparatorLayout, hasLeadingHunkSeparator, hasTrailingHunkSeparator };
94
+ //# sourceMappingURL=virtualDiffLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualDiffLayout.js","names":[],"sources":["../../src/utils/virtualDiffLayout.ts"],"sourcesContent":["import type {\n HunkExpansionRegion,\n HunkSeparators,\n VirtualFileMetrics,\n} from '../types';\nimport { getDefaultHunkSeparatorHeight } from './computeVirtualFileMetrics';\n\nexport interface ExpandedRegionResult {\n fromStart: number;\n fromEnd: number;\n rangeSize: number;\n collapsedLines: number;\n renderAll: boolean;\n}\n\nexport interface GetExpandedRegionProps {\n isPartial: boolean;\n rangeSize: number;\n expandedHunks: Map<number, HunkExpansionRegion> | true | undefined;\n hunkIndex: number;\n collapsedContextThreshold: number;\n}\n\nexport interface HunkSeparatorLayout {\n height: number;\n gapBefore: number;\n gapAfter: number;\n totalHeight: number;\n}\n\ninterface HunkSeparatorBaseProps {\n type: HunkSeparators;\n metrics: VirtualFileMetrics;\n}\n\ninterface LeadingHunkSeparatorLayoutProps extends HunkSeparatorBaseProps {\n hunkIndex: number;\n hunkSpecs: string | undefined;\n}\n\n// Converts a collapsed unchanged range into the slices that should render near\n// the start and end of that range for the active hunk expansion state.\nexport function getExpandedRegion({\n isPartial,\n rangeSize,\n expandedHunks,\n hunkIndex,\n collapsedContextThreshold,\n}: GetExpandedRegionProps): ExpandedRegionResult {\n const normalizedRangeSize = Math.max(rangeSize, 0);\n if (normalizedRangeSize === 0 || isPartial) {\n return {\n fromStart: 0,\n fromEnd: 0,\n rangeSize: normalizedRangeSize,\n collapsedLines: normalizedRangeSize,\n renderAll: false,\n };\n }\n\n if (\n expandedHunks === true ||\n normalizedRangeSize <= collapsedContextThreshold\n ) {\n return {\n fromStart: normalizedRangeSize,\n fromEnd: 0,\n rangeSize: normalizedRangeSize,\n collapsedLines: 0,\n renderAll: true,\n };\n }\n\n const region = expandedHunks?.get(hunkIndex);\n const fromStart = Math.min(\n Math.max(region?.fromStart ?? 0, 0),\n normalizedRangeSize\n );\n const fromEnd = Math.min(\n Math.max(region?.fromEnd ?? 0, 0),\n normalizedRangeSize\n );\n const expandedCount = fromStart + fromEnd;\n const renderAll = expandedCount >= normalizedRangeSize;\n return {\n fromStart: renderAll ? normalizedRangeSize : fromStart,\n fromEnd: renderAll ? 0 : fromEnd,\n rangeSize: normalizedRangeSize,\n collapsedLines: Math.max(normalizedRangeSize - expandedCount, 0),\n renderAll,\n };\n}\n\nexport function getHunkSeparatorHeight({\n type,\n metrics,\n}: HunkSeparatorBaseProps): number {\n return metrics.hunkSeparatorHeight ?? getDefaultHunkSeparatorHeight(type);\n}\n\nexport function getHunkSeparatorGap({\n type,\n metrics,\n}: HunkSeparatorBaseProps): number {\n return type === 'simple' || type === 'metadata' || type === 'line-info-basic'\n ? 0\n : metrics.spacing;\n}\n\nexport function hasLeadingHunkSeparator({\n type,\n hunkIndex,\n hunkSpecs,\n}: Omit<LeadingHunkSeparatorLayoutProps, 'metrics'>): boolean {\n switch (type) {\n case 'simple':\n return hunkIndex > 0;\n case 'metadata':\n return hunkSpecs != null;\n case 'line-info':\n case 'line-info-basic':\n case 'custom':\n return true;\n }\n}\n\nexport function hasTrailingHunkSeparator(type: HunkSeparators): boolean {\n return type !== 'simple' && type !== 'metadata';\n}\n\n// Mirrors the renderer/CSS spacing rules for the separator shown before a hunk.\nexport function getLeadingHunkSeparatorLayout({\n type,\n metrics,\n hunkIndex,\n hunkSpecs,\n}: LeadingHunkSeparatorLayoutProps): HunkSeparatorLayout | undefined {\n if (!hasLeadingHunkSeparator({ type, hunkIndex, hunkSpecs })) {\n return undefined;\n }\n\n const height = getHunkSeparatorHeight({ type, metrics });\n const gap = getHunkSeparatorGap({ type, metrics });\n const gapBefore = hunkIndex > 0 ? gap : 0;\n const gapAfter = gap;\n return {\n height,\n gapBefore,\n gapAfter,\n totalHeight: gapBefore + height + gapAfter,\n };\n}\n\n// Mirrors the renderer/CSS spacing rules for the separator shown after the last\n// hunk when trailing unchanged context is collapsed.\nexport function getTrailingHunkSeparatorLayout({\n type,\n metrics,\n}: HunkSeparatorBaseProps): HunkSeparatorLayout | undefined {\n if (!hasTrailingHunkSeparator(type)) {\n return undefined;\n }\n\n const height = getHunkSeparatorHeight({ type, metrics });\n const gapBefore = getHunkSeparatorGap({ type, metrics });\n return {\n height,\n gapBefore,\n gapAfter: 0,\n totalHeight: gapBefore + height,\n };\n}\n"],"mappings":";;;AA0CA,SAAgB,kBAAkB,EAChC,WACA,WACA,eACA,WACA,6BAC+C;CAC/C,MAAM,sBAAsB,KAAK,IAAI,WAAW,EAAE;AAClD,KAAI,wBAAwB,KAAK,UAC/B,QAAO;EACL,WAAW;EACX,SAAS;EACT,WAAW;EACX,gBAAgB;EAChB,WAAW;EACZ;AAGH,KACE,kBAAkB,QAClB,uBAAuB,0BAEvB,QAAO;EACL,WAAW;EACX,SAAS;EACT,WAAW;EACX,gBAAgB;EAChB,WAAW;EACZ;CAGH,MAAM,SAAS,eAAe,IAAI,UAAU;CAC5C,MAAM,YAAY,KAAK,IACrB,KAAK,IAAI,QAAQ,aAAa,GAAG,EAAE,EACnC,oBACD;CACD,MAAM,UAAU,KAAK,IACnB,KAAK,IAAI,QAAQ,WAAW,GAAG,EAAE,EACjC,oBACD;CACD,MAAM,gBAAgB,YAAY;CAClC,MAAM,YAAY,iBAAiB;AACnC,QAAO;EACL,WAAW,YAAY,sBAAsB;EAC7C,SAAS,YAAY,IAAI;EACzB,WAAW;EACX,gBAAgB,KAAK,IAAI,sBAAsB,eAAe,EAAE;EAChE;EACD;;AAGH,SAAgB,uBAAuB,EACrC,MACA,WACiC;AACjC,QAAO,QAAQ,uBAAuB,8BAA8B,KAAK;;AAG3E,SAAgB,oBAAoB,EAClC,MACA,WACiC;AACjC,QAAO,SAAS,YAAY,SAAS,cAAc,SAAS,oBACxD,IACA,QAAQ;;AAGd,SAAgB,wBAAwB,EACtC,MACA,WACA,aAC4D;AAC5D,SAAQ,MAAR;EACE,KAAK,SACH,QAAO,YAAY;EACrB,KAAK,WACH,QAAO,aAAa;EACtB,KAAK;EACL,KAAK;EACL,KAAK,SACH,QAAO;;;AAIb,SAAgB,yBAAyB,MAA+B;AACtE,QAAO,SAAS,YAAY,SAAS;;AAIvC,SAAgB,8BAA8B,EAC5C,MACA,SACA,WACA,aACmE;AACnE,KAAI,CAAC,wBAAwB;EAAE;EAAM;EAAW;EAAW,CAAC,CAC1D;CAGF,MAAM,SAAS,uBAAuB;EAAE;EAAM;EAAS,CAAC;CACxD,MAAM,MAAM,oBAAoB;EAAE;EAAM;EAAS,CAAC;CAClD,MAAM,YAAY,YAAY,IAAI,MAAM;CACxC,MAAM,WAAW;AACjB,QAAO;EACL;EACA;EACA;EACA,aAAa,YAAY,SAAS;EACnC;;AAKH,SAAgB,+BAA+B,EAC7C,MACA,WAC0D;AAC1D,KAAI,CAAC,yBAAyB,KAAK,CACjC;CAGF,MAAM,SAAS,uBAAuB;EAAE;EAAM;EAAS,CAAC;CACxD,MAAM,YAAY,oBAAoB;EAAE;EAAM;EAAS,CAAC;AACxD,QAAO;EACL;EACA;EACA,UAAU;EACV,aAAa,YAAY;EAC1B"}