@pierre/diffs 1.3.0-beta.4 → 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 (625) hide show
  1. package/README.md +15 -15
  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 +14 -14
  5. package/dist/components/CodeView.js.map +1 -1
  6. package/dist/components/File.d.ts +4 -4
  7. package/dist/components/File.d.ts.map +1 -1
  8. package/dist/components/File.js +53 -24
  9. package/dist/components/File.js.map +1 -1
  10. package/dist/components/FileDiff.d.ts +19 -18
  11. package/dist/components/FileDiff.d.ts.map +1 -1
  12. package/dist/components/FileDiff.js +89 -58
  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 +8 -6
  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 +5 -2
  23. package/dist/components/VirtualizedFile.d.ts.map +1 -1
  24. package/dist/components/VirtualizedFile.js +97 -35
  25. package/dist/components/VirtualizedFile.js.map +1 -1
  26. package/dist/components/VirtualizedFileDiff.d.ts +8 -4
  27. package/dist/components/VirtualizedFileDiff.d.ts.map +1 -1
  28. package/dist/components/VirtualizedFileDiff.js +91 -30
  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 +3 -2
  43. package/dist/editor/command.d.ts.map +1 -1
  44. package/dist/editor/command.js +10 -6
  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 +56 -6
  51. package/dist/editor/editor.d.ts.map +1 -1
  52. package/dist/editor/editor.js +758 -397
  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.d.ts +2 -2
  57. package/dist/editor/index.js +1 -2
  58. package/dist/editor/lineAnnotations.d.ts.map +1 -1
  59. package/dist/editor/lineAnnotations.js +2 -3
  60. package/dist/editor/lineAnnotations.js.map +1 -1
  61. package/dist/editor/marker.d.ts +4 -3
  62. package/dist/editor/marker.d.ts.map +1 -1
  63. package/dist/editor/marker.js +30 -13
  64. package/dist/editor/marker.js.map +1 -1
  65. package/dist/editor/pieceTable.d.ts +10 -3
  66. package/dist/editor/pieceTable.d.ts.map +1 -1
  67. package/dist/editor/pieceTable.js +170 -129
  68. package/dist/editor/pieceTable.js.map +1 -1
  69. package/dist/editor/platform.d.ts +8 -1
  70. package/dist/editor/platform.d.ts.map +1 -1
  71. package/dist/editor/platform.js +16 -5
  72. package/dist/editor/platform.js.map +1 -1
  73. package/dist/editor/searchPanel.d.ts +13 -3
  74. package/dist/editor/searchPanel.d.ts.map +1 -1
  75. package/dist/editor/searchPanel.js +194 -67
  76. package/dist/editor/searchPanel.js.map +1 -1
  77. package/dist/editor/selection.d.ts +41 -4
  78. package/dist/editor/selection.d.ts.map +1 -1
  79. package/dist/editor/selection.js +423 -83
  80. package/dist/editor/selection.js.map +1 -1
  81. package/dist/editor/selectionAction.d.ts +4 -5
  82. package/dist/editor/selectionAction.d.ts.map +1 -1
  83. package/dist/editor/selectionAction.js +14 -64
  84. package/dist/editor/selectionAction.js.map +1 -1
  85. package/dist/editor/sprite.d.ts +2 -2
  86. package/dist/editor/sprite.d.ts.map +1 -1
  87. package/dist/editor/sprite.js +8 -8
  88. package/dist/editor/sprite.js.map +1 -1
  89. package/dist/editor/textDocument.d.ts +5 -4
  90. package/dist/editor/textDocument.d.ts.map +1 -1
  91. package/dist/editor/textDocument.js +26 -15
  92. package/dist/editor/textDocument.js.map +1 -1
  93. package/dist/editor/textMeasure.d.ts +37 -3
  94. package/dist/editor/textMeasure.d.ts.map +1 -1
  95. package/dist/editor/textMeasure.js +85 -10
  96. package/dist/editor/textMeasure.js.map +1 -1
  97. package/dist/editor/tokenzier.d.ts +1 -0
  98. package/dist/editor/tokenzier.d.ts.map +1 -1
  99. package/dist/editor/tokenzier.js +25 -19
  100. package/dist/editor/tokenzier.js.map +1 -1
  101. package/dist/editor/utils.d.ts +2 -1
  102. package/dist/editor/utils.d.ts.map +1 -1
  103. package/dist/editor/utils.js +6 -3
  104. package/dist/editor/utils.js.map +1 -1
  105. package/dist/highlighter/languages/areLanguagesAttached.d.ts.map +1 -1
  106. package/dist/highlighter/languages/areLanguagesAttached.js +1 -2
  107. package/dist/highlighter/languages/areLanguagesAttached.js.map +1 -1
  108. package/dist/highlighter/languages/attachResolvedLanguages.d.ts +0 -2
  109. package/dist/highlighter/languages/attachResolvedLanguages.d.ts.map +1 -1
  110. package/dist/highlighter/languages/attachResolvedLanguages.js +1 -2
  111. package/dist/highlighter/languages/attachResolvedLanguages.js.map +1 -1
  112. package/dist/highlighter/languages/cleanUpResolvedLanguages.d.ts.map +1 -1
  113. package/dist/highlighter/languages/cleanUpResolvedLanguages.js +1 -2
  114. package/dist/highlighter/languages/cleanUpResolvedLanguages.js.map +1 -1
  115. package/dist/highlighter/languages/constants.d.ts +0 -1
  116. package/dist/highlighter/languages/constants.d.ts.map +1 -1
  117. package/dist/highlighter/languages/constants.js +1 -1
  118. package/dist/highlighter/languages/constants.js.map +1 -1
  119. package/dist/highlighter/languages/getResolvedLanguages.d.ts +0 -2
  120. package/dist/highlighter/languages/getResolvedLanguages.d.ts.map +1 -1
  121. package/dist/highlighter/languages/getResolvedLanguages.js +1 -2
  122. package/dist/highlighter/languages/getResolvedLanguages.js.map +1 -1
  123. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts +0 -2
  124. package/dist/highlighter/languages/getResolvedOrResolveLanguage.d.ts.map +1 -1
  125. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js +1 -2
  126. package/dist/highlighter/languages/getResolvedOrResolveLanguage.js.map +1 -1
  127. package/dist/highlighter/languages/hasResolvedLanguages.d.ts.map +1 -1
  128. package/dist/highlighter/languages/hasResolvedLanguages.js +1 -2
  129. package/dist/highlighter/languages/hasResolvedLanguages.js.map +1 -1
  130. package/dist/highlighter/languages/registerCustomLanguage.d.ts +0 -1
  131. package/dist/highlighter/languages/registerCustomLanguage.d.ts.map +1 -1
  132. package/dist/highlighter/languages/registerCustomLanguage.js +1 -2
  133. package/dist/highlighter/languages/registerCustomLanguage.js.map +1 -1
  134. package/dist/highlighter/languages/resolveLanguage.d.ts +0 -2
  135. package/dist/highlighter/languages/resolveLanguage.d.ts.map +1 -1
  136. package/dist/highlighter/languages/resolveLanguage.js +4 -5
  137. package/dist/highlighter/languages/resolveLanguage.js.map +1 -1
  138. package/dist/highlighter/languages/resolveLanguages.d.ts +0 -2
  139. package/dist/highlighter/languages/resolveLanguages.d.ts.map +1 -1
  140. package/dist/highlighter/languages/resolveLanguages.js +1 -2
  141. package/dist/highlighter/languages/resolveLanguages.js.map +1 -1
  142. package/dist/highlighter/shared_highlighter.d.ts.map +1 -1
  143. package/dist/highlighter/shared_highlighter.js +3 -4
  144. package/dist/highlighter/shared_highlighter.js.map +1 -1
  145. package/dist/highlighter/themes/areThemesAttached.d.ts.map +1 -1
  146. package/dist/highlighter/themes/areThemesAttached.js +1 -2
  147. package/dist/highlighter/themes/areThemesAttached.js.map +1 -1
  148. package/dist/highlighter/themes/attachResolvedThemes.d.ts.map +1 -1
  149. package/dist/highlighter/themes/attachResolvedThemes.js +1 -2
  150. package/dist/highlighter/themes/attachResolvedThemes.js.map +1 -1
  151. package/dist/highlighter/themes/cleanUpResolvedThemes.d.ts.map +1 -1
  152. package/dist/highlighter/themes/cleanUpResolvedThemes.js +1 -2
  153. package/dist/highlighter/themes/cleanUpResolvedThemes.js.map +1 -1
  154. package/dist/highlighter/themes/constants.d.ts.map +1 -1
  155. package/dist/highlighter/themes/constants.js +1 -1
  156. package/dist/highlighter/themes/constants.js.map +1 -1
  157. package/dist/highlighter/themes/getResolvedOrResolveTheme.d.ts.map +1 -1
  158. package/dist/highlighter/themes/getResolvedOrResolveTheme.js +1 -2
  159. package/dist/highlighter/themes/getResolvedOrResolveTheme.js.map +1 -1
  160. package/dist/highlighter/themes/getResolvedThemes.d.ts.map +1 -1
  161. package/dist/highlighter/themes/getResolvedThemes.js +1 -2
  162. package/dist/highlighter/themes/getResolvedThemes.js.map +1 -1
  163. package/dist/highlighter/themes/hasResolvedThemes.d.ts.map +1 -1
  164. package/dist/highlighter/themes/hasResolvedThemes.js +1 -2
  165. package/dist/highlighter/themes/hasResolvedThemes.js.map +1 -1
  166. package/dist/highlighter/themes/registerCustomCSSVariableTheme.d.ts.map +1 -1
  167. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js +1 -2
  168. package/dist/highlighter/themes/registerCustomCSSVariableTheme.js.map +1 -1
  169. package/dist/highlighter/themes/registerCustomTheme.d.ts.map +1 -1
  170. package/dist/highlighter/themes/registerCustomTheme.js +1 -2
  171. package/dist/highlighter/themes/registerCustomTheme.js.map +1 -1
  172. package/dist/highlighter/themes/resolveTheme.d.ts.map +1 -1
  173. package/dist/highlighter/themes/resolveTheme.js +1 -2
  174. package/dist/highlighter/themes/resolveTheme.js.map +1 -1
  175. package/dist/highlighter/themes/resolveThemes.d.ts.map +1 -1
  176. package/dist/highlighter/themes/resolveThemes.js +1 -2
  177. package/dist/highlighter/themes/resolveThemes.js.map +1 -1
  178. package/dist/highlighter/themes/themeResolution.d.ts.map +1 -1
  179. package/dist/highlighter/themes/themeResolution.js +1 -2
  180. package/dist/highlighter/themes/themeResolution.js.map +1 -1
  181. package/dist/highlighter/themes/themeResolver.d.ts +2 -2
  182. package/dist/highlighter/themes/themeResolver.d.ts.map +1 -1
  183. package/dist/highlighter/themes/themeResolver.js +1 -2
  184. package/dist/highlighter/themes/themeResolver.js.map +1 -1
  185. package/dist/index.d.ts +10 -10
  186. package/dist/index.js +2 -3
  187. package/dist/managers/InteractionManager.d.ts +7 -0
  188. package/dist/managers/InteractionManager.d.ts.map +1 -1
  189. package/dist/managers/InteractionManager.js +26 -4
  190. package/dist/managers/InteractionManager.js.map +1 -1
  191. package/dist/managers/ResizeManager.d.ts.map +1 -1
  192. package/dist/managers/ResizeManager.js +2 -2
  193. package/dist/managers/ResizeManager.js.map +1 -1
  194. package/dist/managers/ScrollSyncManager.d.ts.map +1 -1
  195. package/dist/managers/ScrollSyncManager.js +1 -1
  196. package/dist/managers/ScrollSyncManager.js.map +1 -1
  197. package/dist/managers/UniversalRenderingManager.d.ts.map +1 -1
  198. package/dist/managers/UniversalRenderingManager.js +2 -2
  199. package/dist/managers/UniversalRenderingManager.js.map +1 -1
  200. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts +228 -0
  201. package/dist/node_modules/.pnpm/@types_hast@3.0.4/node_modules/@types/hast/index.d.ts.map +1 -0
  202. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts +84 -0
  203. package/dist/node_modules/.pnpm/@types_unist@3.0.3/node_modules/@types/unist/index.d.ts.map +1 -0
  204. package/dist/react/CodeView.d.ts +1 -1
  205. package/dist/react/CodeView.d.ts.map +1 -1
  206. package/dist/react/CodeView.js +16 -15
  207. package/dist/react/CodeView.js.map +1 -1
  208. package/dist/react/EditorContext.d.ts +0 -1
  209. package/dist/react/EditorContext.d.ts.map +1 -1
  210. package/dist/react/EditorContext.js +2 -5
  211. package/dist/react/EditorContext.js.map +1 -1
  212. package/dist/react/File.d.ts +1 -0
  213. package/dist/react/File.d.ts.map +1 -1
  214. package/dist/react/File.js +4 -6
  215. package/dist/react/File.js.map +1 -1
  216. package/dist/react/FileDiff.d.ts +1 -0
  217. package/dist/react/FileDiff.d.ts.map +1 -1
  218. package/dist/react/FileDiff.js +4 -6
  219. package/dist/react/FileDiff.js.map +1 -1
  220. package/dist/react/MultiFileDiff.d.ts +1 -0
  221. package/dist/react/MultiFileDiff.d.ts.map +1 -1
  222. package/dist/react/MultiFileDiff.js +4 -6
  223. package/dist/react/MultiFileDiff.js.map +1 -1
  224. package/dist/react/PatchDiff.d.ts +1 -0
  225. package/dist/react/PatchDiff.d.ts.map +1 -1
  226. package/dist/react/PatchDiff.js +4 -6
  227. package/dist/react/PatchDiff.js.map +1 -1
  228. package/dist/react/UnresolvedFile.d.ts +2 -1
  229. package/dist/react/UnresolvedFile.d.ts.map +1 -1
  230. package/dist/react/UnresolvedFile.js +4 -6
  231. package/dist/react/UnresolvedFile.js.map +1 -1
  232. package/dist/react/Virtualizer.d.ts.map +1 -1
  233. package/dist/react/Virtualizer.js +2 -5
  234. package/dist/react/Virtualizer.js.map +1 -1
  235. package/dist/react/WorkerPoolContext.d.ts +0 -1
  236. package/dist/react/WorkerPoolContext.d.ts.map +1 -1
  237. package/dist/react/WorkerPoolContext.js +2 -5
  238. package/dist/react/WorkerPoolContext.js.map +1 -1
  239. package/dist/react/constants.d.ts.map +1 -1
  240. package/dist/react/constants.js +1 -1
  241. package/dist/react/constants.js.map +1 -1
  242. package/dist/react/index.d.ts +2 -2
  243. package/dist/react/index.js +1 -2
  244. package/dist/react/jsx.d.ts +0 -2
  245. package/dist/react/jsx.d.ts.map +1 -1
  246. package/dist/react/types.d.ts +2 -0
  247. package/dist/react/types.d.ts.map +1 -1
  248. package/dist/react/utils/renderDiffChildren.d.ts +2 -0
  249. package/dist/react/utils/renderDiffChildren.d.ts.map +1 -1
  250. package/dist/react/utils/renderDiffChildren.js +18 -11
  251. package/dist/react/utils/renderDiffChildren.js.map +1 -1
  252. package/dist/react/utils/renderFileChildren.d.ts +2 -0
  253. package/dist/react/utils/renderFileChildren.d.ts.map +1 -1
  254. package/dist/react/utils/renderFileChildren.js +18 -11
  255. package/dist/react/utils/renderFileChildren.js.map +1 -1
  256. package/dist/react/utils/templateRender.d.ts.map +1 -1
  257. package/dist/react/utils/templateRender.js +1 -2
  258. package/dist/react/utils/templateRender.js.map +1 -1
  259. package/dist/react/utils/useFileDiffInstance.d.ts.map +1 -1
  260. package/dist/react/utils/useFileDiffInstance.js +1 -3
  261. package/dist/react/utils/useFileDiffInstance.js.map +1 -1
  262. package/dist/react/utils/useFileInstance.d.ts.map +1 -1
  263. package/dist/react/utils/useFileInstance.js +1 -2
  264. package/dist/react/utils/useFileInstance.js.map +1 -1
  265. package/dist/react/utils/useStableCallback.d.ts.map +1 -1
  266. package/dist/react/utils/useStableCallback.js +1 -2
  267. package/dist/react/utils/useStableCallback.js.map +1 -1
  268. package/dist/react/utils/useUnresolvedFileInstance.d.ts.map +1 -1
  269. package/dist/react/utils/useUnresolvedFileInstance.js +10 -11
  270. package/dist/react/utils/useUnresolvedFileInstance.js.map +1 -1
  271. package/dist/renderers/DiffHunksRenderer.d.ts +5 -5
  272. package/dist/renderers/DiffHunksRenderer.d.ts.map +1 -1
  273. package/dist/renderers/DiffHunksRenderer.js +73 -20
  274. package/dist/renderers/DiffHunksRenderer.js.map +1 -1
  275. package/dist/renderers/FileRenderer.d.ts +1 -3
  276. package/dist/renderers/FileRenderer.d.ts.map +1 -1
  277. package/dist/renderers/FileRenderer.js +23 -8
  278. package/dist/renderers/FileRenderer.js.map +1 -1
  279. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts +1 -2
  280. package/dist/renderers/UnresolvedFileHunksRenderer.d.ts.map +1 -1
  281. package/dist/renderers/UnresolvedFileHunksRenderer.js +1 -2
  282. package/dist/renderers/UnresolvedFileHunksRenderer.js.map +1 -1
  283. package/dist/shiki-stream/index.js +1 -2
  284. package/dist/shiki-stream/stream.d.ts +0 -1
  285. package/dist/shiki-stream/stream.d.ts.map +1 -1
  286. package/dist/shiki-stream/stream.js +1 -2
  287. package/dist/shiki-stream/stream.js.map +1 -1
  288. package/dist/shiki-stream/tokenizer.d.ts.map +1 -1
  289. package/dist/shiki-stream/tokenizer.js +1 -1
  290. package/dist/shiki-stream/tokenizer.js.map +1 -1
  291. package/dist/shiki-stream/types.d.ts +0 -1
  292. package/dist/shiki-stream/types.d.ts.map +1 -1
  293. package/dist/sprite.d.ts.map +1 -1
  294. package/dist/sprite.js +1 -1
  295. package/dist/ssr/FileDiffReact.d.ts.map +1 -1
  296. package/dist/ssr/FileDiffReact.js +4 -7
  297. package/dist/ssr/FileDiffReact.js.map +1 -1
  298. package/dist/ssr/index.d.ts +2 -2
  299. package/dist/ssr/index.js +1 -2
  300. package/dist/ssr/preloadDiffs.d.ts +1 -1
  301. package/dist/ssr/preloadDiffs.d.ts.map +1 -1
  302. package/dist/ssr/preloadDiffs.js +1 -2
  303. package/dist/ssr/preloadDiffs.js.map +1 -1
  304. package/dist/ssr/preloadFile.d.ts.map +1 -1
  305. package/dist/ssr/preloadFile.js +1 -2
  306. package/dist/ssr/preloadFile.js.map +1 -1
  307. package/dist/ssr/preloadPatchFile.d.ts.map +1 -1
  308. package/dist/ssr/preloadPatchFile.js +2 -3
  309. package/dist/ssr/preloadPatchFile.js.map +1 -1
  310. package/dist/ssr/renderHTML.d.ts +1 -1
  311. package/dist/ssr/renderHTML.d.ts.map +1 -1
  312. package/dist/ssr/renderHTML.js +1 -2
  313. package/dist/ssr/renderHTML.js.map +1 -1
  314. package/dist/string-import.d.ts +4 -0
  315. package/dist/string-import.d.ts.map +1 -1
  316. package/dist/style.js +3 -3
  317. package/dist/style.js.map +1 -1
  318. package/dist/types.d.ts +27 -6
  319. package/dist/types.d.ts.map +1 -1
  320. package/dist/utils/areDiffLineAnnotationsEqual.d.ts.map +1 -1
  321. package/dist/utils/areDiffLineAnnotationsEqual.js +1 -1
  322. package/dist/utils/areDiffLineAnnotationsEqual.js.map +1 -1
  323. package/dist/utils/areDiffRenderOptionsEqual.d.ts.map +1 -1
  324. package/dist/utils/areDiffRenderOptionsEqual.js +1 -2
  325. package/dist/utils/areDiffRenderOptionsEqual.js.map +1 -1
  326. package/dist/utils/areDiffTargetsEqual.d.ts.map +1 -1
  327. package/dist/utils/areDiffTargetsEqual.js +1 -1
  328. package/dist/utils/areDiffTargetsEqual.js.map +1 -1
  329. package/dist/utils/areFileRenderOptionsEqual.d.ts.map +1 -1
  330. package/dist/utils/areFileRenderOptionsEqual.js +1 -2
  331. package/dist/utils/areFileRenderOptionsEqual.js.map +1 -1
  332. package/dist/utils/areFilesEqual.d.ts.map +1 -1
  333. package/dist/utils/areFilesEqual.js +1 -1
  334. package/dist/utils/areFilesEqual.js.map +1 -1
  335. package/dist/utils/areHunkDataEqual.d.ts.map +1 -1
  336. package/dist/utils/areHunkDataEqual.js +1 -1
  337. package/dist/utils/areHunkDataEqual.js.map +1 -1
  338. package/dist/utils/areLineAnnotationsEqual.d.ts.map +1 -1
  339. package/dist/utils/areLineAnnotationsEqual.js +1 -1
  340. package/dist/utils/areLineAnnotationsEqual.js.map +1 -1
  341. package/dist/utils/areManagedSnapshotsEqual.d.ts.map +1 -1
  342. package/dist/utils/areManagedSnapshotsEqual.js +1 -1
  343. package/dist/utils/areManagedSnapshotsEqual.js.map +1 -1
  344. package/dist/utils/areMergeConflictActionsEqual.d.ts.map +1 -1
  345. package/dist/utils/areMergeConflictActionsEqual.js +1 -1
  346. package/dist/utils/areMergeConflictActionsEqual.js.map +1 -1
  347. package/dist/utils/areObjectsEqual.d.ts.map +1 -1
  348. package/dist/utils/areObjectsEqual.js +1 -1
  349. package/dist/utils/areObjectsEqual.js.map +1 -1
  350. package/dist/utils/areOptionsEqual.d.ts +0 -2
  351. package/dist/utils/areOptionsEqual.d.ts.map +1 -1
  352. package/dist/utils/areOptionsEqual.js +1 -2
  353. package/dist/utils/areOptionsEqual.js.map +1 -1
  354. package/dist/utils/arePrePropertiesEqual.d.ts.map +1 -1
  355. package/dist/utils/arePrePropertiesEqual.js +1 -1
  356. package/dist/utils/arePrePropertiesEqual.js.map +1 -1
  357. package/dist/utils/areRenderRangesEqual.d.ts.map +1 -1
  358. package/dist/utils/areRenderRangesEqual.js +1 -1
  359. package/dist/utils/areRenderRangesEqual.js.map +1 -1
  360. package/dist/utils/areSelectionPointsEqual.d.ts.map +1 -1
  361. package/dist/utils/areSelectionPointsEqual.js +1 -1
  362. package/dist/utils/areSelectionPointsEqual.js.map +1 -1
  363. package/dist/utils/areSelectionsEqual.d.ts.map +1 -1
  364. package/dist/utils/areSelectionsEqual.js +1 -1
  365. package/dist/utils/areSelectionsEqual.js.map +1 -1
  366. package/dist/utils/areThemesEqual.d.ts.map +1 -1
  367. package/dist/utils/areThemesEqual.js +1 -1
  368. package/dist/utils/areThemesEqual.js.map +1 -1
  369. package/dist/utils/areVirtualWindowSpecsEqual.d.ts.map +1 -1
  370. package/dist/utils/areVirtualWindowSpecsEqual.js +1 -1
  371. package/dist/utils/areVirtualWindowSpecsEqual.js.map +1 -1
  372. package/dist/utils/areWorkerStatsEqual.d.ts +0 -2
  373. package/dist/utils/areWorkerStatsEqual.d.ts.map +1 -1
  374. package/dist/utils/areWorkerStatsEqual.js +1 -1
  375. package/dist/utils/areWorkerStatsEqual.js.map +1 -1
  376. package/dist/utils/cleanLastNewline.d.ts.map +1 -1
  377. package/dist/utils/cleanLastNewline.js +1 -1
  378. package/dist/utils/cleanLastNewline.js.map +1 -1
  379. package/dist/utils/computeEstimatedDiffHeights.d.ts.map +1 -1
  380. package/dist/utils/computeEstimatedDiffHeights.js +1 -2
  381. package/dist/utils/computeEstimatedDiffHeights.js.map +1 -1
  382. package/dist/utils/computeFileOffsets.d.ts +9 -1
  383. package/dist/utils/computeFileOffsets.d.ts.map +1 -1
  384. package/dist/utils/computeFileOffsets.js +20 -2
  385. package/dist/utils/computeFileOffsets.js.map +1 -1
  386. package/dist/utils/computeVirtualFileMetrics.d.ts.map +1 -1
  387. package/dist/utils/computeVirtualFileMetrics.js +1 -2
  388. package/dist/utils/computeVirtualFileMetrics.js.map +1 -1
  389. package/dist/utils/createAnnotationElement.d.ts +1 -1
  390. package/dist/utils/createAnnotationElement.d.ts.map +1 -1
  391. package/dist/utils/createAnnotationElement.js +1 -2
  392. package/dist/utils/createAnnotationElement.js.map +1 -1
  393. package/dist/utils/createAnnotationWrapperNode.d.ts.map +1 -1
  394. package/dist/utils/createAnnotationWrapperNode.js +1 -1
  395. package/dist/utils/createAnnotationWrapperNode.js.map +1 -1
  396. package/dist/utils/createContentColumn.d.ts +1 -1
  397. package/dist/utils/createContentColumn.d.ts.map +1 -1
  398. package/dist/utils/createContentColumn.js +1 -2
  399. package/dist/utils/createContentColumn.js.map +1 -1
  400. package/dist/utils/createEmptyRowBuffer.d.ts +1 -1
  401. package/dist/utils/createEmptyRowBuffer.d.ts.map +1 -1
  402. package/dist/utils/createEmptyRowBuffer.js +1 -2
  403. package/dist/utils/createEmptyRowBuffer.js.map +1 -1
  404. package/dist/utils/createFileHeaderElement.d.ts +1 -1
  405. package/dist/utils/createFileHeaderElement.d.ts.map +1 -1
  406. package/dist/utils/createFileHeaderElement.js +6 -3
  407. package/dist/utils/createFileHeaderElement.js.map +1 -1
  408. package/dist/utils/createGutterUtilityContentNode.d.ts.map +1 -1
  409. package/dist/utils/createGutterUtilityContentNode.js +1 -1
  410. package/dist/utils/createGutterUtilityContentNode.js.map +1 -1
  411. package/dist/utils/createGutterUtilityElement.d.ts +1 -1
  412. package/dist/utils/createGutterUtilityElement.d.ts.map +1 -1
  413. package/dist/utils/createGutterUtilityElement.js +1 -2
  414. package/dist/utils/createGutterUtilityElement.js.map +1 -1
  415. package/dist/utils/createNoNewlineElement.d.ts +1 -1
  416. package/dist/utils/createNoNewlineElement.d.ts.map +1 -1
  417. package/dist/utils/createNoNewlineElement.js +1 -2
  418. package/dist/utils/createNoNewlineElement.js.map +1 -1
  419. package/dist/utils/createPreElement.d.ts +1 -1
  420. package/dist/utils/createPreElement.d.ts.map +1 -1
  421. package/dist/utils/createPreElement.js +1 -2
  422. package/dist/utils/createPreElement.js.map +1 -1
  423. package/dist/utils/createRowNodes.d.ts.map +1 -1
  424. package/dist/utils/createRowNodes.js +1 -1
  425. package/dist/utils/createRowNodes.js.map +1 -1
  426. package/dist/utils/createSeparator.d.ts +1 -1
  427. package/dist/utils/createSeparator.d.ts.map +1 -1
  428. package/dist/utils/createSeparator.js +1 -2
  429. package/dist/utils/createSeparator.js.map +1 -1
  430. package/dist/utils/createSpanNodeFromToken.d.ts.map +1 -1
  431. package/dist/utils/createSpanNodeFromToken.js +1 -2
  432. package/dist/utils/createSpanNodeFromToken.js.map +1 -1
  433. package/dist/utils/createStyleElement.d.ts +1 -1
  434. package/dist/utils/createStyleElement.d.ts.map +1 -1
  435. package/dist/utils/createStyleElement.js +1 -2
  436. package/dist/utils/createStyleElement.js.map +1 -1
  437. package/dist/utils/createTransformerWithState.d.ts.map +1 -1
  438. package/dist/utils/createTransformerWithState.js +1 -2
  439. package/dist/utils/createTransformerWithState.js.map +1 -1
  440. package/dist/utils/createUnsafeCSSStyleNode.d.ts.map +1 -1
  441. package/dist/utils/createUnsafeCSSStyleNode.js +1 -2
  442. package/dist/utils/createUnsafeCSSStyleNode.js.map +1 -1
  443. package/dist/utils/createWindowFromScrollPosition.d.ts.map +1 -1
  444. package/dist/utils/createWindowFromScrollPosition.js +5 -5
  445. package/dist/utils/createWindowFromScrollPosition.js.map +1 -1
  446. package/dist/utils/cssWrappers.d.ts.map +1 -1
  447. package/dist/utils/cssWrappers.js +2 -3
  448. package/dist/utils/cssWrappers.js.map +1 -1
  449. package/dist/utils/detachString.d.ts.map +1 -1
  450. package/dist/utils/detachString.js +1 -1
  451. package/dist/utils/detachString.js.map +1 -1
  452. package/dist/utils/diffAcceptRejectHunk.d.ts.map +1 -1
  453. package/dist/utils/diffAcceptRejectHunk.js +1 -2
  454. package/dist/utils/diffAcceptRejectHunk.js.map +1 -1
  455. package/dist/utils/formatCSSVariablePrefix.d.ts.map +1 -1
  456. package/dist/utils/formatCSSVariablePrefix.js +1 -1
  457. package/dist/utils/formatCSSVariablePrefix.js.map +1 -1
  458. package/dist/utils/getDiffHunksRendererOptions.d.ts.map +1 -1
  459. package/dist/utils/getDiffHunksRendererOptions.js +1 -1
  460. package/dist/utils/getDiffHunksRendererOptions.js.map +1 -1
  461. package/dist/utils/getFileRendererOptions.d.ts.map +1 -1
  462. package/dist/utils/getFileRendererOptions.js +1 -1
  463. package/dist/utils/getFileRendererOptions.js.map +1 -1
  464. package/dist/utils/getFiletypeFromFileName.d.ts.map +1 -1
  465. package/dist/utils/getFiletypeFromFileName.js +1 -1
  466. package/dist/utils/getFiletypeFromFileName.js.map +1 -1
  467. package/dist/utils/getHighlighterOptions.d.ts.map +1 -1
  468. package/dist/utils/getHighlighterOptions.js +1 -2
  469. package/dist/utils/getHighlighterOptions.js.map +1 -1
  470. package/dist/utils/getHighlighterThemeStyles.d.ts.map +1 -1
  471. package/dist/utils/getHighlighterThemeStyles.js +1 -2
  472. package/dist/utils/getHighlighterThemeStyles.js.map +1 -1
  473. package/dist/utils/getHunkSeparatorSlotName.d.ts.map +1 -1
  474. package/dist/utils/getHunkSeparatorSlotName.js +1 -1
  475. package/dist/utils/getHunkSeparatorSlotName.js.map +1 -1
  476. package/dist/utils/getIconForType.d.ts.map +1 -1
  477. package/dist/utils/getIconForType.js +1 -1
  478. package/dist/utils/getIconForType.js.map +1 -1
  479. package/dist/utils/getLineAnnotationName.d.ts.map +1 -1
  480. package/dist/utils/getLineAnnotationName.js +1 -1
  481. package/dist/utils/getLineAnnotationName.js.map +1 -1
  482. package/dist/utils/getLineEndingType.d.ts.map +1 -1
  483. package/dist/utils/getLineEndingType.js +1 -1
  484. package/dist/utils/getLineEndingType.js.map +1 -1
  485. package/dist/utils/getLineNodes.d.ts +1 -1
  486. package/dist/utils/getLineNodes.d.ts.map +1 -1
  487. package/dist/utils/getLineNodes.js +1 -1
  488. package/dist/utils/getLineNodes.js.map +1 -1
  489. package/dist/utils/getMergeConflictActionSlotName.d.ts.map +1 -1
  490. package/dist/utils/getMergeConflictActionSlotName.js +1 -1
  491. package/dist/utils/getMergeConflictActionSlotName.js.map +1 -1
  492. package/dist/utils/getMergeConflictLineTypes.d.ts.map +1 -1
  493. package/dist/utils/getMergeConflictLineTypes.js +1 -2
  494. package/dist/utils/getMergeConflictLineTypes.js.map +1 -1
  495. package/dist/utils/getOrCreateCodeNode.d.ts.map +1 -1
  496. package/dist/utils/getOrCreateCodeNode.js +1 -1
  497. package/dist/utils/getOrCreateCodeNode.js.map +1 -1
  498. package/dist/utils/getSingularPatch.d.ts.map +1 -1
  499. package/dist/utils/getSingularPatch.js +1 -2
  500. package/dist/utils/getSingularPatch.js.map +1 -1
  501. package/dist/utils/getThemes.d.ts.map +1 -1
  502. package/dist/utils/getThemes.js +1 -2
  503. package/dist/utils/getThemes.js.map +1 -1
  504. package/dist/utils/getTotalLineCountFromHunks.d.ts.map +1 -1
  505. package/dist/utils/getTotalLineCountFromHunks.js +1 -1
  506. package/dist/utils/getTotalLineCountFromHunks.js.map +1 -1
  507. package/dist/utils/hast_utils.d.ts +1 -1
  508. package/dist/utils/hast_utils.d.ts.map +1 -1
  509. package/dist/utils/hast_utils.js +1 -1
  510. package/dist/utils/hast_utils.js.map +1 -1
  511. package/dist/utils/hostTheme.d.ts.map +1 -1
  512. package/dist/utils/hostTheme.js +1 -2
  513. package/dist/utils/hostTheme.js.map +1 -1
  514. package/dist/utils/includesFileAnnotations.d.ts +17 -0
  515. package/dist/utils/includesFileAnnotations.d.ts.map +1 -0
  516. package/dist/utils/includesFileAnnotations.js +19 -0
  517. package/dist/utils/includesFileAnnotations.js.map +1 -0
  518. package/dist/utils/isDefaultRenderRange.d.ts.map +1 -1
  519. package/dist/utils/isDefaultRenderRange.js +1 -1
  520. package/dist/utils/isDefaultRenderRange.js.map +1 -1
  521. package/dist/utils/isDiffPlainText.d.ts.map +1 -1
  522. package/dist/utils/isDiffPlainText.js +1 -2
  523. package/dist/utils/isDiffPlainText.js.map +1 -1
  524. package/dist/utils/isFilePlainText.d.ts.map +1 -1
  525. package/dist/utils/isFilePlainText.js +1 -2
  526. package/dist/utils/isFilePlainText.js.map +1 -1
  527. package/dist/utils/isStyleNode.d.ts.map +1 -1
  528. package/dist/utils/isStyleNode.js +1 -1
  529. package/dist/utils/isStyleNode.js.map +1 -1
  530. package/dist/utils/isWorkerContext.d.ts.map +1 -1
  531. package/dist/utils/isWorkerContext.js +1 -1
  532. package/dist/utils/isWorkerContext.js.map +1 -1
  533. package/dist/utils/iterateOverDiff.d.ts.map +1 -1
  534. package/dist/utils/iterateOverDiff.js +44 -45
  535. package/dist/utils/iterateOverDiff.js.map +1 -1
  536. package/dist/utils/normalizeDiffResolution.d.ts.map +1 -1
  537. package/dist/utils/normalizeDiffResolution.js +1 -1
  538. package/dist/utils/normalizeDiffResolution.js.map +1 -1
  539. package/dist/utils/parseDiffDecorations.d.ts.map +1 -1
  540. package/dist/utils/parseDiffDecorations.js +1 -2
  541. package/dist/utils/parseDiffDecorations.js.map +1 -1
  542. package/dist/utils/parseDiffFromFile.d.ts +0 -1
  543. package/dist/utils/parseDiffFromFile.d.ts.map +1 -1
  544. package/dist/utils/parseDiffFromFile.js +1 -2
  545. package/dist/utils/parseDiffFromFile.js.map +1 -1
  546. package/dist/utils/parseLineType.d.ts.map +1 -1
  547. package/dist/utils/parseLineType.js +1 -1
  548. package/dist/utils/parseLineType.js.map +1 -1
  549. package/dist/utils/parseMergeConflictDiffFromFile.d.ts.map +1 -1
  550. package/dist/utils/parseMergeConflictDiffFromFile.js +5 -5
  551. package/dist/utils/parseMergeConflictDiffFromFile.js.map +1 -1
  552. package/dist/utils/parsePatchFiles.d.ts.map +1 -1
  553. package/dist/utils/parsePatchFiles.js +6 -7
  554. package/dist/utils/parsePatchFiles.js.map +1 -1
  555. package/dist/utils/prefersReducedMotion.d.ts.map +1 -1
  556. package/dist/utils/prefersReducedMotion.js +1 -1
  557. package/dist/utils/prefersReducedMotion.js.map +1 -1
  558. package/dist/utils/prerenderHTMLIfNecessary.d.ts.map +1 -1
  559. package/dist/utils/prerenderHTMLIfNecessary.js +1 -1
  560. package/dist/utils/prerenderHTMLIfNecessary.js.map +1 -1
  561. package/dist/utils/processLine.d.ts +1 -1
  562. package/dist/utils/processLine.d.ts.map +1 -1
  563. package/dist/utils/processLine.js +1 -2
  564. package/dist/utils/processLine.js.map +1 -1
  565. package/dist/utils/renderDiffWithHighlighter.d.ts.map +1 -1
  566. package/dist/utils/renderDiffWithHighlighter.js +8 -7
  567. package/dist/utils/renderDiffWithHighlighter.js.map +1 -1
  568. package/dist/utils/renderFileWithHighlighter.d.ts.map +1 -1
  569. package/dist/utils/renderFileWithHighlighter.js +5 -4
  570. package/dist/utils/renderFileWithHighlighter.js.map +1 -1
  571. package/dist/utils/resolveConflict.d.ts.map +1 -1
  572. package/dist/utils/resolveConflict.js +1 -2
  573. package/dist/utils/resolveConflict.js.map +1 -1
  574. package/dist/utils/resolveRegion.d.ts.map +1 -1
  575. package/dist/utils/resolveRegion.js +1 -1
  576. package/dist/utils/resolveRegion.js.map +1 -1
  577. package/dist/utils/roundToDevicePixel.d.ts.map +1 -1
  578. package/dist/utils/roundToDevicePixel.js +1 -1
  579. package/dist/utils/roundToDevicePixel.js.map +1 -1
  580. package/dist/utils/scrollbarGutter.d.ts.map +1 -1
  581. package/dist/utils/scrollbarGutter.js +1 -2
  582. package/dist/utils/scrollbarGutter.js.map +1 -1
  583. package/dist/utils/setLanguageOverride.d.ts.map +1 -1
  584. package/dist/utils/setLanguageOverride.js +1 -1
  585. package/dist/utils/setLanguageOverride.js.map +1 -1
  586. package/dist/utils/setWrapperNodeProps.d.ts.map +1 -1
  587. package/dist/utils/setWrapperNodeProps.js +1 -1
  588. package/dist/utils/setWrapperNodeProps.js.map +1 -1
  589. package/dist/utils/shouldUseTokenTransformer.d.ts.map +1 -1
  590. package/dist/utils/shouldUseTokenTransformer.js +1 -1
  591. package/dist/utils/shouldUseTokenTransformer.js.map +1 -1
  592. package/dist/utils/splitFileContents.d.ts.map +1 -1
  593. package/dist/utils/splitFileContents.js +1 -2
  594. package/dist/utils/splitFileContents.js.map +1 -1
  595. package/dist/utils/trimPatchContext.d.ts.map +1 -1
  596. package/dist/utils/trimPatchContext.js +1 -2
  597. package/dist/utils/trimPatchContext.js.map +1 -1
  598. package/dist/utils/updateDiffHunks.d.ts +2 -1
  599. package/dist/utils/updateDiffHunks.d.ts.map +1 -1
  600. package/dist/utils/updateDiffHunks.js +22 -3
  601. package/dist/utils/updateDiffHunks.js.map +1 -1
  602. package/dist/utils/virtualDiffLayout.d.ts.map +1 -1
  603. package/dist/utils/virtualDiffLayout.js +1 -2
  604. package/dist/utils/virtualDiffLayout.js.map +1 -1
  605. package/dist/utils/wrapTokenFragments.d.ts +1 -1
  606. package/dist/utils/wrapTokenFragments.d.ts.map +1 -1
  607. package/dist/utils/wrapTokenFragments.js +1 -2
  608. package/dist/utils/wrapTokenFragments.js.map +1 -1
  609. package/dist/worker/WorkerPoolManager.d.ts.map +1 -1
  610. package/dist/worker/WorkerPoolManager.js +5 -5
  611. package/dist/worker/WorkerPoolManager.js.map +1 -1
  612. package/dist/worker/getOrCreateWorkerPoolSingleton.d.ts.map +1 -1
  613. package/dist/worker/getOrCreateWorkerPoolSingleton.js +1 -2
  614. package/dist/worker/getOrCreateWorkerPoolSingleton.js.map +1 -1
  615. package/dist/worker/index.js +1 -2
  616. package/dist/worker/types.d.ts.map +1 -1
  617. package/dist/worker/wasm-B9ZqxnKj.js +8 -0
  618. package/dist/worker/wasm-B9ZqxnKj.js.map +1 -0
  619. package/dist/worker/worker-portable.js +2989 -6577
  620. package/dist/worker/worker-portable.js.map +1 -1
  621. package/dist/worker/worker.js +97 -127
  622. package/dist/worker/worker.js.map +1 -1
  623. package/package.json +14 -21
  624. package/dist/worker/wasm-BaDzIkIn.js +0 -10
  625. package/dist/worker/wasm-BaDzIkIn.js.map +0 -1
@@ -1,4 +1,11 @@
1
1
  //#region src/editor/platform.d.ts
2
+ /**
3
+ * Clears the cached platform/browser detection. Detection is memoized on first
4
+ * call, so a test process that swaps `navigator` (e.g. to exercise Linux or
5
+ * Safari behavior) must reset it; otherwise the value cached by an earlier test
6
+ * leaks across tests and no longer matches the active navigator.
7
+ */
8
+ declare function resetPlatformDetectionForTests(): void;
2
9
  declare function isMacLike(): boolean;
3
10
  declare function isLinux(): boolean;
4
11
  declare function isSafari(): boolean;
@@ -8,5 +15,5 @@ declare function isPrimaryModifier({
8
15
  }: MouseEvent | KeyboardEvent, isMac?: boolean): boolean;
9
16
  declare function isMoveCursorShortcut(e: KeyboardEvent): 'up' | 'down' | 'left' | 'right' | 'start' | 'textStart' | 'end' | undefined;
10
17
  //#endregion
11
- export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari };
18
+ export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari, resetPlatformDetectionForTests };
12
19
  //# sourceMappingURL=platform.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","names":["isMacLike","isLinux","isSafari","isPrimaryModifier","metaKey","ctrlKey","MouseEvent","KeyboardEvent","isMoveCursorShortcut"],"sources":["../../src/editor/platform.d.ts"],"sourcesContent":["export declare function isMacLike(): boolean;\nexport declare function isLinux(): boolean;\nexport declare function isSafari(): boolean;\nexport declare function isPrimaryModifier({ metaKey, ctrlKey }: MouseEvent | KeyboardEvent, isMac?: boolean): boolean;\nexport declare function isMoveCursorShortcut(e: KeyboardEvent): 'up' | 'down' | 'left' | 'right' | 'start' | 'textStart' | 'end' | undefined;\n//# sourceMappingURL=platform.d.ts.map"],"mappings":";iBAAwBA,SAAAA,CAAAA;AAAAA,iBACAC,OAAAA,CAAAA,CADS,EAAA,OAAA;AACTA,iBACAC,QAAAA,CAAAA,CADO,EAAA,OAAA;AACPA,iBACAC,iBAAAA,CADQ;EAAA,OAAA;EAAA;AAAA,CAAA,EACgCG,UADhC,GAC6CC,aAD7C,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAAA,OAAA;AACRJ,iBACAK,oBAAAA,CADiB,CAAA,EACOD,aADP,CAAA,EAAA,IAAA,GAAA,MAAA,GAAA,MAAA,GAAA,OAAA,GAAA,OAAA,GAAA,WAAA,GAAA,KAAA,GAAA,SAAA"}
1
+ {"version":3,"file":"platform.d.ts","names":[],"sources":["../../src/editor/platform.ts"],"mappings":";;AAUA;;;;AAA8C;iBAA9B,8BAAA;AAAA,iBAMA,SAAA;AAAA,iBAMA,OAAA;AAAA,iBAIA,QAAA;AAAA,iBAMA,iBAAA;EACZ,OAAA;EAAS;AAAA,GAAW,UAAA,GAAa,aAAA,EACnC,KAAA;AAAA,iBAKc,oBAAA,CACd,CAAgB,EAAb,aAAa"}
@@ -2,6 +2,17 @@
2
2
  let _isMacLike = void 0;
3
3
  let _isLinux = void 0;
4
4
  let _isSafari = void 0;
5
+ /**
6
+ * Clears the cached platform/browser detection. Detection is memoized on first
7
+ * call, so a test process that swaps `navigator` (e.g. to exercise Linux or
8
+ * Safari behavior) must reset it; otherwise the value cached by an earlier test
9
+ * leaks across tests and no longer matches the active navigator.
10
+ */
11
+ function resetPlatformDetectionForTests() {
12
+ _isMacLike = void 0;
13
+ _isLinux = void 0;
14
+ _isSafari = void 0;
15
+ }
5
16
  function isMacLike() {
6
17
  return _isMacLike ??= /macOS|MacIntel|iPhone|iPad|iPod/i.test(getPlatform());
7
18
  }
@@ -15,7 +26,7 @@ function isPrimaryModifier({ metaKey, ctrlKey }, isMac = isMacLike()) {
15
26
  return isMac ? metaKey && !ctrlKey : ctrlKey && !metaKey;
16
27
  }
17
28
  function isMoveCursorShortcut(e) {
18
- if ((isMacLike() || isLinux()) && e.ctrlKey && !e.altKey && !e.metaKey) switch (e.key) {
29
+ if (isMacLike() && e.ctrlKey && !e.altKey && !e.metaKey) switch (e.key) {
19
30
  case "a": return "start";
20
31
  case "e": return "end";
21
32
  case "p": return "up";
@@ -35,10 +46,10 @@ function isMoveCursorShortcut(e) {
35
46
  }
36
47
  }
37
48
  function getPlatform() {
38
- const navigator$1 = globalThis.navigator;
39
- return navigator$1?.platform ?? navigator$1?.userAgentData?.platform ?? "unknown";
49
+ const navigator = globalThis.navigator;
50
+ return navigator?.platform ?? navigator?.userAgentData?.platform ?? "unknown";
40
51
  }
41
-
42
52
  //#endregion
43
- export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari };
53
+ export { isLinux, isMacLike, isMoveCursorShortcut, isPrimaryModifier, isSafari, resetPlatformDetectionForTests };
54
+
44
55
  //# sourceMappingURL=platform.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","names":["_isMacLike: boolean | undefined","_isLinux: boolean | undefined","_isSafari: boolean | undefined","navigator"],"sources":["../../src/editor/platform.ts"],"sourcesContent":["let _isMacLike: boolean | undefined = undefined;\nlet _isLinux: boolean | undefined = undefined;\nlet _isSafari: boolean | undefined = undefined;\n\nexport function isMacLike(): boolean {\n return (_isMacLike ??= /macOS|MacIntel|iPhone|iPad|iPod/i.test(\n getPlatform()\n ));\n}\n\nexport function isLinux(): boolean {\n return (_isLinux ??= /Linux/i.test(getPlatform()));\n}\n\nexport function isSafari(): boolean {\n return (_isSafari ??=\n ('safari' in window && 'pushNotification' in (window as any).safari) ||\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent));\n}\n\nexport function isPrimaryModifier(\n { metaKey, ctrlKey }: MouseEvent | KeyboardEvent,\n isMac: boolean = isMacLike()\n): boolean {\n return isMac ? metaKey && !ctrlKey : ctrlKey && !metaKey;\n}\n\nexport function isMoveCursorShortcut(\n e: KeyboardEvent\n):\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'start'\n | 'textStart'\n | 'end'\n | undefined {\n // emacs key bindings\n if ((isMacLike() || isLinux()) && e.ctrlKey && !e.altKey && !e.metaKey) {\n switch (e.key) {\n case 'a':\n return 'start';\n case 'e':\n return 'end';\n case 'p':\n return 'up';\n case 'n':\n return 'down';\n case 'f':\n return 'right';\n case 'b':\n return 'left';\n }\n }\n\n if (!e.altKey && !e.ctrlKey && !e.metaKey) {\n if (e.key === 'ArrowUp') {\n return 'up';\n } else if (e.key === 'ArrowDown') {\n return 'down';\n } else if (e.key === 'ArrowLeft') {\n return 'left';\n } else if (e.key === 'ArrowRight') {\n return 'right';\n }\n }\n\n if (isPrimaryModifier(e)) {\n if (e.key === 'ArrowLeft') {\n return 'textStart';\n } else if (e.key === 'ArrowRight') {\n return 'end';\n }\n }\n\n return undefined;\n}\n\nfunction getPlatform(): string {\n const navigator = globalThis.navigator as Navigator & {\n userAgentData?: { platform?: string };\n };\n return navigator?.platform ?? navigator?.userAgentData?.platform ?? 'unknown';\n}\n"],"mappings":";AAAA,IAAIA,aAAkC;AACtC,IAAIC,WAAgC;AACpC,IAAIC,YAAiC;AAErC,SAAgB,YAAqB;AACnC,QAAQ,eAAe,mCAAmC,KACxD,aAAa,CACd;;AAGH,SAAgB,UAAmB;AACjC,QAAQ,aAAa,SAAS,KAAK,aAAa,CAAC;;AAGnD,SAAgB,WAAoB;AAClC,QAAQ,cACL,YAAY,UAAU,sBAAuB,OAAe,UAC7D,iCAAiC,KAAK,UAAU,UAAU;;AAG9D,SAAgB,kBACd,EAAE,SAAS,WACX,QAAiB,WAAW,EACnB;AACT,QAAO,QAAQ,WAAW,CAAC,UAAU,WAAW,CAAC;;AAGnD,SAAgB,qBACd,GASY;AAEZ,MAAK,WAAW,IAAI,SAAS,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,QAC7D,SAAQ,EAAE,KAAV;EACE,KAAK,IACH,QAAO;EACT,KAAK,IACH,QAAO;EACT,KAAK,IACH,QAAO;EACT,KAAK,IACH,QAAO;EACT,KAAK,IACH,QAAO;EACT,KAAK,IACH,QAAO;;AAIb,KAAI,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE,SAChC;MAAI,EAAE,QAAQ,UACZ,QAAO;WACE,EAAE,QAAQ,YACnB,QAAO;WACE,EAAE,QAAQ,YACnB,QAAO;WACE,EAAE,QAAQ,aACnB,QAAO;;AAIX,KAAI,kBAAkB,EAAE,EACtB;MAAI,EAAE,QAAQ,YACZ,QAAO;WACE,EAAE,QAAQ,aACnB,QAAO;;;AAOb,SAAS,cAAsB;CAC7B,MAAMC,cAAY,WAAW;AAG7B,QAAOA,aAAW,YAAYA,aAAW,eAAe,YAAY"}
1
+ {"version":3,"file":"platform.js","names":[],"sources":["../../src/editor/platform.ts"],"sourcesContent":["let _isMacLike: boolean | undefined = undefined;\nlet _isLinux: boolean | undefined = undefined;\nlet _isSafari: boolean | undefined = undefined;\n\n/**\n * Clears the cached platform/browser detection. Detection is memoized on first\n * call, so a test process that swaps `navigator` (e.g. to exercise Linux or\n * Safari behavior) must reset it; otherwise the value cached by an earlier test\n * leaks across tests and no longer matches the active navigator.\n */\nexport function resetPlatformDetectionForTests(): void {\n _isMacLike = undefined;\n _isLinux = undefined;\n _isSafari = undefined;\n}\n\nexport function isMacLike(): boolean {\n return (_isMacLike ??= /macOS|MacIntel|iPhone|iPad|iPod/i.test(\n getPlatform()\n ));\n}\n\nexport function isLinux(): boolean {\n return (_isLinux ??= /Linux/i.test(getPlatform()));\n}\n\nexport function isSafari(): boolean {\n return (_isSafari ??=\n ('safari' in window && 'pushNotification' in (window as any).safari) ||\n /^((?!chrome|android).)*safari/i.test(navigator.userAgent));\n}\n\nexport function isPrimaryModifier(\n { metaKey, ctrlKey }: MouseEvent | KeyboardEvent,\n isMac: boolean = isMacLike()\n): boolean {\n return isMac ? metaKey && !ctrlKey : ctrlKey && !metaKey;\n}\n\nexport function isMoveCursorShortcut(\n e: KeyboardEvent\n):\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'start'\n | 'textStart'\n | 'end'\n | undefined {\n // emacs key bindings\n if (isMacLike() && e.ctrlKey && !e.altKey && !e.metaKey) {\n switch (e.key) {\n case 'a':\n return 'start';\n case 'e':\n return 'end';\n case 'p':\n return 'up';\n case 'n':\n return 'down';\n case 'f':\n return 'right';\n case 'b':\n return 'left';\n }\n }\n\n if (!e.altKey && !e.ctrlKey && !e.metaKey) {\n if (e.key === 'ArrowUp') {\n return 'up';\n } else if (e.key === 'ArrowDown') {\n return 'down';\n } else if (e.key === 'ArrowLeft') {\n return 'left';\n } else if (e.key === 'ArrowRight') {\n return 'right';\n }\n }\n\n if (isPrimaryModifier(e)) {\n if (e.key === 'ArrowLeft') {\n return 'textStart';\n } else if (e.key === 'ArrowRight') {\n return 'end';\n }\n }\n\n return undefined;\n}\n\nfunction getPlatform(): string {\n const navigator = globalThis.navigator as Navigator & {\n userAgentData?: { platform?: string };\n };\n return navigator?.platform ?? navigator?.userAgentData?.platform ?? 'unknown';\n}\n"],"mappings":";AAAA,IAAI,aAAkC,KAAA;AACtC,IAAI,WAAgC,KAAA;AACpC,IAAI,YAAiC,KAAA;;;;;;;AAQrC,SAAgB,iCAAuC;CACrD,aAAa,KAAA;CACb,WAAW,KAAA;CACX,YAAY,KAAA;AACd;AAEA,SAAgB,YAAqB;CACnC,OAAQ,eAAe,mCAAmC,KACxD,YAAY,CACd;AACF;AAEA,SAAgB,UAAmB;CACjC,OAAQ,aAAa,SAAS,KAAK,YAAY,CAAC;AAClD;AAEA,SAAgB,WAAoB;CAClC,OAAQ,cACL,YAAY,UAAU,sBAAuB,OAAe,UAC7D,iCAAiC,KAAK,UAAU,SAAS;AAC7D;AAEA,SAAgB,kBACd,EAAE,SAAS,WACX,QAAiB,UAAU,GAClB;CACT,OAAO,QAAQ,WAAW,CAAC,UAAU,WAAW,CAAC;AACnD;AAEA,SAAgB,qBACd,GASY;CAEZ,IAAI,UAAU,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,SAC9C,QAAQ,EAAE,KAAV;EACE,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;CACX;CAGF,IAAI,CAAC,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,EAAE;MAC5B,EAAE,QAAQ,WACZ,OAAO;OACF,IAAI,EAAE,QAAQ,aACnB,OAAO;OACF,IAAI,EAAE,QAAQ,aACnB,OAAO;OACF,IAAI,EAAE,QAAQ,cACnB,OAAO;CAAA;CAIX,IAAI,kBAAkB,CAAC;MACjB,EAAE,QAAQ,aACZ,OAAO;OACF,IAAI,EAAE,QAAQ,cACnB,OAAO;CAAA;AAKb;AAEA,SAAS,cAAsB;CAC7B,MAAM,YAAY,WAAW;CAG7B,OAAO,WAAW,YAAY,WAAW,eAAe,YAAY;AACtE"}
@@ -1,7 +1,8 @@
1
- import { TextDocument } from "./textDocument.js";
1
+ import { ResolvedTextEdit, TextDocument } from "./textDocument.js";
2
2
 
3
3
  //#region src/editor/searchPanel.d.ts
4
4
  type MatchRange = [startOffset: number, endOffset: number];
5
+ type SearchPanelMode = 'find' | 'replace';
5
6
  interface SearchParams {
6
7
  text: string;
7
8
  replaceText: string;
@@ -13,17 +14,26 @@ interface SearchPanelOptions {
13
14
  textDocument: TextDocument<unknown>;
14
15
  containerElement: HTMLElement;
15
16
  defaultQuery: string;
17
+ mode?: SearchPanelMode;
16
18
  initialMatch?: MatchRange;
17
19
  scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;
18
- onUpdate: (matches: MatchRange[]) => MatchRange | undefined;
20
+ applyReplace: (edits: ResolvedTextEdit[]) => void;
21
+ onUpdate: (matches: MatchRange[], options?: {
22
+ syncSelection?: boolean;
23
+ }) => MatchRange | undefined;
19
24
  onClose: () => void;
20
25
  }
21
26
  declare class SearchPanelWidget {
22
27
  #private;
23
28
  constructor(options: SearchPanelOptions);
24
29
  focus(): void;
30
+ navigate(findPrevious: boolean): void;
31
+ updateMatches(options?: {
32
+ syncSelection?: boolean;
33
+ }): void;
34
+ setMode(mode: SearchPanelMode): void;
25
35
  cleanup(): void;
26
36
  }
27
37
  //#endregion
28
- export { MatchRange, SearchPanelOptions, SearchPanelWidget, SearchParams };
38
+ export { MatchRange, SearchPanelMode, SearchPanelOptions, SearchPanelWidget, SearchParams };
29
39
  //# sourceMappingURL=searchPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchPanel.d.ts","names":["TextDocument","MatchRange","SearchParams","SearchPanelOptions","HTMLElement","SearchPanelWidget"],"sources":["../../src/editor/searchPanel.d.ts"],"sourcesContent":["import type { TextDocument } from './textDocument';\nexport type MatchRange = [startOffset: number, endOffset: number];\nexport interface SearchParams {\n text: string;\n replaceText: string;\n caseSensitive: boolean;\n wholeWord: boolean;\n regex: boolean;\n}\nexport interface SearchPanelOptions {\n textDocument: TextDocument<unknown>;\n containerElement: HTMLElement;\n defaultQuery: string;\n initialMatch?: MatchRange;\n scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;\n onUpdate: (matches: MatchRange[]) => MatchRange | undefined;\n onClose: () => void;\n}\nexport declare class SearchPanelWidget {\n #private;\n constructor(options: SearchPanelOptions);\n focus(): void;\n cleanup(): void;\n}\n//# sourceMappingURL=searchPanel.d.ts.map"],"mappings":";;;KACYC,UAAAA;UACKC,YAAAA;EADLD,IAAAA,EAAAA,MAAAA;EACKC,WAAAA,EAAAA,MAAY;EAOZC,aAAAA,EAAAA,OAAkB;EACjBH,SAAAA,EAAAA,OAAAA;EACII,KAAAA,EAAAA,OAAAA;;AAGSH,UALdE,kBAAAA,CAKcF;EACPA,YAAAA,EALND,YAKMC,CAAAA,OAAAA,CAAAA;EAAiBA,gBAAAA,EAJnBG,WAImBH;EAAU,YAAA,EAAA,MAAA;EAG9BI,YAAAA,CAAAA,EALFJ,UAKmB;6BAJPA;sBACPA,iBAAiBA;;;cAGpBI,iBAAAA;;uBAEIF"}
1
+ {"version":3,"file":"searchPanel.d.ts","names":[],"sources":["../../src/editor/searchPanel.ts"],"mappings":";;;KAOY,UAAA,IAAc,WAAA,UAAqB,SAAS;AAAA,KAE5C,eAAA;AAAA,UAEK,YAAA;EACf,IAAA;EACA,WAAA;EACA,aAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,kBAAA;EACf,YAAA,EAAc,YAAA;EACd,gBAAA,EAAkB,WAAA;EAClB,YAAA;EACA,IAAA,GAAO,eAAA;EACP,YAAA,GAAe,UAAA;EACf,aAAA,GAAgB,SAAA,EAAW,UAAA,EAAY,WAAA;EACvC,YAAA,GAAe,KAAA,EAAO,gBAAA;EACtB,QAAA,GACE,OAAA,EAAS,UAAA,IACT,OAAA;IAAY,aAAA;EAAA,MACT,UAAA;EACL,OAAA;AAAA;AAAA,cAGW,iBAAA;EAAA;EAOX,WAAA,CAAY,OAAA,EAAS,kBAAA;EAuYrB,KAAA;EAIA,QAAA,CAAS,YAAA;EAIT,aAAA,CAAc,OAAA;IAAY,aAAA;EAAA;EAI1B,OAAA,CAAQ,IAAA,EAAM,eAAe;EAI7B,OAAA;AAAA"}
@@ -1,13 +1,17 @@
1
1
  import { isPrimaryModifier } from "./platform.js";
2
+ import { resolveFindAgainShortcut } from "./command.js";
2
3
  import { h } from "./utils.js";
4
+ import { buildSearchReplacementText } from "./pieceTable.js";
3
5
  import { getEditorIconSvg } from "./sprite.js";
4
-
5
6
  //#region src/editor/searchPanel.ts
6
7
  var SearchPanelWidget = class {
7
8
  #container;
8
9
  #inputElement;
10
+ #updateMatches;
11
+ #applyMode;
12
+ #navigate;
9
13
  constructor(options) {
10
- const { textDocument, containerElement, defaultQuery, initialMatch, scrollToMatch, onUpdate, onClose } = options;
14
+ const { textDocument, containerElement, defaultQuery, mode = "find", initialMatch, scrollToMatch, applyReplace, onUpdate, onClose } = options;
11
15
  const searchParams = {
12
16
  text: defaultQuery,
13
17
  replaceText: "",
@@ -19,28 +23,38 @@ var SearchPanelWidget = class {
19
23
  all: [],
20
24
  current: void 0
21
25
  };
22
- const matchResultElement = h("div", { dataset: "matches" });
23
- const updateMatches = () => {
26
+ const matchResultElement = h("div", {
27
+ dataset: {
28
+ matches: "",
29
+ noMatches: ""
30
+ },
31
+ textContent: "No results"
32
+ });
33
+ const updateMatches = (options) => {
24
34
  matches.all = searchParams.text !== "" ? textDocument.search(searchParams) : [];
25
- this.#container.querySelectorAll("[data-disabled]").forEach((element) => {
26
- element.dataset.disabled = String(matches.all.length === 0);
27
- });
35
+ const noMatches = matches.all.length === 0;
36
+ prevButton.disabled = noMatches;
37
+ nextButton.disabled = noMatches;
28
38
  if (searchParams.text === "") {
29
- matchResultElement.textContent = "";
30
- delete matchResultElement.dataset.noMatches;
39
+ matchResultElement.textContent = "No results";
40
+ matchResultElement.dataset.noMatches = "";
31
41
  return;
32
42
  }
33
43
  if (matches.all.length === 0) {
34
44
  matchResultElement.textContent = "No results";
35
45
  matchResultElement.dataset.noMatches = "";
36
- } else {
37
- delete matchResultElement.dataset.noMatches;
38
- updateCurrentMatch(onUpdate(matches.all));
46
+ matches.current = void 0;
47
+ onUpdate([]);
39
48
  return;
40
49
  }
41
- matches.current = void 0;
42
- onUpdate([]);
50
+ delete matchResultElement.dataset.noMatches;
51
+ if (options?.syncSelection === false) {
52
+ updateCurrentMatch(onUpdate(matches.all, { syncSelection: false }));
53
+ return;
54
+ }
55
+ updateCurrentMatch(onUpdate(matches.all));
43
56
  };
57
+ this.#updateMatches = updateMatches;
44
58
  const updateCurrentMatch = (currentMatch) => {
45
59
  if (currentMatch === void 0) matchResultElement.textContent = `${matches.all.length} results`;
46
60
  else {
@@ -74,29 +88,81 @@ var SearchPanelWidget = class {
74
88
  }
75
89
  matches.current = nextMatch;
76
90
  };
91
+ this.#navigate = (findPrevious) => findNextMatch(findPrevious, true);
92
+ const buildReplacementEdit = (matchStart, matchEnd) => ({
93
+ start: matchStart,
94
+ end: matchEnd,
95
+ text: buildSearchReplacementText((offset) => textDocument.positionAt(offset), (position) => textDocument.offsetAt(position), (line) => textDocument.getLineText(line), searchParams, matchStart, matchEnd)
96
+ });
97
+ const replace = () => {
98
+ if (searchParams.text === "" || matches.all.length === 0) return;
99
+ let currentMatch = matches.current;
100
+ if (currentMatch === void 0) {
101
+ findNextMatch(false, true);
102
+ currentMatch = matches.current;
103
+ if (currentMatch === void 0) return;
104
+ }
105
+ const [start, end] = currentMatch;
106
+ const edit = buildReplacementEdit(start, end);
107
+ applyReplace([edit]);
108
+ scrollToMatch([start + edit.text.length, start + edit.text.length], true);
109
+ matches.current = void 0;
110
+ updateMatches();
111
+ };
112
+ const replaceAll = () => {
113
+ if (searchParams.text === "" || matches.all.length === 0) return;
114
+ applyReplace(matches.all.map(([start, end]) => buildReplacementEdit(start, end)));
115
+ matches.current = void 0;
116
+ updateMatches();
117
+ };
77
118
  const close = () => {
78
119
  this.cleanup();
79
120
  onClose();
80
121
  };
122
+ const iconButton = (opts) => h("button", {
123
+ type: "button",
124
+ title: opts.label,
125
+ ariaLabel: opts.label,
126
+ dataset: {
127
+ searchIcon: "",
128
+ ...opts.dataset
129
+ },
130
+ innerHTML: getEditorIconSvg(opts.icon, opts.size ?? 16),
131
+ onclick: opts.onClick
132
+ });
81
133
  const makeToggle = (icon, title, key) => {
82
- const button = h("div", {
83
- dataset: {
84
- icon,
85
- active: String(searchParams[key])
86
- },
87
- title,
88
- innerHTML: getEditorIconSvg(icon),
89
- onclick: () => {
134
+ const button = iconButton({
135
+ icon,
136
+ label: title,
137
+ size: 14,
138
+ onClick: () => {
90
139
  const next = !searchParams[key];
91
- button.dataset.active = String(next);
140
+ button.ariaPressed = String(next);
92
141
  updateSearchParam(key, next);
93
142
  }
94
143
  });
144
+ button.ariaPressed = String(searchParams[key]);
95
145
  return button;
96
146
  };
97
147
  const caseSensitiveToggle = makeToggle("case", "Match Case", "caseSensitive");
98
148
  const wholeWordToggle = makeToggle("whole-word", "Whole Word", "wholeWord");
99
149
  const regexToggle = makeToggle("regex", "Regexp", "regex");
150
+ const replaceInputElement = h("input", {
151
+ type: "text",
152
+ placeholder: "Replace",
153
+ dataset: "replace",
154
+ value: "",
155
+ oninput: (e) => {
156
+ searchParams.replaceText = e.target.value;
157
+ },
158
+ onkeydown: (e) => {
159
+ const findAgain = resolveFindAgainShortcut(e);
160
+ if (findAgain !== void 0) {
161
+ e.preventDefault();
162
+ findNextMatch(findAgain === "previous", true);
163
+ }
164
+ }
165
+ });
100
166
  this.#inputElement = h("input", {
101
167
  type: "text",
102
168
  placeholder: "Search",
@@ -108,59 +174,111 @@ var SearchPanelWidget = class {
108
174
  updateMatches();
109
175
  },
110
176
  onkeydown: (e) => {
177
+ const findAgain = resolveFindAgainShortcut(e);
111
178
  if (e.key === "Escape") {
112
179
  e.preventDefault();
113
180
  close();
114
181
  } else if (e.key === "Enter") {
115
182
  e.preventDefault();
116
183
  findNextMatch(false, true);
117
- } else if (e.key === "f" && isPrimaryModifier(e)) e.preventDefault();
184
+ } else if (findAgain !== void 0) {
185
+ e.preventDefault();
186
+ findNextMatch(findAgain === "previous", true);
187
+ } else if (isPrimaryModifier(e) && (e.key === "f" || e.code === "KeyF")) {
188
+ e.preventDefault();
189
+ applyMode(e.altKey ? "replace" : "find");
190
+ }
191
+ }
192
+ });
193
+ const searchTogglesElement = h("div", {
194
+ dataset: "searchToggles",
195
+ children: [
196
+ caseSensitiveToggle,
197
+ wholeWordToggle,
198
+ regexToggle
199
+ ]
200
+ });
201
+ const findInputBox = h("div", {
202
+ dataset: {
203
+ inputBox: "",
204
+ find: ""
205
+ },
206
+ children: [this.#inputElement, searchTogglesElement]
207
+ });
208
+ const replaceInputBox = h("div", {
209
+ dataset: {
210
+ inputBox: "",
211
+ replace: "",
212
+ replaceCell: ""
213
+ },
214
+ children: [replaceInputElement]
215
+ });
216
+ const replaceActionsElement = h("div", {
217
+ dataset: {
218
+ replaceActions: "",
219
+ replaceCell: ""
220
+ },
221
+ children: [iconButton({
222
+ icon: "replace",
223
+ label: "Replace",
224
+ onClick: replace
225
+ }), iconButton({
226
+ icon: "replace-all",
227
+ label: "Replace All",
228
+ onClick: replaceAll
229
+ })]
230
+ });
231
+ const prevButton = iconButton({
232
+ icon: "arrow-up",
233
+ label: "Previous",
234
+ onClick: () => {
235
+ findNextMatch(true);
118
236
  }
119
237
  });
238
+ const nextButton = iconButton({
239
+ icon: "arrow-down",
240
+ label: "Next",
241
+ onClick: () => {
242
+ findNextMatch();
243
+ }
244
+ });
245
+ prevButton.disabled = true;
246
+ nextButton.disabled = true;
247
+ const navElement = h("div", {
248
+ dataset: "searchNav",
249
+ children: [prevButton, nextButton]
250
+ });
251
+ const closeElement = iconButton({
252
+ icon: "close",
253
+ label: "Close",
254
+ onClick: close,
255
+ dataset: { searchClose: "" }
256
+ });
257
+ const gridElement = h("div", {
258
+ dataset: {
259
+ searchGrid: "",
260
+ mode
261
+ },
262
+ children: [
263
+ findInputBox,
264
+ replaceInputBox,
265
+ replaceActionsElement,
266
+ matchResultElement,
267
+ navElement,
268
+ closeElement
269
+ ]
270
+ });
271
+ const applyMode = (next) => {
272
+ gridElement.dataset.mode = next;
273
+ this.#inputElement.focus();
274
+ this.#inputElement.select();
275
+ };
276
+ this.#applyMode = applyMode;
120
277
  this.#container = h("div", {
121
- dataset: ["searchPanel", "editorWidget"],
278
+ dataset: "searchPanel",
122
279
  children: [h("div", {
123
- dataset: "searchPanelRow",
124
- children: [
125
- h("div", {
126
- dataset: { icon: "search" },
127
- innerHTML: getEditorIconSvg("search")
128
- }),
129
- this.#inputElement,
130
- matchResultElement,
131
- caseSensitiveToggle,
132
- wholeWordToggle,
133
- regexToggle,
134
- h("div", { dataset: "divider" }),
135
- h("div", {
136
- dataset: {
137
- icon: "arrow-up",
138
- disabled: "true"
139
- },
140
- title: "Previous",
141
- innerHTML: getEditorIconSvg("arrow-up"),
142
- onclick: () => {
143
- findNextMatch(true);
144
- }
145
- }),
146
- h("div", {
147
- dataset: {
148
- icon: "arrow-down",
149
- disabled: "true"
150
- },
151
- title: "Next",
152
- innerHTML: getEditorIconSvg("arrow-down"),
153
- onclick: () => {
154
- findNextMatch();
155
- }
156
- }),
157
- h("div", {
158
- dataset: { icon: "close" },
159
- title: "Close",
160
- innerHTML: getEditorIconSvg("close"),
161
- onclick: close
162
- })
163
- ]
280
+ dataset: "editorWidget",
281
+ children: [gridElement]
164
282
  })]
165
283
  });
166
284
  matches.current = initialMatch;
@@ -174,11 +292,20 @@ var SearchPanelWidget = class {
174
292
  focus() {
175
293
  this.#inputElement.focus();
176
294
  }
295
+ navigate(findPrevious) {
296
+ this.#navigate?.(findPrevious);
297
+ }
298
+ updateMatches(options) {
299
+ this.#updateMatches?.(options);
300
+ }
301
+ setMode(mode) {
302
+ this.#applyMode?.(mode);
303
+ }
177
304
  cleanup() {
178
305
  this.#container.remove();
179
306
  }
180
307
  };
181
-
182
308
  //#endregion
183
309
  export { SearchPanelWidget };
310
+
184
311
  //# sourceMappingURL=searchPanel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"searchPanel.js","names":["searchParams: SearchParams","#container","nextMatch: MatchRange | undefined","#inputElement"],"sources":["../../src/editor/searchPanel.ts"],"sourcesContent":["import { isPrimaryModifier } from './platform';\nimport { getEditorIconSvg, type SVGSpriteNames } from './sprite';\nimport type { TextDocument } from './textDocument';\nimport { h } from './utils';\n\nexport type MatchRange = [startOffset: number, endOffset: number];\n\nexport interface SearchParams {\n text: string;\n replaceText: string;\n caseSensitive: boolean;\n wholeWord: boolean;\n regex: boolean;\n}\n\nexport interface SearchPanelOptions {\n textDocument: TextDocument<unknown>;\n containerElement: HTMLElement;\n defaultQuery: string;\n initialMatch?: MatchRange;\n scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;\n onUpdate: (matches: MatchRange[]) => MatchRange | undefined;\n onClose: () => void;\n}\n\nexport class SearchPanelWidget {\n #container: HTMLDivElement;\n #inputElement: HTMLInputElement;\n\n constructor(options: SearchPanelOptions) {\n const {\n textDocument,\n containerElement,\n defaultQuery,\n initialMatch,\n scrollToMatch,\n onUpdate,\n onClose,\n } = options;\n\n const searchParams: SearchParams = {\n text: defaultQuery,\n replaceText: '',\n caseSensitive: false,\n wholeWord: false,\n regex: false,\n };\n\n const matches = {\n all: [] as MatchRange[],\n current: undefined as MatchRange | undefined,\n };\n\n const matchResultElement = h('div', { dataset: 'matches' });\n const updateMatches = () => {\n matches.all =\n searchParams.text !== '' ? textDocument.search(searchParams) : [];\n this.#container\n .querySelectorAll<HTMLElement>('[data-disabled]')\n .forEach((element) => {\n element.dataset.disabled = String(matches.all.length === 0);\n });\n\n if (searchParams.text === '') {\n matchResultElement.textContent = '';\n delete matchResultElement.dataset.noMatches;\n return;\n }\n\n if (matches.all.length === 0) {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n } else {\n delete matchResultElement.dataset.noMatches;\n updateCurrentMatch(onUpdate(matches.all));\n return;\n }\n\n matches.current = undefined;\n onUpdate([]);\n };\n\n const updateCurrentMatch = (currentMatch: MatchRange | undefined) => {\n if (currentMatch === undefined) {\n matchResultElement.textContent = `${matches.all.length} results`;\n } else {\n const [start, end] = currentMatch;\n const index = matches.all.findIndex(\n (m) => m[0] === start && m[1] === end\n );\n matchResultElement.textContent = `${index + 1} of ${matches.all.length}`;\n }\n matches.current = currentMatch;\n };\n\n const updateSearchParam = <K extends keyof SearchParams>(\n key: K,\n value: SearchParams[K]\n ) => {\n searchParams[key] = value;\n updateMatches();\n };\n\n const findNextMatch = (\n findPrevious: boolean = false,\n retainFocus: boolean = false\n ) => {\n const allMatches = matches.all;\n let nextMatch: MatchRange | undefined = allMatches[0];\n if (allMatches.length > 0) {\n if (findPrevious) {\n const searchOffset = matches.current?.[0] ?? 0;\n nextMatch = allMatches.at(-1);\n for (const m of allMatches) {\n if (m[1] <= searchOffset) {\n nextMatch = m;\n } else {\n break;\n }\n }\n } else {\n const searchOffset = matches.current?.[1] ?? 0;\n for (const m of allMatches) {\n if (m[0] >= searchOffset) {\n nextMatch = m;\n break;\n }\n }\n }\n }\n if (nextMatch !== undefined) {\n updateCurrentMatch(nextMatch);\n scrollToMatch(nextMatch, retainFocus);\n }\n matches.current = nextMatch;\n };\n\n const close = () => {\n this.cleanup();\n onClose();\n };\n\n // Builds an always-visible icon button that toggles one boolean search\n // option (case/whole-word/regex). The button reflects its on/off state via\n // the `data-active` attribute so the stylesheet can highlight it.\n const makeToggle = (\n icon: SVGSpriteNames,\n title: string,\n key: 'caseSensitive' | 'wholeWord' | 'regex'\n ) => {\n const button = h('div', {\n dataset: { icon, active: String(searchParams[key]) },\n title,\n innerHTML: getEditorIconSvg(icon),\n onclick: () => {\n const next = !searchParams[key];\n button.dataset.active = String(next);\n updateSearchParam(key, next);\n },\n });\n return button;\n };\n\n const caseSensitiveToggle = makeToggle(\n 'case',\n 'Match Case',\n 'caseSensitive'\n );\n const wholeWordToggle = makeToggle('whole-word', 'Whole Word', 'wholeWord');\n const regexToggle = makeToggle('regex', 'Regexp', 'regex');\n\n this.#inputElement = h('input', {\n type: 'text',\n placeholder: 'Search',\n dataset: 'search',\n value: defaultQuery,\n oninput: (e: Event) => {\n searchParams.text = (e.target as HTMLInputElement).value;\n matches.current = undefined;\n updateMatches();\n },\n onkeydown: (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n findNextMatch(false, true);\n } else if (e.key === 'f' && isPrimaryModifier(e)) {\n // prevent the default browser search panel open behavior\n e.preventDefault();\n }\n },\n });\n\n this.#container = h('div', {\n dataset: ['searchPanel', 'editorWidget'],\n children: [\n h('div', {\n dataset: 'searchPanelRow',\n children: [\n h('div', {\n dataset: { icon: 'search' },\n innerHTML: getEditorIconSvg('search'),\n }),\n this.#inputElement,\n matchResultElement,\n caseSensitiveToggle,\n wholeWordToggle,\n regexToggle,\n h('div', { dataset: 'divider' }),\n h('div', {\n dataset: { icon: 'arrow-up', disabled: 'true' },\n title: 'Previous',\n innerHTML: getEditorIconSvg('arrow-up'),\n onclick: () => {\n findNextMatch(true);\n },\n }),\n h('div', {\n dataset: { icon: 'arrow-down', disabled: 'true' },\n title: 'Next',\n innerHTML: getEditorIconSvg('arrow-down'),\n onclick: () => {\n findNextMatch();\n },\n }),\n h('div', {\n dataset: { icon: 'close' },\n title: 'Close',\n innerHTML: getEditorIconSvg('close'),\n onclick: close,\n }),\n ],\n }),\n ],\n });\n\n matches.current = initialMatch;\n containerElement.before(this.#container);\n\n requestAnimationFrame(() => {\n if (initialMatch !== undefined) {\n updateMatches();\n } else {\n onUpdate([]);\n }\n this.#inputElement.select();\n });\n }\n\n focus(): void {\n this.#inputElement.focus();\n }\n\n cleanup(): void {\n this.#container.remove();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"searchPanel.js","names":["#updateMatches","#navigate","#inputElement","#applyMode","#container"],"sources":["../../src/editor/searchPanel.ts"],"sourcesContent":["import { resolveFindAgainShortcut } from './command';\nimport { buildSearchReplacementText } from './pieceTable';\nimport { isPrimaryModifier } from './platform';\nimport { getEditorIconSvg, type SVGSpriteNames } from './sprite';\nimport type { ResolvedTextEdit, TextDocument } from './textDocument';\nimport { h } from './utils';\n\nexport type MatchRange = [startOffset: number, endOffset: number];\n\nexport type SearchPanelMode = 'find' | 'replace';\n\nexport interface SearchParams {\n text: string;\n replaceText: string;\n caseSensitive: boolean;\n wholeWord: boolean;\n regex: boolean;\n}\n\nexport interface SearchPanelOptions {\n textDocument: TextDocument<unknown>;\n containerElement: HTMLElement;\n defaultQuery: string;\n mode?: SearchPanelMode;\n initialMatch?: MatchRange;\n scrollToMatch: (nextMatch: MatchRange, retainFocus: boolean) => void;\n applyReplace: (edits: ResolvedTextEdit[]) => void;\n onUpdate: (\n matches: MatchRange[],\n options?: { syncSelection?: boolean }\n ) => MatchRange | undefined;\n onClose: () => void;\n}\n\nexport class SearchPanelWidget {\n #container: HTMLDivElement;\n #inputElement: HTMLInputElement;\n #updateMatches?: (options?: { syncSelection?: boolean }) => void;\n #applyMode?: (mode: SearchPanelMode) => void;\n #navigate?: (findPrevious: boolean) => void;\n\n constructor(options: SearchPanelOptions) {\n const {\n textDocument,\n containerElement,\n defaultQuery,\n mode = 'find',\n initialMatch,\n scrollToMatch,\n applyReplace,\n onUpdate,\n onClose,\n } = options;\n\n const searchParams: SearchParams = {\n text: defaultQuery,\n replaceText: '',\n caseSensitive: false,\n wholeWord: false,\n regex: false,\n };\n\n const matches = {\n all: [] as MatchRange[],\n current: undefined as MatchRange | undefined,\n };\n\n // Default to the empty-query \"no results\" state so it shows on open before\n // any search runs.\n const matchResultElement = h('div', {\n dataset: { matches: '', noMatches: '' },\n textContent: 'No results',\n });\n const updateMatches = (options?: { syncSelection?: boolean }) => {\n matches.all =\n searchParams.text !== '' ? textDocument.search(searchParams) : [];\n const noMatches = matches.all.length === 0;\n prevButton.disabled = noMatches;\n nextButton.disabled = noMatches;\n\n if (searchParams.text === '') {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n return;\n }\n\n if (matches.all.length === 0) {\n matchResultElement.textContent = 'No results';\n matchResultElement.dataset.noMatches = '';\n matches.current = undefined;\n onUpdate([]);\n return;\n }\n\n delete matchResultElement.dataset.noMatches;\n if (options?.syncSelection === false) {\n const currentMatch = onUpdate(matches.all, { syncSelection: false });\n updateCurrentMatch(currentMatch);\n return;\n }\n\n updateCurrentMatch(onUpdate(matches.all));\n };\n this.#updateMatches = updateMatches;\n\n const updateCurrentMatch = (currentMatch: MatchRange | undefined) => {\n if (currentMatch === undefined) {\n matchResultElement.textContent = `${matches.all.length} results`;\n } else {\n const [start, end] = currentMatch;\n const index = matches.all.findIndex(\n (m) => m[0] === start && m[1] === end\n );\n matchResultElement.textContent = `${index + 1} of ${matches.all.length}`;\n }\n matches.current = currentMatch;\n };\n\n const updateSearchParam = <K extends keyof SearchParams>(\n key: K,\n value: SearchParams[K]\n ) => {\n searchParams[key] = value;\n updateMatches();\n };\n\n const findNextMatch = (\n findPrevious: boolean = false,\n retainFocus: boolean = false\n ) => {\n const allMatches = matches.all;\n let nextMatch: MatchRange | undefined = allMatches[0];\n if (allMatches.length > 0) {\n if (findPrevious) {\n const searchOffset = matches.current?.[0] ?? 0;\n nextMatch = allMatches.at(-1);\n for (const m of allMatches) {\n if (m[1] <= searchOffset) {\n nextMatch = m;\n } else {\n break;\n }\n }\n } else {\n const searchOffset = matches.current?.[1] ?? 0;\n for (const m of allMatches) {\n if (m[0] >= searchOffset) {\n nextMatch = m;\n break;\n }\n }\n }\n }\n if (nextMatch !== undefined) {\n updateCurrentMatch(nextMatch);\n scrollToMatch(nextMatch, retainFocus);\n }\n matches.current = nextMatch;\n };\n // Keep focus in the panel when stepping through matches from the inputs.\n this.#navigate = (findPrevious: boolean) =>\n findNextMatch(findPrevious, true);\n\n const buildReplacementEdit = (\n matchStart: number,\n matchEnd: number\n ): ResolvedTextEdit => ({\n start: matchStart,\n end: matchEnd,\n text: buildSearchReplacementText(\n (offset) => textDocument.positionAt(offset),\n (position) => textDocument.offsetAt(position),\n (line) => textDocument.getLineText(line),\n searchParams,\n matchStart,\n matchEnd\n ),\n });\n\n const replace = () => {\n if (searchParams.text === '' || matches.all.length === 0) {\n return;\n }\n\n let currentMatch = matches.current;\n if (currentMatch === undefined) {\n findNextMatch(false, true);\n currentMatch = matches.current;\n if (currentMatch === undefined) {\n return;\n }\n }\n\n const [start, end] = currentMatch;\n const edit = buildReplacementEdit(start, end);\n applyReplace([edit]);\n\n // Collapse after the replacement so the next search pass advances.\n scrollToMatch([start + edit.text.length, start + edit.text.length], true);\n matches.current = undefined;\n updateMatches();\n };\n\n const replaceAll = () => {\n if (searchParams.text === '' || matches.all.length === 0) {\n return;\n }\n\n applyReplace(\n matches.all.map(([start, end]) => buildReplacementEdit(start, end))\n );\n matches.current = undefined;\n updateMatches();\n };\n\n const close = () => {\n this.cleanup();\n onClose();\n };\n\n // Shared builder for the panel's icon controls. Every clickable control is a\n // real <button> so it gets focus, keyboard activation, and native disabled\n // handling for free; `getEditorIconSvg` marks the glyph aria-hidden, so the\n // accessible name comes from `label` (also used as the hover title).\n const iconButton = (opts: {\n icon: SVGSpriteNames;\n label: string;\n size?: number;\n dataset?: Record<string, string>;\n onClick: () => void;\n }) =>\n h('button', {\n type: 'button',\n title: opts.label,\n ariaLabel: opts.label,\n dataset: { searchIcon: '', ...opts.dataset },\n innerHTML: getEditorIconSvg(opts.icon, opts.size ?? 16),\n onclick: opts.onClick,\n });\n\n // Builds an always-visible icon button that toggles one boolean search\n // option (case/whole-word/regex). The button reflects its on/off state via\n // `aria-pressed` so the stylesheet can highlight it and assistive tech can\n // announce it.\n const makeToggle = (\n icon: SVGSpriteNames,\n title: string,\n key: 'caseSensitive' | 'wholeWord' | 'regex'\n ) => {\n const button = iconButton({\n icon,\n label: title,\n size: 14,\n onClick: () => {\n const next = !searchParams[key];\n button.ariaPressed = String(next);\n updateSearchParam(key, next);\n },\n });\n button.ariaPressed = String(searchParams[key]);\n return button;\n };\n\n const caseSensitiveToggle = makeToggle(\n 'case',\n 'Match Case',\n 'caseSensitive'\n );\n const wholeWordToggle = makeToggle('whole-word', 'Whole Word', 'wholeWord');\n const regexToggle = makeToggle('regex', 'Regexp', 'regex');\n\n const replaceInputElement = h('input', {\n type: 'text',\n placeholder: 'Replace',\n dataset: 'replace',\n value: '',\n oninput: (e: Event) => {\n searchParams.replaceText = (e.target as HTMLInputElement).value;\n },\n onkeydown: (e: KeyboardEvent) => {\n const findAgain = resolveFindAgainShortcut(e);\n if (findAgain !== undefined) {\n e.preventDefault();\n findNextMatch(findAgain === 'previous', true);\n }\n },\n });\n\n this.#inputElement = h('input', {\n type: 'text',\n placeholder: 'Search',\n dataset: 'search',\n value: defaultQuery,\n oninput: (e: Event) => {\n searchParams.text = (e.target as HTMLInputElement).value;\n matches.current = undefined;\n updateMatches();\n },\n onkeydown: (e: KeyboardEvent) => {\n const findAgain = resolveFindAgainShortcut(e);\n if (e.key === 'Escape') {\n e.preventDefault();\n close();\n } else if (e.key === 'Enter') {\n e.preventDefault();\n findNextMatch(false, true);\n } else if (findAgain !== undefined) {\n // Override the native browser find-again shortcut so cmd+g steps to\n // the next match and cmd+shift+g to the previous one.\n e.preventDefault();\n findNextMatch(findAgain === 'previous', true);\n } else if (\n isPrimaryModifier(e) &&\n (e.key === 'f' || e.code === 'KeyF')\n ) {\n // Prevent the default browser search panel and switch the panel mode\n // in place (cmd+f -> find, cmd+opt+f -> find/replace).\n e.preventDefault();\n applyMode(e.altKey ? 'replace' : 'find');\n }\n },\n });\n\n // The three search-option toggles are overlaid on the right edge of the\n // find input instead of sitting beside it.\n const searchTogglesElement = h('div', {\n dataset: 'searchToggles',\n children: [caseSensitiveToggle, wholeWordToggle, regexToggle],\n });\n\n const findInputBox = h('div', {\n dataset: { inputBox: '', find: '' },\n children: [this.#inputElement, searchTogglesElement],\n });\n\n // The replace input and its action buttons are tagged as replace cells so\n // they can be hidden together when the panel is in find-only mode.\n const replaceInputBox = h('div', {\n dataset: { inputBox: '', replace: '', replaceCell: '' },\n children: [replaceInputElement],\n });\n\n const replaceActionsElement = h('div', {\n dataset: { replaceActions: '', replaceCell: '' },\n children: [\n iconButton({ icon: 'replace', label: 'Replace', onClick: replace }),\n iconButton({\n icon: 'replace-all',\n label: 'Replace All',\n onClick: replaceAll,\n }),\n ],\n });\n\n // Held so the no-results state can toggle their native disabled flag.\n const prevButton = iconButton({\n icon: 'arrow-up',\n label: 'Previous',\n onClick: () => {\n findNextMatch(true);\n },\n });\n const nextButton = iconButton({\n icon: 'arrow-down',\n label: 'Next',\n onClick: () => {\n findNextMatch();\n },\n });\n prevButton.disabled = true;\n nextButton.disabled = true;\n\n const navElement = h('div', {\n dataset: 'searchNav',\n children: [prevButton, nextButton],\n });\n\n const closeElement = iconButton({\n icon: 'close',\n label: 'Close',\n onClick: close,\n dataset: { searchClose: '' },\n });\n\n // Cells are positioned by CSS grid-template-areas (see editor.css), so DOM\n // order here only drives tab/reading order, not layout. Keep the replace\n // input directly after the find input (and its toggles) so Tab walks\n // find -> replace before reaching the nav arrows and close button.\n const gridElement = h('div', {\n dataset: { searchGrid: '', mode },\n children: [\n findInputBox,\n replaceInputBox,\n replaceActionsElement,\n matchResultElement,\n navElement,\n closeElement,\n ],\n });\n\n // Toggles the panel between find and find/replace modes by showing or\n // hiding the replace cells, then returns focus to the find input.\n const applyMode = (next: SearchPanelMode) => {\n gridElement.dataset.mode = next;\n this.#inputElement.focus();\n this.#inputElement.select();\n };\n this.#applyMode = applyMode;\n\n this.#container = h('div', {\n dataset: 'searchPanel',\n children: [\n h('div', {\n dataset: 'editorWidget',\n children: [gridElement],\n }),\n ],\n });\n\n matches.current = initialMatch;\n containerElement.before(this.#container);\n\n requestAnimationFrame(() => {\n if (initialMatch !== undefined) {\n updateMatches();\n } else {\n onUpdate([]);\n }\n this.#inputElement.select();\n });\n }\n\n focus(): void {\n this.#inputElement.focus();\n }\n\n navigate(findPrevious: boolean): void {\n this.#navigate?.(findPrevious);\n }\n\n updateMatches(options?: { syncSelection?: boolean }): void {\n this.#updateMatches?.(options);\n }\n\n setMode(mode: SearchPanelMode): void {\n this.#applyMode?.(mode);\n }\n\n cleanup(): void {\n this.#container.remove();\n }\n}\n"],"mappings":"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"}
@@ -28,17 +28,23 @@ declare function mapSelectionShift(textDocument: TextDocument<unknown>, selectio
28
28
  /**
29
29
  * Applies a text change to the given text document
30
30
  */
31
- declare function applyTextChangeToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], edit: ResolvedTextEdit, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number): {
31
+ declare function applyTextChangeToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], edit: ResolvedTextEdit, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number, undoBoundary?: boolean): {
32
32
  nextSelections: EditorSelection[];
33
33
  change?: TextDocumentChange;
34
34
  };
35
35
  /**
36
36
  * Applies a text replace to multiple selections.
37
37
  */
38
- declare function applyTextReplaceToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], texts: string[], lineAnnotations?: DiffLineAnnotation<LAnnotation>[]): {
38
+ declare function applyTextReplaceToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], texts: string[], lineAnnotations?: DiffLineAnnotation<LAnnotation>[], undoBoundary?: boolean): {
39
39
  nextSelections: EditorSelection[];
40
40
  change?: TextDocumentChange;
41
41
  };
42
+ type AutoSurround = 'default' | 'never' | 'brackets' | 'quotes' | 'languageDefined';
43
+ /**
44
+ * Returns per-selection replacement text when typing a surround character over
45
+ * non-collapsed selections, matching VS Code auto-surround behavior.
46
+ */
47
+ declare function getAutoSurroundReplacementTexts<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], char: string, autoSurround?: AutoSurround): string[] | undefined;
42
48
  /**
43
49
  * Swaps the two characters adjacent to a collapsed selection, matching browser
44
50
  * insertTranspose (Ctrl+T) behavior.
@@ -72,6 +78,18 @@ declare function applyDeleteWordBackwardToSelections<LAnnotation>(textDocument:
72
78
  nextSelections: EditorSelection[];
73
79
  change?: TextDocumentChange;
74
80
  };
81
+ /**
82
+ * Resolves the document range deleted by Backspace or Delete at a collapsed
83
+ * caret. Non-collapsed selections delete their selected text instead.
84
+ */
85
+ declare function resolveDeleteCharacterRange(textDocument: TextDocument<unknown>, selection: EditorSelection, forward: boolean): [start: Position, end: Position];
86
+ /**
87
+ * Deletes one grapheme (or selected text) at each selection.
88
+ */
89
+ declare function applyDeleteCharacterToSelections<LAnnotation>(textDocument: TextDocument<LAnnotation>, selections: EditorSelection[], forward: boolean, lineAnnotations?: DiffLineAnnotation<LAnnotation>[], tabSize?: number): {
90
+ nextSelections: EditorSelection[];
91
+ change?: TextDocumentChange;
92
+ };
75
93
  /**
76
94
  * Checks if a selection is collapsed.
77
95
  */
@@ -96,6 +114,16 @@ declare function comparePosition(a: Position, b: Position): number;
96
114
  * Creates a selection from anchor and focus offsets.
97
115
  */
98
116
  declare function createSelectionFromAnchorAndFocusOffsets(textDocument: TextDocument<unknown>, anchorOffset: number, focusOffset: number): EditorSelection;
117
+ /**
118
+ * Re-anchors selections after a batch of text edits has been applied, so the
119
+ * caret keeps pointing at the same logical location in the changed buffer.
120
+ *
121
+ * `selectionOffsets` (one `[start, end]` pair per selection) and `edits` are
122
+ * measured in the PRE-edit document; the returned selections are built from
123
+ * `textDocument`, which must already reflect the applied edits. Selection
124
+ * direction is preserved by remapping each edge and re-deriving anchor/focus.
125
+ */
126
+ declare function remapSelectionsAfterEdits(textDocument: TextDocument<unknown>, selections: readonly EditorSelection[], selectionOffsets: ReadonlyArray<readonly [number, number]>, edits: readonly ResolvedTextEdit[]): EditorSelection[];
99
127
  /**
100
128
  * Creates a selection from a anchor and focus selection.
101
129
  */
@@ -126,9 +154,18 @@ declare function getDocumentFullSelection(textDocument: TextDocument<unknown>):
126
154
  */
127
155
  declare function getDocumentBoundarySelection(textDocument: TextDocument<unknown>, atEnd: boolean): EditorSelection;
128
156
  /**
129
- * Get the text of the selections for the given text document.
157
+ * Get the clipboard text of the selections for the given text document. Used by
158
+ * both copy and cut so the two stay in sync. Overlapping regions (e.g. several
159
+ * carets on one line) are merged so the same text is never emitted twice, and a
160
+ * line-ending separator is inserted only between regions that aren't already
161
+ * contiguous in the document.
130
162
  */
131
163
  declare function getSelectionText(textDocument: TextDocument<unknown>, selections: EditorSelection[]): string;
164
+ declare function resolveSelectionCut(textDocument: TextDocument<unknown>, selections: EditorSelection[]): {
165
+ text: string;
166
+ edits: ResolvedTextEdit[];
167
+ nextSelectionOffsets: number[];
168
+ };
132
169
  /**
133
170
  * Get the anchor node and offset for a selection.
134
171
  */
@@ -138,5 +175,5 @@ declare function getSelectionAnchor(lineElement: HTMLElement, character: number)
138
175
  */
139
176
  declare function expandCollapsedSelectionToWord(textDocument: TextDocument<unknown>, selection: EditorSelection): EditorSelection;
140
177
  //#endregion
141
- export { DirectionBackward, DirectionForward, DirectionNone, EditorSelection, SelectionDirection, 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 };
178
+ export { AutoSurround, DirectionBackward, DirectionForward, DirectionNone, EditorSelection, SelectionDirection, 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 };
142
179
  //# sourceMappingURL=selection.d.ts.map