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

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 (643) hide show
  1. package/README.md +9 -9
  2. package/dist/components/CodeView.d.ts +13 -11
  3. package/dist/components/CodeView.d.ts.map +1 -1
  4. package/dist/components/CodeView.js +53 -14
  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 +37 -19
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +49 -36
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +173 -75
  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 +3 -3
  19. package/dist/components/UnresolvedFile.d.ts.map +1 -1
  20. package/dist/components/UnresolvedFile.js +7 -5
  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 +22 -25
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +12 -7
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +192 -64
  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 +28 -4
  51. package/dist/editor/editor.d.ts.map +1 -1
  52. package/dist/editor/editor.js +669 -313
  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 +42 -5
  77. package/dist/editor/selection.d.ts.map +1 -1
  78. package/dist/editor/selection.js +504 -114
  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 +104 -17
  95. package/dist/editor/textMeasure.js.map +1 -1
  96. package/dist/editor/tokenzier.d.ts +3 -0
  97. package/dist/editor/tokenzier.d.ts.map +1 -1
  98. package/dist/editor/tokenzier.js +27 -16
  99. package/dist/editor/tokenzier.js.map +1 -1
  100. package/dist/editor/utils.d.ts +4 -1
  101. package/dist/editor/utils.d.ts.map +1 -1
  102. package/dist/editor/utils.js +19 -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 +12 -10
  185. package/dist/index.js +4 -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 -4
  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 +4 -4
  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 +15 -18
  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 +52 -33
  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 +12 -11
  300. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  301. package/dist/ssr/preloadDiffs.js +15 -8
  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 +67 -7
  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 +2 -2
  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/awaitWithTimeout.d.ts +5 -0
  376. package/dist/utils/awaitWithTimeout.d.ts.map +1 -0
  377. package/dist/utils/awaitWithTimeout.js +15 -0
  378. package/dist/utils/awaitWithTimeout.js.map +1 -0
  379. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  380. package/dist/utils/cleanLastNewline.js +1 -1
  381. package/dist/utils/cleanLastNewline.js.map +1 -1
  382. package/dist/utils/cloneFileDiffMetadata.d.ts +7 -0
  383. package/dist/utils/cloneFileDiffMetadata.d.ts.map +1 -0
  384. package/dist/utils/cloneFileDiffMetadata.js +16 -0
  385. package/dist/utils/cloneFileDiffMetadata.js.map +1 -0
  386. package/dist/utils/computeEstimatedDiffHeights.d.ts +3 -1
  387. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  388. package/dist/utils/computeEstimatedDiffHeights.js +9 -3
  389. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  390. package/dist/utils/computeFileOffsets.d.ts +9 -1
  391. package/dist/utils/computeFileOffsets.d.ts.map +1 -1
  392. package/dist/utils/computeFileOffsets.js +20 -2
  393. package/dist/utils/computeFileOffsets.js.map +1 -1
  394. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  395. package/dist/utils/computeVirtualFileMetrics.js +1 -2
  396. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  397. package/dist/utils/createAnnotationElement.d.ts +1 -1
  398. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  399. package/dist/utils/createAnnotationElement.js +1 -2
  400. package/dist/utils/createAnnotationElement.js.map +1 -1
  401. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  402. package/dist/utils/createAnnotationWrapperNode.js +1 -1
  403. package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
  404. package/dist/utils/createContentColumn.d.ts +1 -1
  405. package/dist/utils/createContentColumn.d.ts.map +1 -1
  406. package/dist/utils/createContentColumn.js +1 -2
  407. package/dist/utils/createContentColumn.js.map +1 -1
  408. package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
  409. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  410. package/dist/utils/createEmptyRowBuffer.js +1 -2
  411. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  412. package/dist/utils/createFileHeaderElement.d.ts +1 -1
  413. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  414. package/dist/utils/createFileHeaderElement.js +6 -3
  415. package/dist/utils/createFileHeaderElement.js.map +1 -1
  416. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
  417. package/dist/utils/createGutterUtilityContentNode.js +1 -1
  418. package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
  419. package/dist/utils/createGutterUtilityElement.d.ts +1 -1
  420. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
  421. package/dist/utils/createGutterUtilityElement.js +1 -2
  422. package/dist/utils/createGutterUtilityElement.js.map +1 -1
  423. package/dist/utils/createNoNewlineElement.d.ts +1 -1
  424. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  425. package/dist/utils/createNoNewlineElement.js +1 -2
  426. package/dist/utils/createNoNewlineElement.js.map +1 -1
  427. package/dist/utils/createPreElement.d.ts +1 -1
  428. package/dist/utils/createPreElement.d.ts.map +1 -1
  429. package/dist/utils/createPreElement.js +1 -3
  430. package/dist/utils/createPreElement.js.map +1 -1
  431. package/dist/utils/createRowNodes.d.ts.map +1 -1
  432. package/dist/utils/createRowNodes.js +1 -1
  433. package/dist/utils/createRowNodes.js.map +1 -1
  434. package/dist/utils/createSeparator.d.ts +1 -1
  435. package/dist/utils/createSeparator.d.ts.map +1 -1
  436. package/dist/utils/createSeparator.js +1 -2
  437. package/dist/utils/createSeparator.js.map +1 -1
  438. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  439. package/dist/utils/createSpanNodeFromToken.js +1 -2
  440. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  441. package/dist/utils/createStyleElement.d.ts +1 -1
  442. package/dist/utils/createStyleElement.d.ts.map +1 -1
  443. package/dist/utils/createStyleElement.js +1 -2
  444. package/dist/utils/createStyleElement.js.map +1 -1
  445. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  446. package/dist/utils/createTransformerWithState.js +1 -2
  447. package/dist/utils/createTransformerWithState.js.map +1 -1
  448. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  449. package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
  450. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
  451. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  452. package/dist/utils/createWindowFromScrollPosition.js +5 -5
  453. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  454. package/dist/utils/cssWrappers.d.ts.map +1 -1
  455. package/dist/utils/cssWrappers.js +2 -3
  456. package/dist/utils/cssWrappers.js.map +1 -1
  457. package/dist/utils/detachString.d.ts.map +1 -1
  458. package/dist/utils/detachString.js +1 -1
  459. package/dist/utils/detachString.js.map +1 -1
  460. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  461. package/dist/utils/diffAcceptRejectHunk.js +1 -2
  462. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  463. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  464. package/dist/utils/formatCSSVariablePrefix.js +1 -1
  465. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  466. package/dist/utils/getDiffFileInput.d.ts +14 -0
  467. package/dist/utils/getDiffFileInput.d.ts.map +1 -0
  468. package/dist/utils/getDiffFileInput.js +24 -0
  469. package/dist/utils/getDiffFileInput.js.map +1 -0
  470. package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  471. package/dist/utils/getDiffHunksRendererOptions.js +2 -1
  472. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  473. package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  474. package/dist/utils/getFileRendererOptions.js +1 -1
  475. package/dist/utils/getFileRendererOptions.js.map +1 -1
  476. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  477. package/dist/utils/getFiletypeFromFileName.js +3 -1
  478. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  479. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  480. package/dist/utils/getHighlighterOptions.js +1 -2
  481. package/dist/utils/getHighlighterOptions.js.map +1 -1
  482. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  483. package/dist/utils/getHighlighterThemeStyles.js +1 -2
  484. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  485. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  486. package/dist/utils/getHunkSeparatorSlotName.js +1 -1
  487. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  488. package/dist/utils/getIconForType.d.ts.map +1 -1
  489. package/dist/utils/getIconForType.js +1 -1
  490. package/dist/utils/getIconForType.js.map +1 -1
  491. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  492. package/dist/utils/getLineAnnotationName.js +1 -1
  493. package/dist/utils/getLineAnnotationName.js.map +1 -1
  494. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  495. package/dist/utils/getLineEndingType.js +1 -1
  496. package/dist/utils/getLineEndingType.js.map +1 -1
  497. package/dist/utils/getLineNodes.d.ts +1 -1
  498. package/dist/utils/getLineNodes.d.ts.map +1 -1
  499. package/dist/utils/getLineNodes.js +1 -1
  500. package/dist/utils/getLineNodes.js.map +1 -1
  501. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
  502. package/dist/utils/getMergeConflictActionSlotName.js +1 -1
  503. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
  504. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
  505. package/dist/utils/getMergeConflictLineTypes.js +1 -2
  506. package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
  507. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  508. package/dist/utils/getOrCreateCodeNode.js +1 -1
  509. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  510. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  511. package/dist/utils/getSingularPatch.js +1 -2
  512. package/dist/utils/getSingularPatch.js.map +1 -1
  513. package/dist/utils/getThemes.d.ts.map +1 -1
  514. package/dist/utils/getThemes.js +1 -2
  515. package/dist/utils/getThemes.js.map +1 -1
  516. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  517. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  518. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  519. package/dist/utils/hast_utils.d.ts +1 -1
  520. package/dist/utils/hast_utils.d.ts.map +1 -1
  521. package/dist/utils/hast_utils.js +1 -1
  522. package/dist/utils/hast_utils.js.map +1 -1
  523. package/dist/utils/hostTheme.d.ts.map +1 -1
  524. package/dist/utils/hostTheme.js +1 -2
  525. package/dist/utils/hostTheme.js.map +1 -1
  526. package/dist/utils/hydratePartialDiff.d.ts +10 -0
  527. package/dist/utils/hydratePartialDiff.d.ts.map +1 -0
  528. package/dist/utils/hydratePartialDiff.js +140 -0
  529. package/dist/utils/hydratePartialDiff.js.map +1 -0
  530. package/dist/utils/includesFileAnnotations.d.ts.map +1 -1
  531. package/dist/utils/includesFileAnnotations.js +5 -5
  532. package/dist/utils/includesFileAnnotations.js.map +1 -1
  533. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  534. package/dist/utils/isDefaultRenderRange.js +1 -1
  535. package/dist/utils/isDefaultRenderRange.js.map +1 -1
  536. package/dist/utils/isDiffPlainText.d.ts.map +1 -1
  537. package/dist/utils/isDiffPlainText.js +1 -2
  538. package/dist/utils/isDiffPlainText.js.map +1 -1
  539. package/dist/utils/isFilePlainText.d.ts.map +1 -1
  540. package/dist/utils/isFilePlainText.js +1 -2
  541. package/dist/utils/isFilePlainText.js.map +1 -1
  542. package/dist/utils/isStyleNode.d.ts.map +1 -1
  543. package/dist/utils/isStyleNode.js +1 -1
  544. package/dist/utils/isStyleNode.js.map +1 -1
  545. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  546. package/dist/utils/isWorkerContext.js +1 -1
  547. package/dist/utils/isWorkerContext.js.map +1 -1
  548. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  549. package/dist/utils/iterateOverDiff.js +47 -48
  550. package/dist/utils/iterateOverDiff.js.map +1 -1
  551. package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
  552. package/dist/utils/normalizeDiffResolution.js +1 -1
  553. package/dist/utils/normalizeDiffResolution.js.map +1 -1
  554. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  555. package/dist/utils/parseDiffDecorations.js +1 -2
  556. package/dist/utils/parseDiffDecorations.js.map +1 -1
  557. package/dist/utils/parseDiffFromFile.d.ts +1 -2
  558. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  559. package/dist/utils/parseDiffFromFile.js +27 -7
  560. package/dist/utils/parseDiffFromFile.js.map +1 -1
  561. package/dist/utils/parseLineType.d.ts.map +1 -1
  562. package/dist/utils/parseLineType.js +1 -1
  563. package/dist/utils/parseLineType.js.map +1 -1
  564. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  565. package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
  566. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  567. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  568. package/dist/utils/parsePatchFiles.js +6 -7
  569. package/dist/utils/parsePatchFiles.js.map +1 -1
  570. package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
  571. package/dist/utils/prefersReducedMotion.js +1 -1
  572. package/dist/utils/prefersReducedMotion.js.map +1 -1
  573. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  574. package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
  575. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
  576. package/dist/utils/processLine.d.ts +1 -1
  577. package/dist/utils/processLine.d.ts.map +1 -1
  578. package/dist/utils/processLine.js +1 -2
  579. package/dist/utils/processLine.js.map +1 -1
  580. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  581. package/dist/utils/renderDiffWithHighlighter.js +4 -5
  582. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  583. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  584. package/dist/utils/renderFileWithHighlighter.js +1 -2
  585. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  586. package/dist/utils/resolveConflict.d.ts.map +1 -1
  587. package/dist/utils/resolveConflict.js +1 -2
  588. package/dist/utils/resolveConflict.js.map +1 -1
  589. package/dist/utils/resolveRegion.d.ts.map +1 -1
  590. package/dist/utils/resolveRegion.js +1 -1
  591. package/dist/utils/resolveRegion.js.map +1 -1
  592. package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
  593. package/dist/utils/roundToDevicePixel.js +1 -1
  594. package/dist/utils/roundToDevicePixel.js.map +1 -1
  595. package/dist/utils/scrollbarGutter.d.ts.map +1 -1
  596. package/dist/utils/scrollbarGutter.js +1 -2
  597. package/dist/utils/scrollbarGutter.js.map +1 -1
  598. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  599. package/dist/utils/setLanguageOverride.js +1 -1
  600. package/dist/utils/setLanguageOverride.js.map +1 -1
  601. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  602. package/dist/utils/setWrapperNodeProps.js +1 -2
  603. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  604. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  605. package/dist/utils/shouldUseTokenTransformer.js +1 -1
  606. package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  607. package/dist/utils/splitFileContents.d.ts.map +1 -1
  608. package/dist/utils/splitFileContents.js +1 -2
  609. package/dist/utils/splitFileContents.js.map +1 -1
  610. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  611. package/dist/utils/trimPatchContext.js +1 -2
  612. package/dist/utils/trimPatchContext.js.map +1 -1
  613. package/dist/utils/updateDiffHunks.d.ts +6 -1
  614. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  615. package/dist/utils/updateDiffHunks.js +44 -3
  616. package/dist/utils/updateDiffHunks.js.map +1 -1
  617. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  618. package/dist/utils/virtualDiffLayout.js +1 -2
  619. package/dist/utils/virtualDiffLayout.js.map +1 -1
  620. package/dist/utils/wrapTokenFragments.d.ts +1 -1
  621. package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
  622. package/dist/utils/wrapTokenFragments.js +1 -2
  623. package/dist/utils/wrapTokenFragments.js.map +1 -1
  624. package/dist/worker/WorkerPoolManager.d.ts +7 -2
  625. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  626. package/dist/worker/WorkerPoolManager.js +83 -20
  627. package/dist/worker/WorkerPoolManager.js.map +1 -1
  628. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  629. package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
  630. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  631. package/dist/worker/index.d.ts +2 -2
  632. package/dist/worker/index.js +1 -2
  633. package/dist/worker/types.d.ts +7 -1
  634. package/dist/worker/types.d.ts.map +1 -1
  635. package/dist/worker/wasm-B9ZqxnKj.js +8 -0
  636. package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
  637. package/dist/worker/worker-portable.js +2784 -6406
  638. package/dist/worker/worker-portable.js.map +1 -1
  639. package/dist/worker/worker.js +94 -126
  640. package/dist/worker/worker.js.map +1 -1
  641. package/package.json +13 -14
  642. package/dist/worker/wasm-qE0LgnY3.js +0 -10
  643. package/dist/worker/wasm-qE0LgnY3.js.map +0 -1
@@ -1,5 +1,5 @@
1
+ import { createSegmenter, endsWithLineBreak, getGraphemeSegmenter } 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;
@@ -81,31 +81,28 @@ function mapCursorMove(textDocument, selections, shortcut) {
81
81
  return selections.map((selection) => {
82
82
  let { line, character } = shortcut === "up" || shortcut === "left" ? selection.start : selection.end;
83
83
  if (shortcut === "textStart" || shortcut === "start" || shortcut === "end") {
84
+ const caret = getCaretPosition(selection);
85
+ line = caret.line;
86
+ character = caret.character;
84
87
  if (shortcut === "textStart") {
85
88
  const indent = getLeadingSpaces(textDocument.getLineText(line));
86
89
  character = character === indent ? 0 : indent;
87
90
  } else character = shortcut === "start" ? 0 : textDocument.getLineLength(line);
88
- if (selection.direction === DirectionBackward) line = selection.start.line;
89
- else line = selection.end.line;
90
91
  } else if (shortcut === "up") line = Math.max(0, line - 1);
91
92
  else if (shortcut === "down") line = Math.min(Math.max(lineCount - 1, 0), line + 1);
92
93
  else if (isCollapsedSelection(selection)) {
93
94
  const lineLength = textDocument.getLineLength(line);
94
95
  character = Math.min(character, lineLength);
95
96
  if (shortcut === "left") {
96
- character--;
97
- if (character < 0) if (line === 0) character = 0;
98
- else {
99
- line = Math.max(0, line - 1);
97
+ if (character > 0) character = stepCharacterByGrapheme(textDocument, line, character, false);
98
+ else if (line > 0) {
99
+ line = line - 1;
100
100
  character = textDocument.getLineLength(line);
101
101
  }
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
- }
102
+ } else if (character < lineLength) character = stepCharacterByGrapheme(textDocument, line, character, true);
103
+ else if (line < lineCount - 1) {
104
+ line = line + 1;
105
+ character = 0;
109
106
  }
110
107
  }
111
108
  const pos = {
@@ -115,7 +112,7 @@ function mapCursorMove(textDocument, selections, shortcut) {
115
112
  return {
116
113
  start: pos,
117
114
  end: pos,
118
- direction: DirectionNone
115
+ direction: 0
119
116
  };
120
117
  });
121
118
  }
@@ -124,20 +121,19 @@ function mapCursorMove(textDocument, selections, shortcut) {
124
121
  */
125
122
  function mapSelectionShift(textDocument, selections, shortcut) {
126
123
  return selections.map((selection) => {
127
- const [anchorOffset, focusOffset] = getSelectionAnchorAndFocusOffsets(textDocument, selection);
128
- const focusPosition = textDocument.positionAt(focusOffset);
124
+ const focusPosition = selection.direction === -1 ? selection.start : selection.end;
129
125
  const [movedFocusSelection] = mapCursorMove(textDocument, [{
130
126
  start: focusPosition,
131
127
  end: focusPosition,
132
- direction: DirectionNone
128
+ direction: 0
133
129
  }], shortcut);
134
- return createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, textDocument.offsetAt(movedFocusSelection.start));
130
+ return createSelectionFrom(selection, movedFocusSelection);
135
131
  });
136
132
  }
137
133
  /**
138
134
  * Applies a text change to the given text document
139
135
  */
140
- function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2) {
136
+ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotations, tabSize = 2, undoBoundary = false) {
141
137
  if (selections[selections.length - 1] === void 0) return { nextSelections: [] };
142
138
  const selectionPositions = [];
143
139
  for (const selection of selections) selectionPositions.push(selection.start, selection.end);
@@ -202,7 +198,7 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
202
198
  };
203
199
  }
204
200
  finalizeMergedGroup();
205
- const change = textDocument.applyResolvedEdits(edits, true, selections);
201
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
206
202
  const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsets.map((offsets) => {
207
203
  if (offsets === void 0) throw new Error("Missing next selection offsets");
208
204
  return offsets;
@@ -218,9 +214,27 @@ function applyTextChangeToSelections(textDocument, selections, edit, lineAnnotat
218
214
  };
219
215
  }
220
216
  /**
217
+ * Returns the next anchor/focus offsets after replacing a selection range.
218
+ * When the inserted text still contains the original selection (auto-surround),
219
+ * the inner range is reselected to match VS Code/CodeMirror behavior.
220
+ */
221
+ function getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText) {
222
+ const insertStart = entry.start + offsetDelta;
223
+ const insertEnd = insertStart + newText.length;
224
+ if (entry.end - entry.start > 0) {
225
+ const originalText = textDocument.getText().slice(entry.start, entry.end);
226
+ const preservedOffset = newText.indexOf(originalText);
227
+ if (preservedOffset !== -1 && preservedOffset + originalText.length <= newText.length) {
228
+ const rangeStart = insertStart + preservedOffset;
229
+ return [rangeStart, rangeStart + originalText.length];
230
+ }
231
+ }
232
+ return [insertEnd, insertEnd];
233
+ }
234
+ /**
221
235
  * Applies a text replace to multiple selections.
222
236
  */
223
- function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations) {
237
+ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnotations, undoBoundary = false) {
224
238
  if (selections.length !== texts.length) throw new Error("Selection text replacements must match the selection count");
225
239
  const selectionPositions = [];
226
240
  for (const selection of selections) selectionPositions.push(selection.start, selection.end);
@@ -247,12 +261,12 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
247
261
  });
248
262
  const allDeletes = texts.every((text) => text === "");
249
263
  let edits;
250
- const nextSelectionOffsets = Array.from({ length: selections.length });
264
+ const nextSelectionOffsetPairs = Array.from({ length: selections.length });
251
265
  if (allDeletes) {
252
266
  edits = [];
253
267
  let hasEffect = false;
254
268
  for (const entry of ordered) {
255
- nextSelectionOffsets[entry.index] = entry.end;
269
+ nextSelectionOffsetPairs[entry.index] = [entry.end, entry.end];
256
270
  if (entry.start >= entry.end) continue;
257
271
  hasEffect = true;
258
272
  const last = edits[edits.length - 1];
@@ -282,7 +296,7 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
282
296
  break;
283
297
  }
284
298
  if (next === caret) next += delta;
285
- nextSelectionOffsets[entry.index] = next;
299
+ nextSelectionOffsetPairs[entry.index] = [next, next];
286
300
  }
287
301
  } else {
288
302
  edits = [];
@@ -297,12 +311,15 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
297
311
  end: entry.end,
298
312
  text: newText
299
313
  });
300
- nextSelectionOffsets[entry.index] = entry.start + offsetDelta + newText.length;
314
+ nextSelectionOffsetPairs[entry.index] = getNextSelectionOffsetPairAfterReplace(textDocument, entry, offsetDelta, newText);
301
315
  offsetDelta += newText.length - (entry.end - entry.start);
302
316
  }
303
317
  }
304
- const change = textDocument.applyResolvedEdits(edits, true, selections);
305
- const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsets.map((offset) => [offset, offset]));
318
+ const change = textDocument.applyResolvedEdits(edits, true, selections, void 0, undoBoundary);
319
+ const nextSelections = createSelectionsFromOffsetPairs(textDocument, nextSelectionOffsetPairs.map((offsets) => {
320
+ if (offsets === void 0) throw new Error("Missing next selection offsets");
321
+ return offsets;
322
+ }));
306
323
  textDocument.setLastUndoSelectionsAfter(nextSelections);
307
324
  if (change !== void 0 && lineAnnotations !== void 0) {
308
325
  const nextLineAnnotations = applyDocumentChangeToLineAnnotations(change, lineAnnotations);
@@ -313,6 +330,47 @@ function applyTextReplaceToSelections(textDocument, selections, texts, lineAnnot
313
330
  change
314
331
  };
315
332
  }
333
+ const AUTO_SURROUND_CLOSE_CHARS = /* @__PURE__ */ new Map([
334
+ ["'", "'"],
335
+ ["\"", "\""],
336
+ ["`", "`"],
337
+ ["{", "}"],
338
+ ["[", "]"],
339
+ ["<", ">"],
340
+ ["(", ")"]
341
+ ]);
342
+ const AUTO_SURROUND_QUOTE_CHARS = /* @__PURE__ */ new Set([
343
+ "'",
344
+ "\"",
345
+ "`"
346
+ ]);
347
+ const AUTO_SURROUND_BRACKET_CHARS = /* @__PURE__ */ new Set([
348
+ "{",
349
+ "[",
350
+ "(",
351
+ "<"
352
+ ]);
353
+ function shouldAutoSurroundChar(autoSurround, char) {
354
+ if (autoSurround === "never") return false;
355
+ if (autoSurround === "brackets") return AUTO_SURROUND_BRACKET_CHARS.has(char);
356
+ if (autoSurround === "quotes") return AUTO_SURROUND_QUOTE_CHARS.has(char);
357
+ return true;
358
+ }
359
+ /**
360
+ * Returns per-selection replacement text when typing a surround character over
361
+ * non-collapsed selections, matching VS Code auto-surround behavior.
362
+ */
363
+ function getAutoSurroundReplacementTexts(textDocument, selections, char, autoSurround) {
364
+ if (char.length !== 1 || selections.length === 0) return;
365
+ const closeChar = AUTO_SURROUND_CLOSE_CHARS.get(char);
366
+ if (closeChar === void 0 || !shouldAutoSurroundChar(autoSurround, char)) return;
367
+ const replacements = [];
368
+ for (const selection of selections) {
369
+ if (isCollapsedSelection(selection)) return;
370
+ replacements.push(char + textDocument.getText(selection) + closeChar);
371
+ }
372
+ return replacements;
373
+ }
316
374
  /**
317
375
  * Swaps the two characters adjacent to a collapsed selection, matching browser
318
376
  * insertTranspose (Ctrl+T) behavior.
@@ -329,36 +387,48 @@ function applyTransposeToSelections(textDocument, selections, lineAnnotations) {
329
387
  }
330
388
  const { line, character } = selection.start;
331
389
  const offset = anchor;
332
- const lineLength = textDocument.getLineLength(line);
390
+ const lineText = textDocument.getLineText(line);
391
+ const lineLength = lineText.length;
392
+ const lineStart = offset - character;
393
+ const graphemeStarts = getLineGraphemeStarts(lineText);
333
394
  let edit;
334
395
  if (character > 0 && character < lineLength) {
396
+ const before = findClusterBreak(lineText, character, false, graphemeStarts);
397
+ const after = findClusterBreak(lineText, character, true, graphemeStarts);
335
398
  edit = {
336
- start: offset - 1,
337
- end: offset + 1,
338
- text: text[offset] + text[offset - 1]
399
+ start: lineStart + before,
400
+ end: lineStart + after,
401
+ text: lineText.slice(character, after) + lineText.slice(before, character)
339
402
  };
340
- nextOffsetPairs.push([offset + 1, offset + 1]);
341
- } else if (character === lineLength && lineLength >= 2) {
403
+ nextOffsetPairs.push([lineStart + after, lineStart + after]);
404
+ } else if (character === lineLength && graphemeStarts.length >= 2) {
405
+ const lastStart = graphemeStarts[graphemeStarts.length - 1];
406
+ const secondLastStart = graphemeStarts[graphemeStarts.length - 2];
342
407
  edit = {
343
- start: offset - 2,
408
+ start: lineStart + secondLastStart,
344
409
  end: offset,
345
- text: text[offset - 1] + text[offset - 2]
410
+ text: lineText.slice(lastStart, lineLength) + lineText.slice(secondLastStart, lastStart)
346
411
  };
347
412
  nextOffsetPairs.push([offset, offset]);
348
413
  } else if (character === 0 && line > 0 && lineLength > 0) {
349
414
  const prevLine = line - 1;
350
- const prevLength = textDocument.getLineLength(prevLine);
415
+ const prevLineText = textDocument.getLineText(prevLine);
416
+ const prevLength = prevLineText.length;
351
417
  const prevEnd = textDocument.offsetAt({
352
418
  line: prevLine,
353
419
  character: prevLength
354
420
  });
355
- const prevStart = prevLength > 0 ? prevEnd - 1 : prevEnd;
421
+ const prevGraphemeStart = prevLength > 0 ? findClusterBreak(prevLineText, prevLength, false, getLineGraphemeStarts(prevLineText)) : prevLength;
422
+ const firstEnd = findClusterBreak(lineText, 0, true, graphemeStarts);
423
+ const prevStart = prevEnd - (prevLength - prevGraphemeStart);
424
+ const newText = lineText.slice(0, firstEnd) + text.slice(prevEnd, offset) + prevLineText.slice(prevGraphemeStart, prevLength);
356
425
  edit = {
357
426
  start: prevStart,
358
- end: offset + 1,
359
- text: text[offset] + text.slice(prevEnd, offset) + text.slice(prevStart, prevEnd)
427
+ end: offset + firstEnd,
428
+ text: newText
360
429
  };
361
- nextOffsetPairs.push([offset + 1, offset + 1]);
430
+ const caret = prevStart + newText.length;
431
+ nextOffsetPairs.push([caret, caret]);
362
432
  } else {
363
433
  nextOffsetPairs.push([anchor, focus]);
364
434
  continue;
@@ -391,7 +461,7 @@ function applyDeleteHardLineForwardToSelections(textDocument, selections, lineAn
391
461
  return {
392
462
  start: range.start,
393
463
  end: range.end,
394
- direction: DirectionNone
464
+ direction: 0
395
465
  };
396
466
  });
397
467
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -405,7 +475,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
405
475
  if (!isCollapsedSelection(selection)) return {
406
476
  start: selection.start,
407
477
  end: selection.end,
408
- direction: DirectionNone
478
+ direction: 0
409
479
  };
410
480
  const caret = getCaretPosition(selection);
411
481
  const { line, character } = caret;
@@ -419,12 +489,12 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
419
489
  line,
420
490
  character
421
491
  },
422
- direction: DirectionNone
492
+ direction: 0
423
493
  };
424
494
  if (line === 0) return {
425
495
  start: caret,
426
496
  end: caret,
427
- direction: DirectionNone
497
+ direction: 0
428
498
  };
429
499
  const prevLineLength = textDocument.getLineLength(line - 1);
430
500
  return {
@@ -436,7 +506,7 @@ function applyDeleteSoftLineBackwardToSelections(textDocument, selections, getSo
436
506
  line,
437
507
  character: 0
438
508
  },
439
- direction: DirectionNone
509
+ direction: 0
440
510
  };
441
511
  });
442
512
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -451,7 +521,77 @@ function applyDeleteWordBackwardToSelections(textDocument, selections, lineAnnot
451
521
  return {
452
522
  start,
453
523
  end,
454
- direction: DirectionNone
524
+ direction: 0
525
+ };
526
+ });
527
+ return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
528
+ }
529
+ /**
530
+ * Resolves the document range deleted by Backspace or Delete at a collapsed
531
+ * caret. Non-collapsed selections delete their selected text instead.
532
+ */
533
+ function resolveDeleteCharacterRange(textDocument, selection, forward) {
534
+ if (!isCollapsedSelection(selection)) return [selection.start, selection.end];
535
+ const caret = getCaretPosition(selection);
536
+ let { line, character } = caret;
537
+ const lineLength = textDocument.getLineLength(line);
538
+ const lineCount = textDocument.lineCount;
539
+ character = Math.min(character, lineLength);
540
+ if (forward) {
541
+ if (character < lineLength) return [{
542
+ line,
543
+ character
544
+ }, {
545
+ line,
546
+ character: stepCharacterByGrapheme(textDocument, line, character, true)
547
+ }];
548
+ if (line < lineCount - 1) return [{
549
+ line,
550
+ character: lineLength
551
+ }, {
552
+ line: line + 1,
553
+ character: 0
554
+ }];
555
+ return [caret, caret];
556
+ }
557
+ if (character > 0) return [{
558
+ line,
559
+ character: stepCharacterByGrapheme(textDocument, line, character, false)
560
+ }, {
561
+ line,
562
+ character
563
+ }];
564
+ if (line > 0) {
565
+ const prevLineLength = textDocument.getLineLength(line - 1);
566
+ return [{
567
+ line: line - 1,
568
+ character: prevLineLength
569
+ }, {
570
+ line,
571
+ character: 0
572
+ }];
573
+ }
574
+ return [caret, caret];
575
+ }
576
+ /**
577
+ * Deletes one grapheme (or selected text) at each selection.
578
+ */
579
+ function applyDeleteCharacterToSelections(textDocument, selections, forward, lineAnnotations, tabSize = 2) {
580
+ const deleteSelections = selections.map((selection) => {
581
+ let [start, end] = resolveDeleteCharacterRange(textDocument, selection, forward);
582
+ if (!forward && isCollapsedSelection(selection)) {
583
+ const normalized = normalizeLeadingIndentForChange(textDocument, {
584
+ start: textDocument.offsetAt(start),
585
+ end: textDocument.offsetAt(end),
586
+ text: ""
587
+ }, tabSize);
588
+ start = textDocument.positionAt(normalized.start);
589
+ end = textDocument.positionAt(normalized.end);
590
+ }
591
+ return {
592
+ start,
593
+ end,
594
+ direction: 0
455
595
  };
456
596
  });
457
597
  return applyTextReplaceToSelections(textDocument, deleteSelections, deleteSelections.map(() => ""), lineAnnotations);
@@ -467,7 +607,7 @@ function isCollapsedSelection(selection) {
467
607
  */
468
608
  function getCaretPosition(selection) {
469
609
  const { start, end, direction } = selection;
470
- return direction === DirectionBackward ? start : end;
610
+ return direction === -1 ? start : end;
471
611
  }
472
612
  /**
473
613
  * Checks if a line is editable.
@@ -497,7 +637,7 @@ function comparePosition(a, b) {
497
637
  * Creates a selection from anchor and focus offsets.
498
638
  */
499
639
  function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, focusOffset) {
500
- const direction = anchorOffset === focusOffset ? DirectionNone : anchorOffset < focusOffset ? DirectionForward : DirectionBackward;
640
+ const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
501
641
  const start = Math.min(anchorOffset, focusOffset);
502
642
  const end = Math.max(anchorOffset, focusOffset);
503
643
  return {
@@ -507,10 +647,44 @@ function createSelectionFromAnchorAndFocusOffsets(textDocument, anchorOffset, fo
507
647
  };
508
648
  }
509
649
  /**
650
+ * Maps a single offset from the pre-edit document into the post-edit document.
651
+ * `edits` are resolved edits in pre-edit offsets, sorted ascending and
652
+ * non-overlapping. An offset at or after an edit's start shifts to the end of
653
+ * that edit's replacement (right gravity), so text inserted at the caret pushes
654
+ * the caret past it; an offset strictly before an edit is only shifted by the
655
+ * net length change of the edits that precede it.
656
+ */
657
+ function remapOffsetThroughEdits(offset, edits) {
658
+ let delta = 0;
659
+ for (const edit of edits) {
660
+ if (offset < edit.start) break;
661
+ if (offset >= edit.end) delta += edit.text.length - (edit.end - edit.start);
662
+ else return edit.start + delta + edit.text.length;
663
+ }
664
+ return offset + delta;
665
+ }
666
+ /**
667
+ * Re-anchors selections after a batch of text edits has been applied, so the
668
+ * caret keeps pointing at the same logical location in the changed buffer.
669
+ *
670
+ * `selectionOffsets` (one `[start, end]` pair per selection) and `edits` are
671
+ * measured in the PRE-edit document; the returned selections are built from
672
+ * `textDocument`, which must already reflect the applied edits. Selection
673
+ * direction is preserved by remapping each edge and re-deriving anchor/focus.
674
+ */
675
+ function remapSelectionsAfterEdits(textDocument, selections, selectionOffsets, edits) {
676
+ return selections.map((selection, index) => {
677
+ const [startOffset, endOffset] = selectionOffsets[index];
678
+ const nextStart = remapOffsetThroughEdits(startOffset, edits);
679
+ const nextEnd = remapOffsetThroughEdits(endOffset, edits);
680
+ return createSelectionFromAnchorAndFocusOffsets(textDocument, selection.direction === -1 ? nextEnd : nextStart, selection.direction === -1 ? nextStart : nextEnd);
681
+ });
682
+ }
683
+ /**
510
684
  * Creates a selection from a anchor and focus selection.
511
685
  */
512
686
  function createSelectionFrom(anchorSelection, focusSelection) {
513
- const anchor = anchorSelection.direction === DirectionBackward ? anchorSelection.end : anchorSelection.start;
687
+ const anchor = anchorSelection.direction === -1 ? anchorSelection.end : anchorSelection.start;
514
688
  const currentStartOrder = comparePosition(anchor, focusSelection.start);
515
689
  const currentEndOrder = comparePosition(anchor, focusSelection.end);
516
690
  let focus = focusSelection.end;
@@ -521,7 +695,7 @@ function createSelectionFrom(anchorSelection, focusSelection) {
521
695
  return {
522
696
  start: anchorVsFocus <= 0 ? anchor : focus,
523
697
  end: anchorVsFocus <= 0 ? focus : anchor,
524
- direction: anchorVsFocus === 0 ? DirectionNone : anchorVsFocus < 0 ? DirectionForward : DirectionBackward
698
+ direction: anchorVsFocus === 0 ? 0 : anchorVsFocus < 0 ? 1 : -1
525
699
  };
526
700
  }
527
701
  /**
@@ -534,22 +708,22 @@ function extendSelection(original, target) {
534
708
  if (leftExtended && !rightExtended) return {
535
709
  start: target.start,
536
710
  end: original.end,
537
- direction: DirectionBackward
711
+ direction: -1
538
712
  };
539
713
  if (rightExtended && !leftExtended) return {
540
714
  start: original.start,
541
715
  end: target.end,
542
- direction: DirectionForward
716
+ direction: 1
543
717
  };
544
- if (original.direction === DirectionBackward) return {
718
+ if (original.direction === -1) return {
545
719
  start: target.start,
546
720
  end: original.end,
547
- direction: comparePosition(target.start, original.end) === 0 ? DirectionNone : DirectionBackward
721
+ direction: comparePosition(target.start, original.end) === 0 ? 0 : -1
548
722
  };
549
723
  return {
550
724
  start: original.start,
551
725
  end: target.end,
552
- direction: comparePosition(original.start, target.end) === 0 ? DirectionNone : DirectionForward
726
+ direction: comparePosition(original.start, target.end) === 0 ? 0 : 1
553
727
  };
554
728
  }
555
729
  /**
@@ -565,30 +739,39 @@ function extendSelections(selections, target) {
565
739
  */
566
740
  function mergeOverlappingSelections(selections) {
567
741
  if (selections.length <= 1) return selections;
568
- const selected = /* @__PURE__ */ new Set();
569
- const accepted = [];
570
- for (let i = selections.length - 1; i >= 0; i--) {
571
- const selection = selections[i];
572
- if (selection === void 0) continue;
573
- let left = 0;
574
- let right = accepted.length;
575
- while (left < right) {
576
- const mid = Math.floor((left + right) / 2);
577
- const candidate = accepted[mid]?.selection;
578
- if (candidate === void 0) break;
579
- if (comparePosition(candidate.start, selection.start) < 0) left = mid + 1;
580
- else right = mid;
742
+ const ordered = selections.map((selection, index) => ({
743
+ index,
744
+ selection
745
+ })).sort((a, b) => {
746
+ const startOrder = comparePosition(a.selection.start, b.selection.start);
747
+ if (startOrder !== 0) return startOrder;
748
+ const endOrder = comparePosition(a.selection.end, b.selection.end);
749
+ return endOrder !== 0 ? endOrder : a.index - b.index;
750
+ });
751
+ const merged = [];
752
+ let current = ordered[0];
753
+ for (const entry of ordered.slice(1)) {
754
+ if (selectionIntersects(current.selection, entry.selection)) {
755
+ const latest = entry.index > current.index ? entry : current;
756
+ const start = comparePosition(entry.selection.start, current.selection.start) < 0 ? entry.selection.start : current.selection.start;
757
+ const end = comparePosition(entry.selection.end, current.selection.end) > 0 ? entry.selection.end : current.selection.end;
758
+ let direction = latest.selection.direction;
759
+ if (direction === 0 && comparePosition(start, end) !== 0) direction = comparePosition(latest.selection.start, start) === 0 ? -1 : 1;
760
+ current = {
761
+ index: latest.index,
762
+ selection: {
763
+ direction,
764
+ end,
765
+ start
766
+ }
767
+ };
768
+ continue;
581
769
  }
582
- const previous = accepted[left - 1]?.selection;
583
- const next = accepted[left]?.selection;
584
- if (previous !== void 0 && selectionIntersects(previous, selection) || next !== void 0 && selectionIntersects(next, selection)) continue;
585
- accepted.splice(left, 0, {
586
- index: i,
587
- selection
588
- });
589
- selected.add(i);
770
+ merged.push(current);
771
+ current = entry;
590
772
  }
591
- return selections.filter((_, index) => selected.has(index));
773
+ merged.push(current);
774
+ return merged.sort((a, b) => a.index - b.index).map(({ selection }) => selection);
592
775
  }
593
776
  /**
594
777
  * Finds the next matching word and updates the selections.
@@ -622,36 +805,182 @@ function getDocumentFullSelection(textDocument) {
622
805
  line: lastLine,
623
806
  character: textDocument.getLineLength(lastLine)
624
807
  },
625
- direction: DirectionForward
808
+ direction: 1
626
809
  };
627
810
  }
628
811
  /**
629
812
  * Get the boundary selection of the document.
630
813
  */
631
- function getDocumentBoundarySelection(textDocument, atEnd) {
632
- const line = atEnd ? textDocument.lineCount - 1 : 0;
814
+ function getDocumentBoundarySelection(textDocument, atEnd, trimmedEndNewLine) {
815
+ let line = 0;
816
+ if (atEnd) {
817
+ const lastLine = textDocument.lineCount - 1;
818
+ line = trimmedEndNewLine === true && lastLine > 0 && textDocument.getLineLength(lastLine) === 0 ? lastLine - 1 : lastLine;
819
+ }
820
+ const character = atEnd ? textDocument.getLineLength(line) : 0;
633
821
  const start = {
634
822
  line,
635
- character: atEnd ? textDocument.getLineLength(line) : 0
823
+ character
636
824
  };
637
825
  return {
638
826
  start,
639
827
  end: start,
640
- direction: DirectionForward
828
+ direction: 1
641
829
  };
642
830
  }
643
831
  /**
644
- * Get the text of the selections for the given text document.
832
+ * Resolves the document offset range each selection contributes to the
833
+ * clipboard, ordered by position. A collapsed selection contributes its whole
834
+ * logical line including the trailing line break; the final line has no
835
+ * trailing break to include. A ranged selection contributes the selected text.
836
+ */
837
+ function resolveClipboardRegions(textDocument, selections) {
838
+ return selections.map((selection) => {
839
+ if (isCollapsedSelection(selection)) {
840
+ const line = selection.start.line;
841
+ return {
842
+ start: textDocument.offsetAt({
843
+ line,
844
+ character: 0
845
+ }),
846
+ end: line < textDocument.lineCount - 1 ? textDocument.offsetAt({
847
+ line: line + 1,
848
+ character: 0
849
+ }) : textDocument.offsetAt({
850
+ line,
851
+ character: textDocument.getLineLength(line)
852
+ })
853
+ };
854
+ }
855
+ const start = textDocument.offsetAt(selection.start);
856
+ const end = textDocument.offsetAt(selection.end);
857
+ return start <= end ? {
858
+ start,
859
+ end
860
+ } : {
861
+ start: end,
862
+ end: start
863
+ };
864
+ }).sort((a, b) => {
865
+ const startOrder = a.start - b.start;
866
+ return startOrder !== 0 ? startOrder : a.end - b.end;
867
+ });
868
+ }
869
+ /**
870
+ * Get the clipboard text of the selections for the given text document. Used by
871
+ * both copy and cut so the two stay in sync. Overlapping regions (e.g. several
872
+ * carets on one line) are merged so the same text is never emitted twice, and a
873
+ * line-ending separator is inserted only between regions that aren't already
874
+ * contiguous in the document.
645
875
  */
646
876
  function getSelectionText(textDocument, selections) {
647
- return [...selections].sort((a, b) => {
648
- const startOrder = comparePosition(a.start, b.start);
877
+ const regions = resolveClipboardRegions(textDocument, selections);
878
+ const eol = textDocument.eol;
879
+ let result = "";
880
+ let prevEnd = -1;
881
+ for (const region of regions) {
882
+ if (region.end <= region.start) continue;
883
+ if (region.start <= prevEnd) {
884
+ if (region.end > prevEnd) {
885
+ result += textDocument.getTextSlice(prevEnd, region.end);
886
+ prevEnd = region.end;
887
+ }
888
+ continue;
889
+ }
890
+ if (result.length > 0 && !endsWithLineBreak(result)) result += eol;
891
+ result += textDocument.getTextSlice(region.start, region.end);
892
+ prevEnd = region.end;
893
+ }
894
+ return result;
895
+ }
896
+ function resolveSelectionCutEdit(textDocument, selection) {
897
+ if (isCollapsedSelection(selection)) return resolveCollapsedSelectionCutEdit(textDocument, selection);
898
+ const [start, end] = comparePosition(selection.start, selection.end) <= 0 ? [selection.start, selection.end] : [selection.end, selection.start];
899
+ return {
900
+ start: textDocument.offsetAt(start),
901
+ end: textDocument.offsetAt(end),
902
+ text: ""
903
+ };
904
+ }
905
+ function resolveCollapsedSelectionCutEdit(textDocument, selection) {
906
+ const line = selection.start.line;
907
+ const lineStart = textDocument.offsetAt({
908
+ line,
909
+ character: 0
910
+ });
911
+ const lineEnd = textDocument.offsetAt({
912
+ line,
913
+ character: textDocument.getLineLength(line)
914
+ });
915
+ if (line < textDocument.lineCount - 1) return {
916
+ start: lineStart,
917
+ end: textDocument.offsetAt({
918
+ line: line + 1,
919
+ character: 0
920
+ }),
921
+ text: ""
922
+ };
923
+ if (line > 0) return {
924
+ start: textDocument.offsetAt({
925
+ line: line - 1,
926
+ character: textDocument.getLineLength(line - 1)
927
+ }),
928
+ end: lineEnd,
929
+ text: ""
930
+ };
931
+ return {
932
+ start: lineStart,
933
+ end: lineEnd,
934
+ text: ""
935
+ };
936
+ }
937
+ function mergeCutEdits(orderedCuts) {
938
+ const edits = [];
939
+ for (const { edit } of orderedCuts) {
940
+ if (edit.start >= edit.end) continue;
941
+ const last = edits.at(-1);
942
+ if (last !== void 0 && edit.start <= last.end) edits[edits.length - 1] = {
943
+ start: last.start,
944
+ end: Math.max(last.end, edit.end),
945
+ text: ""
946
+ };
947
+ else edits.push(edit);
948
+ }
949
+ return edits;
950
+ }
951
+ function mapCutSelectionOffsets(orderedCuts, edits) {
952
+ const nextOffsets = Array.from({ length: orderedCuts.length });
953
+ let editIndex = 0;
954
+ let offsetDelta = 0;
955
+ for (const cut of orderedCuts) {
956
+ while (editIndex < edits.length && cut.edit.start > edits[editIndex].end) {
957
+ const edit = edits[editIndex];
958
+ offsetDelta -= edit.end - edit.start;
959
+ editIndex++;
960
+ }
961
+ const edit = edits[editIndex];
962
+ if (edit !== void 0 && cut.edit.start >= edit.start && cut.edit.start <= edit.end) nextOffsets[cut.index] = edit.start + offsetDelta;
963
+ else nextOffsets[cut.index] = cut.edit.start + offsetDelta;
964
+ }
965
+ return nextOffsets;
966
+ }
967
+ function resolveSelectionCut(textDocument, selections) {
968
+ const orderedCuts = [...selections.map((selection, index) => ({
969
+ index,
970
+ edit: resolveSelectionCutEdit(textDocument, selection)
971
+ }))].sort((a, b) => {
972
+ const startOrder = a.edit.start - b.edit.start;
649
973
  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");
974
+ const endOrder = a.edit.end - b.edit.end;
975
+ if (endOrder !== 0) return endOrder;
976
+ return a.index - b.index;
977
+ });
978
+ const edits = mergeCutEdits(orderedCuts);
979
+ return {
980
+ text: getSelectionText(textDocument, selections),
981
+ edits,
982
+ nextSelectionOffsets: mapCutSelectionOffsets(orderedCuts, edits)
983
+ };
655
984
  }
656
985
  /**
657
986
  * Get the anchor node and offset for a selection.
@@ -703,15 +1032,28 @@ function expandCollapsedSelectionToWord(textDocument, selection) {
703
1032
  line,
704
1033
  character: span.end
705
1034
  },
706
- direction: DirectionForward
1035
+ direction: 1
707
1036
  };
708
1037
  }
709
1038
  function expandCollapsedLineWord(lineText, character) {
710
- const segmenter = new Intl.Segmenter(void 0, { granularity: "word" });
711
- for (const seg of segmenter.segment(lineText)) {
712
- if (seg.isWordLike !== true) continue;
713
- const lo = seg.index;
714
- const hi = lo + seg.segment.length;
1039
+ const segmenter = createSegmenter({ granularity: "word" });
1040
+ if (segmenter !== void 0) {
1041
+ for (const seg of segmenter.segment(lineText)) {
1042
+ if (seg.isWordLike !== true) continue;
1043
+ const lo = seg.index;
1044
+ const hi = lo + seg.segment.length;
1045
+ if (character >= lo && character <= hi) return {
1046
+ start: lo,
1047
+ end: hi
1048
+ };
1049
+ }
1050
+ return;
1051
+ }
1052
+ const wordRe = /[\p{Alphabetic}\p{Number}_]+/gu;
1053
+ let match;
1054
+ while ((match = wordRe.exec(lineText)) !== null) {
1055
+ const lo = match.index;
1056
+ const hi = lo + match[0].length;
715
1057
  if (character >= lo && character <= hi) return {
716
1058
  start: lo,
717
1059
  end: hi
@@ -734,9 +1076,7 @@ function resolveDeleteWordBackwardRange(textDocument, selection) {
734
1076
  }];
735
1077
  }
736
1078
  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);
1079
+ const graphemeStarts = getLineGraphemeStarts(lineText);
740
1080
  let pos = head;
741
1081
  let match;
742
1082
  while (pos > 0) {
@@ -766,8 +1106,58 @@ function findClusterBreak(text, pos, forward, graphemeStarts) {
766
1106
  }
767
1107
  return 0;
768
1108
  }
1109
+ function getLineGraphemeStarts(lineText) {
1110
+ const graphemeStarts = [0];
1111
+ const segmenter = getGraphemeSegmenter();
1112
+ if (segmenter !== void 0) {
1113
+ for (const segment of segmenter.segment(lineText)) if (segment.index > 0) graphemeStarts.push(segment.index);
1114
+ return graphemeStarts;
1115
+ }
1116
+ let index = 0;
1117
+ for (const codePoint of lineText) {
1118
+ if (index > 0) graphemeStarts.push(index);
1119
+ index += codePoint.length;
1120
+ }
1121
+ return graphemeStarts;
1122
+ }
1123
+ function stepCharacterByGrapheme(textDocument, line, character, forward) {
1124
+ const lineLength = textDocument.getLineLength(line);
1125
+ if (forward) {
1126
+ if (character >= lineLength) return lineLength;
1127
+ const lineStart = textDocument.offsetAt({
1128
+ line,
1129
+ character: 0
1130
+ });
1131
+ const suffix = textDocument.getTextSlice(lineStart + character, lineStart + lineLength);
1132
+ const segmenter = getGraphemeSegmenter();
1133
+ if (segmenter !== void 0) {
1134
+ for (const segment of segmenter.segment(suffix)) return character + segment.segment.length;
1135
+ return lineLength;
1136
+ }
1137
+ for (const codePoint of suffix) return character + codePoint.length;
1138
+ return lineLength;
1139
+ }
1140
+ if (character <= 0) return 0;
1141
+ const lineStart = textDocument.offsetAt({
1142
+ line,
1143
+ character: 0
1144
+ });
1145
+ const prefix = textDocument.getTextSlice(lineStart, lineStart + character);
1146
+ let prevStart = 0;
1147
+ const segmenter = getGraphemeSegmenter();
1148
+ if (segmenter !== void 0) {
1149
+ for (const segment of segmenter.segment(prefix)) prevStart = segment.index;
1150
+ return prevStart;
1151
+ }
1152
+ let index = 0;
1153
+ for (const codePoint of prefix) {
1154
+ prevStart = index;
1155
+ index += codePoint.length;
1156
+ }
1157
+ return prevStart;
1158
+ }
769
1159
  function getSelectionAnchorAndFocusOffsets(textDocument, selection) {
770
- const isBackward = selection.direction === DirectionBackward;
1160
+ const isBackward = selection.direction === -1;
771
1161
  return [textDocument.offsetAt(isBackward ? selection.end : selection.start), textDocument.offsetAt(getCaretPosition(selection))];
772
1162
  }
773
1163
  function resolveDeleteHardLineForwardRange(textDocument, selection) {
@@ -809,7 +1199,7 @@ function resolveDeleteHardLineForwardRange(textDocument, selection) {
809
1199
  };
810
1200
  }
811
1201
  function expandSingleNewlineInsert(textDocument, insertText, insertStartOffset) {
812
- if (insertText !== "\n" && insertText !== "\r\n") return insertText;
1202
+ if (insertText !== "\n" && insertText !== "\r" && insertText !== "\r\n") return insertText;
813
1203
  const line = textDocument.positionAt(insertStartOffset).line;
814
1204
  const lineText = textDocument.getLineText(line);
815
1205
  const indentLen = getLeadingSpaces(lineText);
@@ -829,7 +1219,7 @@ function createSelectionsFromOffsetPairs(textDocument, offsetPairs) {
829
1219
  for (const [anchorOffset, focusOffset] of offsetPairs) normalizedOffsets.push(Math.min(anchorOffset, focusOffset), Math.max(anchorOffset, focusOffset));
830
1220
  const positions = textDocument.positionsAt(normalizedOffsets);
831
1221
  return offsetPairs.map(([anchorOffset, focusOffset], index) => {
832
- const direction = anchorOffset === focusOffset ? DirectionNone : anchorOffset < focusOffset ? DirectionForward : DirectionBackward;
1222
+ const direction = anchorOffset === focusOffset ? 0 : anchorOffset < focusOffset ? 1 : -1;
833
1223
  return {
834
1224
  start: positions[index * 2],
835
1225
  end: positions[index * 2 + 1],
@@ -985,10 +1375,10 @@ function isInside(token, node) {
985
1375
  }
986
1376
  function offsetBefore(line, node) {
987
1377
  if (node.parentElement === line) {
988
- let offset$1 = 0;
1378
+ let offset = 0;
989
1379
  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;
1380
+ for (let i = 0; i < index; i++) offset = getLineChildEnd(line.childNodes[i]);
1381
+ return offset;
992
1382
  }
993
1383
  for (const token of collectTokens(line)) if (isInside(token, node)) return getCharacterIndex(token) + (node.nodeType === 3 ? textLengthBefore(token, node) : 0);
994
1384
  let offset = 0;
@@ -1018,10 +1408,10 @@ function getLineChildEnd(child, textOffsetInChild) {
1018
1408
  if (parent === null) return 0;
1019
1409
  const token = findTokenSpan(parent);
1020
1410
  if (token === null) return 0;
1021
- const base$1 = getCharacterIndex(token);
1022
- if (base$1 === void 0) return 0;
1411
+ const base = getCharacterIndex(token);
1412
+ if (base === void 0) return 0;
1023
1413
  const length = textOffsetInChild === void 0 ? getTextOffset(child.textContent, child.textContent?.length ?? 0) : getTextOffset(child.textContent, textOffsetInChild);
1024
- return base$1 + textLengthBefore(token, child) + length;
1414
+ return base + textLengthBefore(token, child) + length;
1025
1415
  }
1026
1416
  if (child.nodeType !== 1) return 0;
1027
1417
  const el = child;
@@ -1033,8 +1423,8 @@ function getLineChildEnd(child, textOffsetInChild) {
1033
1423
  return end;
1034
1424
  }
1035
1425
  function getLineIndex(el) {
1036
- const { line } = el.dataset;
1037
- if (line !== void 0) {
1426
+ const { line, lineType } = el.dataset;
1427
+ if (line !== void 0 && lineType !== "change-deletion") {
1038
1428
  const lineNumber = parseInt(line, 10);
1039
1429
  if (!Number.isNaN(lineNumber)) return lineNumber - 1;
1040
1430
  }
@@ -1051,7 +1441,7 @@ function getTextOffset(text, offset) {
1051
1441
  const lineBreakIndex = value.search(/[\r\n]/);
1052
1442
  return Math.min(offset, lineBreakIndex === -1 ? value.length : lineBreakIndex);
1053
1443
  }
1054
-
1055
1444
  //#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 };
1445
+ 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 };
1446
+
1057
1447
  //# sourceMappingURL=selection.js.map