@pierre/diffs 1.3.0-beta.5 → 1.3.0-beta.6

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 (623) hide show
  1. package/README.md +9 -9
  2. package/dist/components/CodeView.d.ts +10 -11
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +8 -8
  5. package/dist/components/CodeView.js.map +1 -1
  6. package/dist/components/File.d.ts +4 -5
  7. package/dist/components/File.d.ts.map +1 -1
  8. package/dist/components/File.js +32 -17
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +19 -19
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +84 -54
  13. package/dist/components/FileDiff.js.map +1 -1
  14. package/dist/components/FileStream.d.ts +0 -1
  15. package/dist/components/FileStream.d.ts.map +1 -1
  16. package/dist/components/FileStream.js +4 -4
  17. package/dist/components/FileStream.js.map +1 -1
  18. package/dist/components/UnresolvedFile.d.ts +1 -2
  19. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  20. package/dist/components/UnresolvedFile.js +3 -3
  21. package/dist/components/UnresolvedFile.js.map +1 -1
  22. package/dist/components/VirtualizedFile.d.ts +0 -1
  23. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  24. package/dist/components/VirtualizedFile.js +19 -18
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +2 -3
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +17 -18
  29. package/dist/components/VirtualizedFileDiff.js.map +1 -1
  30. package/dist/components/Virtualizer.d.ts +1 -1
  31. package/dist/components/Virtualizer.d.ts.map +1 -1
  32. package/dist/components/Virtualizer.js +23 -24
  33. package/dist/components/Virtualizer.js.map +1 -1
  34. package/dist/components/VirtulizerDevelopment.d.ts.map +1 -1
  35. package/dist/components/web-components.d.ts.map +1 -1
  36. package/dist/components/web-components.js +2 -3
  37. package/dist/components/web-components.js.map +1 -1
  38. package/dist/constants.d.ts +3 -2
  39. package/dist/constants.d.ts.map +1 -1
  40. package/dist/constants.js +3 -2
  41. package/dist/constants.js.map +1 -1
  42. package/dist/editor/command.d.ts +2 -1
  43. package/dist/editor/command.d.ts.map +1 -1
  44. package/dist/editor/command.js +7 -3
  45. package/dist/editor/command.js.map +1 -1
  46. package/dist/editor/editStack.d.ts +7 -1
  47. package/dist/editor/editStack.d.ts.map +1 -1
  48. package/dist/editor/editStack.js +3 -3
  49. package/dist/editor/editStack.js.map +1 -1
  50. package/dist/editor/editor.d.ts +26 -2
  51. package/dist/editor/editor.d.ts.map +1 -1
  52. package/dist/editor/editor.js +551 -252
  53. package/dist/editor/editor.js.map +1 -1
  54. package/dist/editor/editor2.js +3 -3
  55. package/dist/editor/editor2.js.map +1 -1
  56. package/dist/editor/index.js +1 -2
  57. package/dist/editor/lineAnnotations.d.ts.map +1 -1
  58. package/dist/editor/lineAnnotations.js +2 -3
  59. package/dist/editor/lineAnnotations.js.map +1 -1
  60. package/dist/editor/marker.d.ts +2 -1
  61. package/dist/editor/marker.d.ts.map +1 -1
  62. package/dist/editor/marker.js +28 -11
  63. package/dist/editor/marker.js.map +1 -1
  64. package/dist/editor/pieceTable.d.ts +4 -2
  65. package/dist/editor/pieceTable.d.ts.map +1 -1
  66. package/dist/editor/pieceTable.js +138 -128
  67. package/dist/editor/pieceTable.js.map +1 -1
  68. package/dist/editor/platform.d.ts +8 -1
  69. package/dist/editor/platform.d.ts.map +1 -1
  70. package/dist/editor/platform.js +16 -5
  71. package/dist/editor/platform.js.map +1 -1
  72. package/dist/editor/searchPanel.d.ts +1 -0
  73. package/dist/editor/searchPanel.d.ts.map +1 -1
  74. package/dist/editor/searchPanel.js +75 -62
  75. package/dist/editor/searchPanel.js.map +1 -1
  76. package/dist/editor/selection.d.ts +41 -4
  77. package/dist/editor/selection.d.ts.map +1 -1
  78. package/dist/editor/selection.js +423 -83
  79. package/dist/editor/selection.js.map +1 -1
  80. package/dist/editor/selectionAction.d.ts +4 -5
  81. package/dist/editor/selectionAction.d.ts.map +1 -1
  82. package/dist/editor/selectionAction.js +14 -64
  83. package/dist/editor/selectionAction.js.map +1 -1
  84. package/dist/editor/sprite.d.ts +2 -2
  85. package/dist/editor/sprite.d.ts.map +1 -1
  86. package/dist/editor/sprite.js +7 -14
  87. package/dist/editor/sprite.js.map +1 -1
  88. package/dist/editor/textDocument.d.ts +5 -4
  89. package/dist/editor/textDocument.d.ts.map +1 -1
  90. package/dist/editor/textDocument.js +26 -15
  91. package/dist/editor/textDocument.js.map +1 -1
  92. package/dist/editor/textMeasure.d.ts +36 -3
  93. package/dist/editor/textMeasure.d.ts.map +1 -1
  94. package/dist/editor/textMeasure.js +79 -10
  95. package/dist/editor/textMeasure.js.map +1 -1
  96. package/dist/editor/tokenzier.d.ts +1 -0
  97. package/dist/editor/tokenzier.d.ts.map +1 -1
  98. package/dist/editor/tokenzier.js +16 -13
  99. package/dist/editor/tokenzier.js.map +1 -1
  100. package/dist/editor/utils.d.ts +2 -1
  101. package/dist/editor/utils.d.ts.map +1 -1
  102. package/dist/editor/utils.js +6 -3
  103. package/dist/editor/utils.js.map +1 -1
  104. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  105. package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
  106. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  107. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
  108. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  109. package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
  110. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  111. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  112. package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
  113. package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
  114. package/dist/highlighter/languages/constants.d.ts +0 -1
  115. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  116. package/dist/highlighter/languages/constants.js +1 -1
  117. package/dist/highlighter/languages/constants.js.map +1 -1
  118. package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
  119. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  120. package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
  121. package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
  122. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
  123. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  124. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
  125. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  126. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  127. package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
  128. package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
  129. package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
  130. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
  131. package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
  132. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
  133. package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
  134. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  135. package/dist/highlighter/languages/resolveLanguage.js +4 -5
  136. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  137. package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
  138. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  139. package/dist/highlighter/languages/resolveLanguages.js +1 -2
  140. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  141. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  142. package/dist/highlighter/shared_highlighter.js +3 -4
  143. package/dist/highlighter/shared_highlighter.js.map +1 -1
  144. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  145. package/dist/highlighter/themes/areThemesAttached.js +1 -2
  146. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  147. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  148. package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
  149. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  150. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  151. package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
  152. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  153. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  154. package/dist/highlighter/themes/constants.js +1 -1
  155. package/dist/highlighter/themes/constants.js.map +1 -1
  156. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  157. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
  158. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  159. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  160. package/dist/highlighter/themes/getResolvedThemes.js +1 -2
  161. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  162. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  163. package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
  164. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  165. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  166. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
  167. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  168. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  169. package/dist/highlighter/themes/registerCustomTheme.js +1 -2
  170. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  171. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  172. package/dist/highlighter/themes/resolveTheme.js +1 -2
  173. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  174. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  175. package/dist/highlighter/themes/resolveThemes.js +1 -2
  176. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  177. package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
  178. package/dist/highlighter/themes/themeResolution.js +1 -2
  179. package/dist/highlighter/themes/themeResolution.js.map +1 -1
  180. package/dist/highlighter/themes/themeResolver.d.ts +2 -2
  181. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  182. package/dist/highlighter/themes/themeResolver.js +1 -2
  183. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  184. package/dist/index.d.ts +10 -10
  185. package/dist/index.js +2 -3
  186. package/dist/managers/InteractionManager.d.ts +7 -0
  187. package/dist/managers/InteractionManager.d.ts.map +1 -1
  188. package/dist/managers/InteractionManager.js +25 -3
  189. package/dist/managers/InteractionManager.js.map +1 -1
  190. package/dist/managers/ResizeManager.d.ts.map +1 -1
  191. package/dist/managers/ResizeManager.js +1 -1
  192. package/dist/managers/ResizeManager.js.map +1 -1
  193. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  194. package/dist/managers/ScrollSyncManager.js +1 -1
  195. package/dist/managers/ScrollSyncManager.js.map +1 -1
  196. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  197. package/dist/managers/UniversalRenderingManager.js +2 -2
  198. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  199. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
  200. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
  201. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
  202. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
  203. package/dist/react/CodeView.d.ts +1 -1
  204. package/dist/react/CodeView.d.ts.map +1 -1
  205. package/dist/react/CodeView.js +17 -16
  206. package/dist/react/CodeView.js.map +1 -1
  207. package/dist/react/EditorContext.d.ts +0 -1
  208. package/dist/react/EditorContext.d.ts.map +1 -1
  209. package/dist/react/EditorContext.js +2 -5
  210. package/dist/react/EditorContext.js.map +1 -1
  211. package/dist/react/File.d.ts +1 -0
  212. package/dist/react/File.d.ts.map +1 -1
  213. package/dist/react/File.js +4 -6
  214. package/dist/react/File.js.map +1 -1
  215. package/dist/react/FileDiff.d.ts +1 -0
  216. package/dist/react/FileDiff.d.ts.map +1 -1
  217. package/dist/react/FileDiff.js +4 -6
  218. package/dist/react/FileDiff.js.map +1 -1
  219. package/dist/react/MultiFileDiff.d.ts +1 -0
  220. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  221. package/dist/react/MultiFileDiff.js +4 -6
  222. package/dist/react/MultiFileDiff.js.map +1 -1
  223. package/dist/react/PatchDiff.d.ts +1 -0
  224. package/dist/react/PatchDiff.d.ts.map +1 -1
  225. package/dist/react/PatchDiff.js +4 -6
  226. package/dist/react/PatchDiff.js.map +1 -1
  227. package/dist/react/UnresolvedFile.d.ts +2 -1
  228. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  229. package/dist/react/UnresolvedFile.js +4 -6
  230. package/dist/react/UnresolvedFile.js.map +1 -1
  231. package/dist/react/Virtualizer.d.ts.map +1 -1
  232. package/dist/react/Virtualizer.js +2 -5
  233. package/dist/react/Virtualizer.js.map +1 -1
  234. package/dist/react/WorkerPoolContext.d.ts +0 -1
  235. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  236. package/dist/react/WorkerPoolContext.js +2 -5
  237. package/dist/react/WorkerPoolContext.js.map +1 -1
  238. package/dist/react/constants.d.ts.map +1 -1
  239. package/dist/react/constants.js +1 -1
  240. package/dist/react/constants.js.map +1 -1
  241. package/dist/react/index.d.ts +2 -2
  242. package/dist/react/index.js +1 -2
  243. package/dist/react/jsx.d.ts +0 -2
  244. package/dist/react/jsx.d.ts.map +1 -1
  245. package/dist/react/types.d.ts +2 -0
  246. package/dist/react/types.d.ts.map +1 -1
  247. package/dist/react/utils/renderDiffChildren.d.ts +2 -0
  248. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  249. package/dist/react/utils/renderDiffChildren.js +18 -11
  250. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  251. package/dist/react/utils/renderFileChildren.d.ts +2 -0
  252. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  253. package/dist/react/utils/renderFileChildren.js +18 -11
  254. package/dist/react/utils/renderFileChildren.js.map +1 -1
  255. package/dist/react/utils/templateRender.d.ts.map +1 -1
  256. package/dist/react/utils/templateRender.js +1 -2
  257. package/dist/react/utils/templateRender.js.map +1 -1
  258. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  259. package/dist/react/utils/useFileDiffInstance.js +1 -3
  260. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  261. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  262. package/dist/react/utils/useFileInstance.js +1 -2
  263. package/dist/react/utils/useFileInstance.js.map +1 -1
  264. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  265. package/dist/react/utils/useStableCallback.js +1 -2
  266. package/dist/react/utils/useStableCallback.js.map +1 -1
  267. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
  268. package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
  269. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  270. package/dist/renderers/DiffHunksRenderer.d.ts +2 -3
  271. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  272. package/dist/renderers/DiffHunksRenderer.js +30 -24
  273. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  274. package/dist/renderers/FileRenderer.d.ts +1 -3
  275. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  276. package/dist/renderers/FileRenderer.js +14 -11
  277. package/dist/renderers/FileRenderer.js.map +1 -1
  278. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
  279. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
  280. package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
  281. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
  282. package/dist/shiki-stream/index.js +1 -2
  283. package/dist/shiki-stream/stream.d.ts +0 -1
  284. package/dist/shiki-stream/stream.d.ts.map +1 -1
  285. package/dist/shiki-stream/stream.js +1 -2
  286. package/dist/shiki-stream/stream.js.map +1 -1
  287. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  288. package/dist/shiki-stream/tokenizer.js +1 -1
  289. package/dist/shiki-stream/tokenizer.js.map +1 -1
  290. package/dist/shiki-stream/types.d.ts +0 -1
  291. package/dist/shiki-stream/types.d.ts.map +1 -1
  292. package/dist/sprite.d.ts.map +1 -1
  293. package/dist/sprite.js +1 -1
  294. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  295. package/dist/ssr/FileDiffReact.js +5 -8
  296. package/dist/ssr/FileDiffReact.js.map +1 -1
  297. package/dist/ssr/index.d.ts +2 -2
  298. package/dist/ssr/index.js +1 -2
  299. package/dist/ssr/preloadDiffs.d.ts +1 -1
  300. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  301. package/dist/ssr/preloadDiffs.js +1 -2
  302. package/dist/ssr/preloadDiffs.js.map +1 -1
  303. package/dist/ssr/preloadFile.d.ts.map +1 -1
  304. package/dist/ssr/preloadFile.js +1 -2
  305. package/dist/ssr/preloadFile.js.map +1 -1
  306. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  307. package/dist/ssr/preloadPatchFile.js +2 -3
  308. package/dist/ssr/preloadPatchFile.js.map +1 -1
  309. package/dist/ssr/renderHTML.d.ts +1 -1
  310. package/dist/ssr/renderHTML.d.ts.map +1 -1
  311. package/dist/ssr/renderHTML.js +1 -2
  312. package/dist/ssr/renderHTML.js.map +1 -1
  313. package/dist/string-import.d.ts +4 -0
  314. package/dist/string-import.d.ts.map +1 -1
  315. package/dist/style.js +3 -3
  316. package/dist/style.js.map +1 -1
  317. package/dist/types.d.ts +11 -5
  318. package/dist/types.d.ts.map +1 -1
  319. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  320. package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
  321. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  322. package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
  323. package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
  324. package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
  325. package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
  326. package/dist/utils/areDiffTargetsEqual.js +1 -1
  327. package/dist/utils/areDiffTargetsEqual.js.map +1 -1
  328. package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
  329. package/dist/utils/areFileRenderOptionsEqual.js +1 -2
  330. package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
  331. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  332. package/dist/utils/areFilesEqual.js +1 -1
  333. package/dist/utils/areFilesEqual.js.map +1 -1
  334. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  335. package/dist/utils/areHunkDataEqual.js +1 -1
  336. package/dist/utils/areHunkDataEqual.js.map +1 -1
  337. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  338. package/dist/utils/areLineAnnotationsEqual.js +1 -1
  339. package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
  340. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  341. package/dist/utils/areManagedSnapshotsEqual.js +1 -1
  342. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  343. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
  344. package/dist/utils/areMergeConflictActionsEqual.js +1 -1
  345. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
  346. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  347. package/dist/utils/areObjectsEqual.js +1 -1
  348. package/dist/utils/areObjectsEqual.js.map +1 -1
  349. package/dist/utils/areOptionsEqual.d.ts +0 -2
  350. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  351. package/dist/utils/areOptionsEqual.js +1 -2
  352. package/dist/utils/areOptionsEqual.js.map +1 -1
  353. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  354. package/dist/utils/arePrePropertiesEqual.js +1 -1
  355. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  356. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  357. package/dist/utils/areRenderRangesEqual.js +1 -1
  358. package/dist/utils/areRenderRangesEqual.js.map +1 -1
  359. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
  360. package/dist/utils/areSelectionPointsEqual.js +1 -1
  361. package/dist/utils/areSelectionPointsEqual.js.map +1 -1
  362. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  363. package/dist/utils/areSelectionsEqual.js +1 -1
  364. package/dist/utils/areSelectionsEqual.js.map +1 -1
  365. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  366. package/dist/utils/areThemesEqual.js +1 -1
  367. package/dist/utils/areThemesEqual.js.map +1 -1
  368. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  369. package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
  370. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
  371. package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
  372. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  373. package/dist/utils/areWorkerStatsEqual.js +1 -1
  374. package/dist/utils/areWorkerStatsEqual.js.map +1 -1
  375. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  376. package/dist/utils/cleanLastNewline.js +1 -1
  377. package/dist/utils/cleanLastNewline.js.map +1 -1
  378. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  379. package/dist/utils/computeEstimatedDiffHeights.js +1 -2
  380. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  381. package/dist/utils/computeFileOffsets.d.ts +9 -1
  382. package/dist/utils/computeFileOffsets.d.ts.map +1 -1
  383. package/dist/utils/computeFileOffsets.js +20 -2
  384. package/dist/utils/computeFileOffsets.js.map +1 -1
  385. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  386. package/dist/utils/computeVirtualFileMetrics.js +1 -2
  387. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  388. package/dist/utils/createAnnotationElement.d.ts +1 -1
  389. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  390. package/dist/utils/createAnnotationElement.js +1 -2
  391. package/dist/utils/createAnnotationElement.js.map +1 -1
  392. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  393. package/dist/utils/createAnnotationWrapperNode.js +1 -1
  394. package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
  395. package/dist/utils/createContentColumn.d.ts +1 -1
  396. package/dist/utils/createContentColumn.d.ts.map +1 -1
  397. package/dist/utils/createContentColumn.js +1 -2
  398. package/dist/utils/createContentColumn.js.map +1 -1
  399. package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
  400. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  401. package/dist/utils/createEmptyRowBuffer.js +1 -2
  402. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  403. package/dist/utils/createFileHeaderElement.d.ts +1 -1
  404. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  405. package/dist/utils/createFileHeaderElement.js +6 -3
  406. package/dist/utils/createFileHeaderElement.js.map +1 -1
  407. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
  408. package/dist/utils/createGutterUtilityContentNode.js +1 -1
  409. package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
  410. package/dist/utils/createGutterUtilityElement.d.ts +1 -1
  411. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
  412. package/dist/utils/createGutterUtilityElement.js +1 -2
  413. package/dist/utils/createGutterUtilityElement.js.map +1 -1
  414. package/dist/utils/createNoNewlineElement.d.ts +1 -1
  415. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  416. package/dist/utils/createNoNewlineElement.js +1 -2
  417. package/dist/utils/createNoNewlineElement.js.map +1 -1
  418. package/dist/utils/createPreElement.d.ts +1 -1
  419. package/dist/utils/createPreElement.d.ts.map +1 -1
  420. package/dist/utils/createPreElement.js +1 -2
  421. package/dist/utils/createPreElement.js.map +1 -1
  422. package/dist/utils/createRowNodes.d.ts.map +1 -1
  423. package/dist/utils/createRowNodes.js +1 -1
  424. package/dist/utils/createRowNodes.js.map +1 -1
  425. package/dist/utils/createSeparator.d.ts +1 -1
  426. package/dist/utils/createSeparator.d.ts.map +1 -1
  427. package/dist/utils/createSeparator.js +1 -2
  428. package/dist/utils/createSeparator.js.map +1 -1
  429. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  430. package/dist/utils/createSpanNodeFromToken.js +1 -2
  431. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  432. package/dist/utils/createStyleElement.d.ts +1 -1
  433. package/dist/utils/createStyleElement.d.ts.map +1 -1
  434. package/dist/utils/createStyleElement.js +1 -2
  435. package/dist/utils/createStyleElement.js.map +1 -1
  436. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  437. package/dist/utils/createTransformerWithState.js +1 -2
  438. package/dist/utils/createTransformerWithState.js.map +1 -1
  439. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  440. package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
  441. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
  442. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  443. package/dist/utils/createWindowFromScrollPosition.js +5 -5
  444. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  445. package/dist/utils/cssWrappers.d.ts.map +1 -1
  446. package/dist/utils/cssWrappers.js +2 -3
  447. package/dist/utils/cssWrappers.js.map +1 -1
  448. package/dist/utils/detachString.d.ts.map +1 -1
  449. package/dist/utils/detachString.js +1 -1
  450. package/dist/utils/detachString.js.map +1 -1
  451. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  452. package/dist/utils/diffAcceptRejectHunk.js +1 -2
  453. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  454. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  455. package/dist/utils/formatCSSVariablePrefix.js +1 -1
  456. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  457. package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  458. package/dist/utils/getDiffHunksRendererOptions.js +1 -1
  459. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  460. package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  461. package/dist/utils/getFileRendererOptions.js +1 -1
  462. package/dist/utils/getFileRendererOptions.js.map +1 -1
  463. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  464. package/dist/utils/getFiletypeFromFileName.js +1 -1
  465. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  466. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  467. package/dist/utils/getHighlighterOptions.js +1 -2
  468. package/dist/utils/getHighlighterOptions.js.map +1 -1
  469. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  470. package/dist/utils/getHighlighterThemeStyles.js +1 -2
  471. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  472. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  473. package/dist/utils/getHunkSeparatorSlotName.js +1 -1
  474. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  475. package/dist/utils/getIconForType.d.ts.map +1 -1
  476. package/dist/utils/getIconForType.js +1 -1
  477. package/dist/utils/getIconForType.js.map +1 -1
  478. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  479. package/dist/utils/getLineAnnotationName.js +1 -1
  480. package/dist/utils/getLineAnnotationName.js.map +1 -1
  481. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  482. package/dist/utils/getLineEndingType.js +1 -1
  483. package/dist/utils/getLineEndingType.js.map +1 -1
  484. package/dist/utils/getLineNodes.d.ts +1 -1
  485. package/dist/utils/getLineNodes.d.ts.map +1 -1
  486. package/dist/utils/getLineNodes.js +1 -1
  487. package/dist/utils/getLineNodes.js.map +1 -1
  488. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
  489. package/dist/utils/getMergeConflictActionSlotName.js +1 -1
  490. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
  491. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
  492. package/dist/utils/getMergeConflictLineTypes.js +1 -2
  493. package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
  494. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  495. package/dist/utils/getOrCreateCodeNode.js +1 -1
  496. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  497. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  498. package/dist/utils/getSingularPatch.js +1 -2
  499. package/dist/utils/getSingularPatch.js.map +1 -1
  500. package/dist/utils/getThemes.d.ts.map +1 -1
  501. package/dist/utils/getThemes.js +1 -2
  502. package/dist/utils/getThemes.js.map +1 -1
  503. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  504. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  505. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  506. package/dist/utils/hast_utils.d.ts +1 -1
  507. package/dist/utils/hast_utils.d.ts.map +1 -1
  508. package/dist/utils/hast_utils.js +1 -1
  509. package/dist/utils/hast_utils.js.map +1 -1
  510. package/dist/utils/hostTheme.d.ts.map +1 -1
  511. package/dist/utils/hostTheme.js +1 -2
  512. package/dist/utils/hostTheme.js.map +1 -1
  513. package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
  514. package/dist/utils/includesFileAnnotations.js +5 -5
  515. package/dist/utils/includesFileAnnotations.js.map +1 -1
  516. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  517. package/dist/utils/isDefaultRenderRange.js +1 -1
  518. package/dist/utils/isDefaultRenderRange.js.map +1 -1
  519. package/dist/utils/isDiffPlainText.d.ts.map +1 -1
  520. package/dist/utils/isDiffPlainText.js +1 -2
  521. package/dist/utils/isDiffPlainText.js.map +1 -1
  522. package/dist/utils/isFilePlainText.d.ts.map +1 -1
  523. package/dist/utils/isFilePlainText.js +1 -2
  524. package/dist/utils/isFilePlainText.js.map +1 -1
  525. package/dist/utils/isStyleNode.d.ts.map +1 -1
  526. package/dist/utils/isStyleNode.js +1 -1
  527. package/dist/utils/isStyleNode.js.map +1 -1
  528. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  529. package/dist/utils/isWorkerContext.js +1 -1
  530. package/dist/utils/isWorkerContext.js.map +1 -1
  531. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  532. package/dist/utils/iterateOverDiff.js +44 -45
  533. package/dist/utils/iterateOverDiff.js.map +1 -1
  534. package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
  535. package/dist/utils/normalizeDiffResolution.js +1 -1
  536. package/dist/utils/normalizeDiffResolution.js.map +1 -1
  537. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  538. package/dist/utils/parseDiffDecorations.js +1 -2
  539. package/dist/utils/parseDiffDecorations.js.map +1 -1
  540. package/dist/utils/parseDiffFromFile.d.ts +0 -1
  541. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  542. package/dist/utils/parseDiffFromFile.js +1 -2
  543. package/dist/utils/parseDiffFromFile.js.map +1 -1
  544. package/dist/utils/parseLineType.d.ts.map +1 -1
  545. package/dist/utils/parseLineType.js +1 -1
  546. package/dist/utils/parseLineType.js.map +1 -1
  547. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  548. package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
  549. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  550. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  551. package/dist/utils/parsePatchFiles.js +6 -7
  552. package/dist/utils/parsePatchFiles.js.map +1 -1
  553. package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
  554. package/dist/utils/prefersReducedMotion.js +1 -1
  555. package/dist/utils/prefersReducedMotion.js.map +1 -1
  556. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  557. package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
  558. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
  559. package/dist/utils/processLine.d.ts +1 -1
  560. package/dist/utils/processLine.d.ts.map +1 -1
  561. package/dist/utils/processLine.js +1 -2
  562. package/dist/utils/processLine.js.map +1 -1
  563. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  564. package/dist/utils/renderDiffWithHighlighter.js +4 -5
  565. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  566. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  567. package/dist/utils/renderFileWithHighlighter.js +1 -2
  568. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  569. package/dist/utils/resolveConflict.d.ts.map +1 -1
  570. package/dist/utils/resolveConflict.js +1 -2
  571. package/dist/utils/resolveConflict.js.map +1 -1
  572. package/dist/utils/resolveRegion.d.ts.map +1 -1
  573. package/dist/utils/resolveRegion.js +1 -1
  574. package/dist/utils/resolveRegion.js.map +1 -1
  575. package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
  576. package/dist/utils/roundToDevicePixel.js +1 -1
  577. package/dist/utils/roundToDevicePixel.js.map +1 -1
  578. package/dist/utils/scrollbarGutter.d.ts.map +1 -1
  579. package/dist/utils/scrollbarGutter.js +1 -2
  580. package/dist/utils/scrollbarGutter.js.map +1 -1
  581. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  582. package/dist/utils/setLanguageOverride.js +1 -1
  583. package/dist/utils/setLanguageOverride.js.map +1 -1
  584. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  585. package/dist/utils/setWrapperNodeProps.js +1 -1
  586. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  587. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  588. package/dist/utils/shouldUseTokenTransformer.js +1 -1
  589. package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  590. package/dist/utils/splitFileContents.d.ts.map +1 -1
  591. package/dist/utils/splitFileContents.js +1 -2
  592. package/dist/utils/splitFileContents.js.map +1 -1
  593. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  594. package/dist/utils/trimPatchContext.js +1 -2
  595. package/dist/utils/trimPatchContext.js.map +1 -1
  596. package/dist/utils/updateDiffHunks.d.ts +2 -1
  597. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  598. package/dist/utils/updateDiffHunks.js +22 -3
  599. package/dist/utils/updateDiffHunks.js.map +1 -1
  600. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  601. package/dist/utils/virtualDiffLayout.js +1 -2
  602. package/dist/utils/virtualDiffLayout.js.map +1 -1
  603. package/dist/utils/wrapTokenFragments.d.ts +1 -1
  604. package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
  605. package/dist/utils/wrapTokenFragments.js +1 -2
  606. package/dist/utils/wrapTokenFragments.js.map +1 -1
  607. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  608. package/dist/worker/WorkerPoolManager.js +5 -5
  609. package/dist/worker/WorkerPoolManager.js.map +1 -1
  610. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  611. package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
  612. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  613. package/dist/worker/index.js +1 -2
  614. package/dist/worker/types.d.ts.map +1 -1
  615. package/dist/worker/wasm-B9ZqxnKj.js +8 -0
  616. package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
  617. package/dist/worker/worker-portable.js +2779 -6403
  618. package/dist/worker/worker-portable.js.map +1 -1
  619. package/dist/worker/worker.js +89 -123
  620. package/dist/worker/worker.js.map +1 -1
  621. package/package.json +13 -14
  622. package/dist/worker/wasm-qE0LgnY3.js +0 -10
  623. package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
@@ -1,5 +1,5 @@
1
+ import { endsWithLineBreak } from "./utils.js";
1
2
  import { applyDocumentChangeToLineAnnotations } from "./lineAnnotations.js";
2
-
3
3
  //#region src/editor/selection.ts
4
4
  const DirectionBackward = -1;
5
5
  const DirectionNone = 0;
@@ -7,7 +7,7 @@ const DirectionForward = 1;
7
7
  /**
8
8
  * Converts a selection from a web selection to an editor selection.
9
9
  */
10
- function convertSelection(range, direction = DirectionNone) {
10
+ function convertSelection(range, direction = 0) {
11
11
  const start = boundaryToPosition(range.startContainer, range.startOffset);
12
12
  const end = boundaryToPosition(range.endContainer, range.endOffset);
13
13
  if (start === null || end === null) return;
@@ -85,7 +85,7 @@ function mapCursorMove(textDocument, selections, shortcut) {
85
85
  const indent = getLeadingSpaces(textDocument.getLineText(line));
86
86
  character = character === indent ? 0 : indent;
87
87
  } else character = shortcut === "start" ? 0 : textDocument.getLineLength(line);
88
- if (selection.direction === DirectionBackward) line = selection.start.line;
88
+ if (selection.direction === -1) line = selection.start.line;
89
89
  else line = selection.end.line;
90
90
  } else if (shortcut === "up") line = Math.max(0, line - 1);
91
91
  else if (shortcut === "down") line = Math.min(Math.max(lineCount - 1, 0), line + 1);
@@ -93,19 +93,15 @@ function mapCursorMove(textDocument, selections, shortcut) {
93
93
  const lineLength = textDocument.getLineLength(line);
94
94
  character = Math.min(character, lineLength);
95
95
  if (shortcut === "left") {
96
- character--;
97
- if (character < 0) if (line === 0) character = 0;
98
- else {
99
- line = Math.max(0, line - 1);
96
+ if (character > 0) character = stepCharacterByGrapheme(textDocument, line, character, false);
97
+ else if (line > 0) {
98
+ line = line - 1;
100
99
  character = textDocument.getLineLength(line);
101
100
  }
102
- } else {
103
- character++;
104
- if (character > lineLength) if (line === lineCount - 1) character--;
105
- else {
106
- line = Math.min(Math.max(lineCount - 1, 0), line + 1);
107
- character = 0;
108
- }
101
+ } else if (character < lineLength) character = stepCharacterByGrapheme(textDocument, line, character, true);
102
+ else if (line < lineCount - 1) {
103
+ line = line + 1;
104
+ character = 0;
109
105
  }
110
106
  }
111
107
  const pos = {
@@ -115,7 +111,7 @@ function mapCursorMove(textDocument, selections, shortcut) {
115
111
  return {
116
112
  start: pos,
117
113
  end: pos,
118
- direction: DirectionNone
114
+ direction: 0
119
115
  };
120
116
  });
121
117
  }
@@ -124,20 +120,19 @@ function mapCursorMove(textDocument, selections, shortcut) {
124
120
  */
125
121
  function mapSelectionShift(textDocument, selections, shortcut) {
126
122
  return selections.map((selection) => {
127
- const [anchorOffset, focusOffset] = getSelectionAnchorAndFocusOffsets(textDocument, selection);
128
- const focusPosition = textDocument.positionAt(focusOffset);
123
+ const focusPosition = selection.direction === -1 ? selection.start : selection.end;
129
124
  const [movedFocusSelection] = mapCursorMove(textDocument, [{
130
125
  start: focusPosition,
131
126
  end: focusPosition,
132
- direction: DirectionNone
127
+ direction: 0
133
128
  }], shortcut);
134
- return createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, textDocument.offsetAt(movedFocusSelection.start));
129
+ return createSelectionFrom(selection, movedFocusSelection);
135
130
  });
136
131
  }
137
132
  /**
138
133
  * Applies a text change to the given text document
139
134
  */
140
- function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2) {
135
+ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2, undoBoundary = false) {
141
136
  if (selections[selections.length - 1] === void 0) return { nextSelections: [] };
142
137
  const selectionPositions = [];
143
138
  for (const selection of selections) selectionPositions.push(selection.start, selection.end);
@@ -202,7 +197,7 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
202
197
  };
203
198
  }
204
199
  finalizeMergedGroup();
205
- const change = textDocument.applyResolvedEdits(edits, true, selections);
200
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
206
201
  const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsets.map((offsets) => {
207
202
  if (offsets === void 0) throw new Error("Missing next selection offsets");
208
203
  return offsets;
@@ -218,9 +213,27 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
218
213
  };
219
214
  }
220
215
  /**
216
+ * Returns the next anchor/focus offsets after replacing a selection range.
217
+ * When the inserted text still contains the original selection (auto-surround),
218
+ * the inner range is reselected to match VS Code/CodeMirror behavior.
219
+ */
220
+ function getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText) {
221
+ const insertStart = entry.start + offsetDelta;
222
+ const insertEnd = insertStart + newText.length;
223
+ if (entry.end - entry.start > 0) {
224
+ const originalText = textDocument.getText().slice(entry.start, entry.end);
225
+ const preservedOffset = newText.indexOf(originalText);
226
+ if (preservedOffset !== -1 && preservedOffset + originalText.length <= newText.length) {
227
+ const rangeStart = insertStart + preservedOffset;
228
+ return [rangeStart, rangeStart + originalText.length];
229
+ }
230
+ }
231
+ return [insertEnd, insertEnd];
232
+ }
233
+ /**
221
234
  * Applies a text replace to multiple selections.
222
235
  */
223
- function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations) {
236
+ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations, undoBoundary = false) {
224
237
  if (selections.length !== texts.length) throw new Error("Selection text replacements must match the selection count");
225
238
  const selectionPositions = [];
226
239
  for (const selection of selections) selectionPositions.push(selection.start, selection.end);
@@ -247,12 +260,12 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
247
260
  });
248
261
  const allDeletes = texts.every((text) => text === "");
249
262
  let edits;
250
- const nextSelectionOffsets = Array.from({ length: selections.length });
263
+ const nextSelectionOffsetPairs = Array.from({ length: selections.length });
251
264
  if (allDeletes) {
252
265
  edits = [];
253
266
  let hasEffect = false;
254
267
  for (const entry of ordered) {
255
- nextSelectionOffsets[entry.index] = entry.end;
268
+ nextSelectionOffsetPairs[entry.index] = [entry.end, entry.end];
256
269
  if (entry.start >= entry.end) continue;
257
270
  hasEffect = true;
258
271
  const last = edits[edits.length - 1];
@@ -282,7 +295,7 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
282
295
  break;
283
296
  }
284
297
  if (next === caret) next += delta;
285
- nextSelectionOffsets[entry.index] = next;
298
+ nextSelectionOffsetPairs[entry.index] = [next, next];
286
299
  }
287
300
  } else {
288
301
  edits = [];
@@ -297,12 +310,15 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
297
310
  end: entry.end,
298
311
  text: newText
299
312
  });
300
- nextSelectionOffsets[entry.index] = entry.start + offsetDelta + newText.length;
313
+ nextSelectionOffsetPairs[entry.index] = getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText);
301
314
  offsetDelta += newText.length - (entry.end - entry.start);
302
315
  }
303
316
  }
304
- const change = textDocument.applyResolvedEdits(edits, true, selections);
305
- const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsets.map((offset) => [offset, offset]));
317
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
318
+ const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsetPairs.map((offsets) => {
319
+ if (offsets === void 0) throw new Error("Missing next selection offsets");
320
+ return offsets;
321
+ }));
306
322
  textDocument.setLastUndoSelectionsAfter(nextSelections);
307
323
  if (change !== void 0 && lineAnnotations !== void 0) {
308
324
  const nextLineAnnotations = applyDocumentChangeToLineAnnotations(change, lineAnnotations);
@@ -313,6 +329,47 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
313
329
  change
314
330
  };
315
331
  }
332
+ const AUTO_SURROUND_CLOSE_CHARS = /* @__PURE__ */ new Map([
333
+ ["'", "'"],
334
+ ["\"", "\""],
335
+ ["`", "`"],
336
+ ["{", "}"],
337
+ ["[", "]"],
338
+ ["<", ">"],
339
+ ["(", ")"]
340
+ ]);
341
+ const AUTO_SURROUND_QUOTE_CHARS = /* @__PURE__ */ new Set([
342
+ "'",
343
+ "\"",
344
+ "`"
345
+ ]);
346
+ const AUTO_SURROUND_BRACKET_CHARS = /* @__PURE__ */ new Set([
347
+ "{",
348
+ "[",
349
+ "(",
350
+ "<"
351
+ ]);
352
+ function shouldAutoSurroundChar(autoSurround, char) {
353
+ if (autoSurround === "never") return false;
354
+ if (autoSurround === "brackets") return AUTO_SURROUND_BRACKET_CHARS.has(char);
355
+ if (autoSurround === "quotes") return AUTO_SURROUND_QUOTE_CHARS.has(char);
356
+ return true;
357
+ }
358
+ /**
359
+ * Returns per-selection replacement text when typing a surround character over
360
+ * non-collapsed selections, matching VS Code auto-surround behavior.
361
+ */
362
+ function getAutoSurroundReplacementTexts(textDocument, selections, char, autoSurround) {
363
+ if (char.length !== 1 || selections.length === 0) return;
364
+ const closeChar = AUTO_SURROUND_CLOSE_CHARS.get(char);
365
+ if (closeChar === void 0 || !shouldAutoSurroundChar(autoSurround, char)) return;
366
+ const replacements = [];
367
+ for (const selection of selections) {
368
+ if (isCollapsedSelection(selection)) return;
369
+ replacements.push(char + textDocument.getText(selection) + closeChar);
370
+ }
371
+ return replacements;
372
+ }
316
373
  /**
317
374
  * Swaps the two characters adjacent to a collapsed selection, matching browser
318
375
  * insertTranspose (Ctrl+T) behavior.
@@ -329,36 +386,48 @@ function applyTransposeToSelections(textDocument, selections, lineAnnotations) {
329
386
  }
330
387
  const { line, character } = selection.start;
331
388
  const offset = anchor;
332
- const lineLength = textDocument.getLineLength(line);
389
+ const lineText = textDocument.getLineText(line);
390
+ const lineLength = lineText.length;
391
+ const lineStart = offset - character;
392
+ const graphemeStarts = getLineGraphemeStarts(lineText);
333
393
  let edit;
334
394
  if (character > 0 && character < lineLength) {
395
+ const before = findClusterBreak(lineText, character, false, graphemeStarts);
396
+ const after = findClusterBreak(lineText, character, true, graphemeStarts);
335
397
  edit = {
336
- start: offset - 1,
337
- end: offset + 1,
338
- text: text[offset] + text[offset - 1]
398
+ start: lineStart + before,
399
+ end: lineStart + after,
400
+ text: lineText.slice(character, after) + lineText.slice(before, character)
339
401
  };
340
- nextOffsetPairs.push([offset + 1, offset + 1]);
341
- } else if (character === lineLength && lineLength >= 2) {
402
+ nextOffsetPairs.push([lineStart + after, lineStart + after]);
403
+ } else if (character === lineLength && graphemeStarts.length >= 2) {
404
+ const lastStart = graphemeStarts[graphemeStarts.length - 1];
405
+ const secondLastStart = graphemeStarts[graphemeStarts.length - 2];
342
406
  edit = {
343
- start: offset - 2,
407
+ start: lineStart + secondLastStart,
344
408
  end: offset,
345
- text: text[offset - 1] + text[offset - 2]
409
+ text: lineText.slice(lastStart, lineLength) + lineText.slice(secondLastStart, lastStart)
346
410
  };
347
411
  nextOffsetPairs.push([offset, offset]);
348
412
  } else if (character === 0 && line > 0 && lineLength > 0) {
349
413
  const prevLine = line - 1;
350
- const prevLength = textDocument.getLineLength(prevLine);
414
+ const prevLineText = textDocument.getLineText(prevLine);
415
+ const prevLength = prevLineText.length;
351
416
  const prevEnd = textDocument.offsetAt({
352
417
  line: prevLine,
353
418
  character: prevLength
354
419
  });
355
- const prevStart = prevLength > 0 ? prevEnd - 1 : prevEnd;
420
+ const prevGraphemeStart = prevLength > 0 ? findClusterBreak(prevLineText, prevLength, false, getLineGraphemeStarts(prevLineText)) : prevLength;
421
+ const firstEnd = findClusterBreak(lineText, 0, true, graphemeStarts);
422
+ const prevStart = prevEnd - (prevLength - prevGraphemeStart);
423
+ const newText = lineText.slice(0, firstEnd) + text.slice(prevEnd, offset) + prevLineText.slice(prevGraphemeStart, prevLength);
356
424
  edit = {
357
425
  start: prevStart,
358
- end: offset + 1,
359
- text: text[offset] + text.slice(prevEnd, offset) + text.slice(prevStart, prevEnd)
426
+ end: offset + firstEnd,
427
+ text: newText
360
428
  };
361
- nextOffsetPairs.push([offset + 1, offset + 1]);
429
+ const caret = prevStart + newText.length;
430
+ nextOffsetPairs.push([caret, caret]);
362
431
  } else {
363
432
  nextOffsetPairs.push([anchor, focus]);
364
433
  continue;
@@ -391,7 +460,7 @@ function applyDeleteHardLineForwardToSelections(textDocument, selections, lineAn
391
460
  return {
392
461
  start: range.start,
393
462
  end: range.end,
394
- direction: DirectionNone
463
+ direction: 0
395
464
  };
396
465
  });
397
466
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -405,7 +474,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
405
474
  if (!isCollapsedSelection(selection)) return {
406
475
  start: selection.start,
407
476
  end: selection.end,
408
- direction: DirectionNone
477
+ direction: 0
409
478
  };
410
479
  const caret = getCaretPosition(selection);
411
480
  const { line, character } = caret;
@@ -419,12 +488,12 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
419
488
  line,
420
489
  character
421
490
  },
422
- direction: DirectionNone
491
+ direction: 0
423
492
  };
424
493
  if (line === 0) return {
425
494
  start: caret,
426
495
  end: caret,
427
- direction: DirectionNone
496
+ direction: 0
428
497
  };
429
498
  const prevLineLength = textDocument.getLineLength(line - 1);
430
499
  return {
@@ -436,7 +505,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
436
505
  line,
437
506
  character: 0
438
507
  },
439
- direction: DirectionNone
508
+ direction: 0
440
509
  };
441
510
  });
442
511
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -451,7 +520,77 @@ function applyDeleteWordBackwardToSelections(textDocument, selections, lineAnnot
451
520
  return {
452
521
  start,
453
522
  end,
454
- direction: DirectionNone
523
+ direction: 0
524
+ };
525
+ });
526
+ return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
527
+ }
528
+ /**
529
+ * Resolves the document range deleted by Backspace or Delete at a collapsed
530
+ * caret. Non-collapsed selections delete their selected text instead.
531
+ */
532
+ function resolveDeleteCharacterRange(textDocument, selection, forward) {
533
+ if (!isCollapsedSelection(selection)) return [selection.start, selection.end];
534
+ const caret = getCaretPosition(selection);
535
+ let { line, character } = caret;
536
+ const lineLength = textDocument.getLineLength(line);
537
+ const lineCount = textDocument.lineCount;
538
+ character = Math.min(character, lineLength);
539
+ if (forward) {
540
+ if (character < lineLength) return [{
541
+ line,
542
+ character
543
+ }, {
544
+ line,
545
+ character: stepCharacterByGrapheme(textDocument, line, character, true)
546
+ }];
547
+ if (line < lineCount - 1) return [{
548
+ line,
549
+ character: lineLength
550
+ }, {
551
+ line: line + 1,
552
+ character: 0
553
+ }];
554
+ return [caret, caret];
555
+ }
556
+ if (character > 0) return [{
557
+ line,
558
+ character: stepCharacterByGrapheme(textDocument, line, character, false)
559
+ }, {
560
+ line,
561
+ character
562
+ }];
563
+ if (line > 0) {
564
+ const prevLineLength = textDocument.getLineLength(line - 1);
565
+ return [{
566
+ line: line - 1,
567
+ character: prevLineLength
568
+ }, {
569
+ line,
570
+ character: 0
571
+ }];
572
+ }
573
+ return [caret, caret];
574
+ }
575
+ /**
576
+ * Deletes one grapheme (or selected text) at each selection.
577
+ */
578
+ function applyDeleteCharacterToSelections(textDocument, selections, forward, lineAnnotations, tabSize = 2) {
579
+ const deleteSelections = selections.map((selection) => {
580
+ let [start, end] = resolveDeleteCharacterRange(textDocument, selection, forward);
581
+ if (!forward && isCollapsedSelection(selection)) {
582
+ const normalized = normalizeLeadingIndentForChange(textDocument, {
583
+ start: textDocument.offsetAt(start),
584
+ end: textDocument.offsetAt(end),
585
+ text: ""
586
+ }, tabSize);
587
+ start = textDocument.positionAt(normalized.start);
588
+ end = textDocument.positionAt(normalized.end);
589
+ }
590
+ return {
591
+ start,
592
+ end,
593
+ direction: 0
455
594
  };
456
595
  });
457
596
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -467,7 +606,7 @@ function isCollapsedSelection(selection) {
467
606
  */
468
607
  function getCaretPosition(selection) {
469
608
  const { start, end, direction } = selection;
470
- return direction === DirectionBackward ? start : end;
609
+ return direction === -1 ? start : end;
471
610
  }
472
611
  /**
473
612
  * Checks if a line is editable.
@@ -497,7 +636,7 @@ function comparePosition(a, b) {
497
636
  * Creates a selection from anchor and focus offsets.
498
637
  */
499
638
  function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, focusOffset) {
500
- const direction = anchorOffset === focusOffset ? DirectionNone : anchorOffset < focusOffset ? DirectionForward : DirectionBackward;
639
+ const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
501
640
  const start = Math.min(anchorOffset, focusOffset);
502
641
  const end = Math.max(anchorOffset, focusOffset);
503
642
  return {
@@ -507,10 +646,44 @@ function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, fo
507
646
  };
508
647
  }
509
648
  /**
649
+ * Maps a single offset from the pre-edit document into the post-edit document.
650
+ * `edits` are resolved edits in pre-edit offsets, sorted ascending and
651
+ * non-overlapping. An offset at or after an edit's start shifts to the end of
652
+ * that edit's replacement (right gravity), so text inserted at the caret pushes
653
+ * the caret past it; an offset strictly before an edit is only shifted by the
654
+ * net length change of the edits that precede it.
655
+ */
656
+ function remapOffsetThroughEdits(offset, edits) {
657
+ let delta = 0;
658
+ for (const edit of edits) {
659
+ if (offset < edit.start) break;
660
+ if (offset >= edit.end) delta += edit.text.length - (edit.end - edit.start);
661
+ else return edit.start + delta + edit.text.length;
662
+ }
663
+ return offset + delta;
664
+ }
665
+ /**
666
+ * Re-anchors selections after a batch of text edits has been applied, so the
667
+ * caret keeps pointing at the same logical location in the changed buffer.
668
+ *
669
+ * `selectionOffsets` (one `[start, end]` pair per selection) and `edits` are
670
+ * measured in the PRE-edit document; the returned selections are built from
671
+ * `textDocument`, which must already reflect the applied edits. Selection
672
+ * direction is preserved by remapping each edge and re-deriving anchor/focus.
673
+ */
674
+ function remapSelectionsAfterEdits(textDocument, selections, selectionOffsets, edits) {
675
+ return selections.map((selection, index) => {
676
+ const [startOffset, endOffset] = selectionOffsets[index];
677
+ const nextStart = remapOffsetThroughEdits(startOffset, edits);
678
+ const nextEnd = remapOffsetThroughEdits(endOffset, edits);
679
+ return createSelectionFromAnchorAndFocusOffsets(textDocument, selection.direction === -1 ? nextEnd : nextStart, selection.direction === -1 ? nextStart : nextEnd);
680
+ });
681
+ }
682
+ /**
510
683
  * Creates a selection from a anchor and focus selection.
511
684
  */
512
685
  function createSelectionFrom(anchorSelection, focusSelection) {
513
- const anchor = anchorSelection.direction === DirectionBackward ? anchorSelection.end : anchorSelection.start;
686
+ const anchor = anchorSelection.direction === -1 ? anchorSelection.end : anchorSelection.start;
514
687
  const currentStartOrder = comparePosition(anchor, focusSelection.start);
515
688
  const currentEndOrder = comparePosition(anchor, focusSelection.end);
516
689
  let focus = focusSelection.end;
@@ -521,7 +694,7 @@ function createSelectionFrom(anchorSelection, focusSelection) {
521
694
  return {
522
695
  start: anchorVsFocus <= 0 ? anchor : focus,
523
696
  end: anchorVsFocus <= 0 ? focus : anchor,
524
- direction: anchorVsFocus === 0 ? DirectionNone : anchorVsFocus < 0 ? DirectionForward : DirectionBackward
697
+ direction: anchorVsFocus === 0 ? 0 : anchorVsFocus < 0 ? 1 : -1
525
698
  };
526
699
  }
527
700
  /**
@@ -534,22 +707,22 @@ function extendSelection(original, target) {
534
707
  if (leftExtended && !rightExtended) return {
535
708
  start: target.start,
536
709
  end: original.end,
537
- direction: DirectionBackward
710
+ direction: -1
538
711
  };
539
712
  if (rightExtended && !leftExtended) return {
540
713
  start: original.start,
541
714
  end: target.end,
542
- direction: DirectionForward
715
+ direction: 1
543
716
  };
544
- if (original.direction === DirectionBackward) return {
717
+ if (original.direction === -1) return {
545
718
  start: target.start,
546
719
  end: original.end,
547
- direction: comparePosition(target.start, original.end) === 0 ? DirectionNone : DirectionBackward
720
+ direction: comparePosition(target.start, original.end) === 0 ? 0 : -1
548
721
  };
549
722
  return {
550
723
  start: original.start,
551
724
  end: target.end,
552
- direction: comparePosition(original.start, target.end) === 0 ? DirectionNone : DirectionForward
725
+ direction: comparePosition(original.start, target.end) === 0 ? 0 : 1
553
726
  };
554
727
  }
555
728
  /**
@@ -622,7 +795,7 @@ function getDocumentFullSelection(textDocument) {
622
795
  line: lastLine,
623
796
  character: textDocument.getLineLength(lastLine)
624
797
  },
625
- direction: DirectionForward
798
+ direction: 1
626
799
  };
627
800
  }
628
801
  /**
@@ -637,21 +810,162 @@ function getDocumentBoundarySelection(textDocument, atEnd) {
637
810
  return {
638
811
  start,
639
812
  end: start,
640
- direction: DirectionForward
813
+ direction: 1
641
814
  };
642
815
  }
643
816
  /**
644
- * Get the text of the selections for the given text document.
817
+ * Resolves the document offset range each selection contributes to the
818
+ * clipboard, ordered by position. A collapsed selection contributes its whole
819
+ * logical line including the trailing line break; the final line has no
820
+ * trailing break to include. A ranged selection contributes the selected text.
821
+ */
822
+ function resolveClipboardRegions(textDocument, selections) {
823
+ return selections.map((selection) => {
824
+ if (isCollapsedSelection(selection)) {
825
+ const line = selection.start.line;
826
+ return {
827
+ start: textDocument.offsetAt({
828
+ line,
829
+ character: 0
830
+ }),
831
+ end: line < textDocument.lineCount - 1 ? textDocument.offsetAt({
832
+ line: line + 1,
833
+ character: 0
834
+ }) : textDocument.offsetAt({
835
+ line,
836
+ character: textDocument.getLineLength(line)
837
+ })
838
+ };
839
+ }
840
+ const start = textDocument.offsetAt(selection.start);
841
+ const end = textDocument.offsetAt(selection.end);
842
+ return start <= end ? {
843
+ start,
844
+ end
845
+ } : {
846
+ start: end,
847
+ end: start
848
+ };
849
+ }).sort((a, b) => {
850
+ const startOrder = a.start - b.start;
851
+ return startOrder !== 0 ? startOrder : a.end - b.end;
852
+ });
853
+ }
854
+ /**
855
+ * Get the clipboard text of the selections for the given text document. Used by
856
+ * both copy and cut so the two stay in sync. Overlapping regions (e.g. several
857
+ * carets on one line) are merged so the same text is never emitted twice, and a
858
+ * line-ending separator is inserted only between regions that aren't already
859
+ * contiguous in the document.
645
860
  */
646
861
  function getSelectionText(textDocument, selections) {
647
- return [...selections].sort((a, b) => {
648
- const startOrder = comparePosition(a.start, b.start);
862
+ const regions = resolveClipboardRegions(textDocument, selections);
863
+ const eol = textDocument.eol;
864
+ let result = "";
865
+ let prevEnd = -1;
866
+ for (const region of regions) {
867
+ if (region.end <= region.start) continue;
868
+ if (region.start <= prevEnd) {
869
+ if (region.end > prevEnd) {
870
+ result += textDocument.getTextSlice(prevEnd, region.end);
871
+ prevEnd = region.end;
872
+ }
873
+ continue;
874
+ }
875
+ if (result.length > 0 && !endsWithLineBreak(result)) result += eol;
876
+ result += textDocument.getTextSlice(region.start, region.end);
877
+ prevEnd = region.end;
878
+ }
879
+ return result;
880
+ }
881
+ function resolveSelectionCutEdit(textDocument, selection) {
882
+ if (isCollapsedSelection(selection)) return resolveCollapsedSelectionCutEdit(textDocument, selection);
883
+ const [start, end] = comparePosition(selection.start, selection.end) <= 0 ? [selection.start, selection.end] : [selection.end, selection.start];
884
+ return {
885
+ start: textDocument.offsetAt(start),
886
+ end: textDocument.offsetAt(end),
887
+ text: ""
888
+ };
889
+ }
890
+ function resolveCollapsedSelectionCutEdit(textDocument, selection) {
891
+ const line = selection.start.line;
892
+ const lineStart = textDocument.offsetAt({
893
+ line,
894
+ character: 0
895
+ });
896
+ const lineEnd = textDocument.offsetAt({
897
+ line,
898
+ character: textDocument.getLineLength(line)
899
+ });
900
+ if (line < textDocument.lineCount - 1) return {
901
+ start: lineStart,
902
+ end: textDocument.offsetAt({
903
+ line: line + 1,
904
+ character: 0
905
+ }),
906
+ text: ""
907
+ };
908
+ if (line > 0) return {
909
+ start: textDocument.offsetAt({
910
+ line: line - 1,
911
+ character: textDocument.getLineLength(line - 1)
912
+ }),
913
+ end: lineEnd,
914
+ text: ""
915
+ };
916
+ return {
917
+ start: lineStart,
918
+ end: lineEnd,
919
+ text: ""
920
+ };
921
+ }
922
+ function mergeCutEdits(orderedCuts) {
923
+ const edits = [];
924
+ for (const { edit } of orderedCuts) {
925
+ if (edit.start >= edit.end) continue;
926
+ const last = edits.at(-1);
927
+ if (last !== void 0 && edit.start <= last.end) edits[edits.length - 1] = {
928
+ start: last.start,
929
+ end: Math.max(last.end, edit.end),
930
+ text: ""
931
+ };
932
+ else edits.push(edit);
933
+ }
934
+ return edits;
935
+ }
936
+ function mapCutSelectionOffsets(orderedCuts, edits) {
937
+ const nextOffsets = Array.from({ length: orderedCuts.length });
938
+ let editIndex = 0;
939
+ let offsetDelta = 0;
940
+ for (const cut of orderedCuts) {
941
+ while (editIndex < edits.length && cut.edit.start > edits[editIndex].end) {
942
+ const edit = edits[editIndex];
943
+ offsetDelta -= edit.end - edit.start;
944
+ editIndex++;
945
+ }
946
+ const edit = edits[editIndex];
947
+ if (edit !== void 0 && cut.edit.start >= edit.start && cut.edit.start <= edit.end) nextOffsets[cut.index] = edit.start + offsetDelta;
948
+ else nextOffsets[cut.index] = cut.edit.start + offsetDelta;
949
+ }
950
+ return nextOffsets;
951
+ }
952
+ function resolveSelectionCut(textDocument, selections) {
953
+ const orderedCuts = [...selections.map((selection, index) => ({
954
+ index,
955
+ edit: resolveSelectionCutEdit(textDocument, selection)
956
+ }))].sort((a, b) => {
957
+ const startOrder = a.edit.start - b.edit.start;
649
958
  if (startOrder !== 0) return startOrder;
650
- return comparePosition(a.end, b.end);
651
- }).map((selection) => {
652
- if (isCollapsedSelection(selection)) return textDocument.getLineText(selection.start.line, false);
653
- return textDocument.getText(selection);
654
- }).join("\n");
959
+ const endOrder = a.edit.end - b.edit.end;
960
+ if (endOrder !== 0) return endOrder;
961
+ return a.index - b.index;
962
+ });
963
+ const edits = mergeCutEdits(orderedCuts);
964
+ return {
965
+ text: getSelectionText(textDocument, selections),
966
+ edits,
967
+ nextSelectionOffsets: mapCutSelectionOffsets(orderedCuts, edits)
968
+ };
655
969
  }
656
970
  /**
657
971
  * Get the anchor node and offset for a selection.
@@ -703,7 +1017,7 @@ function expandCollapsedSelectionToWord(textDocument, selection) {
703
1017
  line,
704
1018
  character: span.end
705
1019
  },
706
- direction: DirectionForward
1020
+ direction: 1
707
1021
  };
708
1022
  }
709
1023
  function expandCollapsedLineWord(lineText, character) {
@@ -734,9 +1048,7 @@ function resolveDeleteWordBackwardRange(textDocument, selection) {
734
1048
  }];
735
1049
  }
736
1050
  const lineText = textDocument.getLineText(line);
737
- const graphemeStarts = [0];
738
- const segmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
739
- for (const segment of segmenter.segment(lineText)) if (segment.index > 0) graphemeStarts.push(segment.index);
1051
+ const graphemeStarts = getLineGraphemeStarts(lineText);
740
1052
  let pos = head;
741
1053
  let match;
742
1054
  while (pos > 0) {
@@ -766,8 +1078,36 @@ function findClusterBreak(text, pos, forward, graphemeStarts) {
766
1078
  }
767
1079
  return 0;
768
1080
  }
1081
+ const graphemeSegmenter = new Intl.Segmenter(void 0, { granularity: "grapheme" });
1082
+ function getLineGraphemeStarts(lineText) {
1083
+ const graphemeStarts = [0];
1084
+ for (const segment of graphemeSegmenter.segment(lineText)) if (segment.index > 0) graphemeStarts.push(segment.index);
1085
+ return graphemeStarts;
1086
+ }
1087
+ function stepCharacterByGrapheme(textDocument, line, character, forward) {
1088
+ const lineLength = textDocument.getLineLength(line);
1089
+ if (forward) {
1090
+ if (character >= lineLength) return lineLength;
1091
+ const lineStart = textDocument.offsetAt({
1092
+ line,
1093
+ character: 0
1094
+ });
1095
+ const suffix = textDocument.getTextSlice(lineStart + character, lineStart + lineLength);
1096
+ for (const segment of graphemeSegmenter.segment(suffix)) return character + segment.segment.length;
1097
+ return lineLength;
1098
+ }
1099
+ if (character <= 0) return 0;
1100
+ const lineStart = textDocument.offsetAt({
1101
+ line,
1102
+ character: 0
1103
+ });
1104
+ const prefix = textDocument.getTextSlice(lineStart, lineStart + character);
1105
+ let prevStart = 0;
1106
+ for (const segment of graphemeSegmenter.segment(prefix)) prevStart = segment.index;
1107
+ return prevStart;
1108
+ }
769
1109
  function getSelectionAnchorAndFocusOffsets(textDocument, selection) {
770
- const isBackward = selection.direction === DirectionBackward;
1110
+ const isBackward = selection.direction === -1;
771
1111
  return [textDocument.offsetAt(isBackward ? selection.end : selection.start), textDocument.offsetAt(getCaretPosition(selection))];
772
1112
  }
773
1113
  function resolveDeleteHardLineForwardRange(textDocument, selection) {
@@ -809,7 +1149,7 @@ function resolveDeleteHardLineForwardRange(textDocument, selection) {
809
1149
  };
810
1150
  }
811
1151
  function expandSingleNewlineInsert(textDocument, insertText, insertStartOffset) {
812
- if (insertText !== "\n" && insertText !== "\r\n") return insertText;
1152
+ if (insertText !== "\n" && insertText !== "\r" && insertText !== "\r\n") return insertText;
813
1153
  const line = textDocument.positionAt(insertStartOffset).line;
814
1154
  const lineText = textDocument.getLineText(line);
815
1155
  const indentLen = getLeadingSpaces(lineText);
@@ -829,7 +1169,7 @@ function createSelectionsFromOffsetPairs(textDocument, offsetPairs) {
829
1169
  for (const [anchorOffset, focusOffset] of offsetPairs) normalizedOffsets.push(Math.min(anchorOffset, focusOffset), Math.max(anchorOffset, focusOffset));
830
1170
  const positions = textDocument.positionsAt(normalizedOffsets);
831
1171
  return offsetPairs.map(([anchorOffset, focusOffset], index) => {
832
- const direction = anchorOffset === focusOffset ? DirectionNone : anchorOffset < focusOffset ? DirectionForward : DirectionBackward;
1172
+ const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
833
1173
  return {
834
1174
  start: positions[index * 2],
835
1175
  end: positions[index * 2 + 1],
@@ -985,10 +1325,10 @@ function isInside(token, node) {
985
1325
  }
986
1326
  function offsetBefore(line, node) {
987
1327
  if (node.parentElement === line) {
988
- let offset$1 = 0;
1328
+ let offset = 0;
989
1329
  const index = Array.prototype.indexOf.call(line.childNodes, node);
990
- for (let i = 0; i < index; i++) offset$1 = getLineChildEnd(line.childNodes[i]);
991
- return offset$1;
1330
+ for (let i = 0; i < index; i++) offset = getLineChildEnd(line.childNodes[i]);
1331
+ return offset;
992
1332
  }
993
1333
  for (const token of collectTokens(line)) if (isInside(token, node)) return getCharacterIndex(token) + (node.nodeType === 3 ? textLengthBefore(token, node) : 0);
994
1334
  let offset = 0;
@@ -1018,10 +1358,10 @@ function getLineChildEnd(child, textOffsetInChild) {
1018
1358
  if (parent === null) return 0;
1019
1359
  const token = findTokenSpan(parent);
1020
1360
  if (token === null) return 0;
1021
- const base$1 = getCharacterIndex(token);
1022
- if (base$1 === void 0) return 0;
1361
+ const base = getCharacterIndex(token);
1362
+ if (base === void 0) return 0;
1023
1363
  const length = textOffsetInChild === void 0 ? getTextOffset(child.textContent, child.textContent?.length ?? 0) : getTextOffset(child.textContent, textOffsetInChild);
1024
- return base$1 + textLengthBefore(token, child) + length;
1364
+ return base + textLengthBefore(token, child) + length;
1025
1365
  }
1026
1366
  if (child.nodeType !== 1) return 0;
1027
1367
  const el = child;
@@ -1033,8 +1373,8 @@ function getLineChildEnd(child, textOffsetInChild) {
1033
1373
  return end;
1034
1374
  }
1035
1375
  function getLineIndex(el) {
1036
- const { line } = el.dataset;
1037
- if (line !== void 0) {
1376
+ const { line, lineType } = el.dataset;
1377
+ if (line !== void 0 && lineType !== "change-deletion") {
1038
1378
  const lineNumber = parseInt(line, 10);
1039
1379
  if (!Number.isNaN(lineNumber)) return lineNumber - 1;
1040
1380
  }
@@ -1051,7 +1391,7 @@ function getTextOffset(text, offset) {
1051
1391
  const lineBreakIndex = value.search(/[\r\n]/);
1052
1392
  return Math.min(offset, lineBreakIndex === -1 ? value.length : lineBreakIndex);
1053
1393
  }
1054
-
1055
1394
  //#endregion
1056
- export { DirectionBackward, DirectionForward, DirectionNone, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, resolveIndentEdits, selectionIntersects };
1395
+ export { DirectionBackward, DirectionForward, DirectionNone, applyDeleteCharacterToSelections, applyDeleteHardLineForwardToSelections, applyDeleteSoftLineBackwardToSelections, applyDeleteWordBackwardToSelections, applyTextChangeToSelections, applyTextReplaceToSelections, applyTransposeToSelections, comparePosition, convertSelection, createSelectionFrom, createSelectionFromAnchorAndFocusOffsets, expandCollapsedSelectionToWord, extendSelection, extendSelections, findNexMatch, getAutoSurroundReplacementTexts, getCaretPosition, getDocumentBoundarySelection, getDocumentFullSelection, getSelectionAnchor, getSelectionText, isCollapsedSelection, isLineEditable, mapCursorMove, mapSelectionShift, mergeOverlappingSelections, remapSelectionsAfterEdits, resolveDeleteCharacterRange, resolveIndentEdits, resolveSelectionCut, selectionIntersects };
1396
+
1057
1397
  //# sourceMappingURL=selection.js.map