@dst0/p-tui 0.4.40 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/dist/autocomplete.d.ts.map +1 -1
  2. package/dist/autocomplete.js.map +1 -1
  3. package/dist/components/box.d.ts +3 -1
  4. package/dist/components/box.d.ts.map +1 -1
  5. package/dist/components/box.js +19 -10
  6. package/dist/components/box.js.map +1 -1
  7. package/dist/components/cancellable-loader.d.ts.map +1 -1
  8. package/dist/components/cancellable-loader.js.map +1 -1
  9. package/dist/components/editor/constants.d.ts +9 -0
  10. package/dist/components/editor/constants.d.ts.map +1 -0
  11. package/dist/components/editor/constants.js +12 -0
  12. package/dist/components/editor/constants.js.map +1 -0
  13. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts +29 -0
  14. package/dist/components/editor/editor-methods/autocomplete-matching.d.ts.map +1 -0
  15. package/dist/components/editor/editor-methods/autocomplete-matching.js +104 -0
  16. package/dist/components/editor/editor-methods/autocomplete-matching.js.map +1 -0
  17. package/dist/components/editor/editor-methods/autocomplete-request.d.ts +14 -0
  18. package/dist/components/editor/editor-methods/autocomplete-request.d.ts.map +1 -0
  19. package/dist/components/editor/editor-methods/autocomplete-request.js +72 -0
  20. package/dist/components/editor/editor-methods/autocomplete-request.js.map +1 -0
  21. package/dist/components/editor/editor-methods/backspace-cursor.d.ts +9 -0
  22. package/dist/components/editor/editor-methods/backspace-cursor.d.ts.map +1 -0
  23. package/dist/components/editor/editor-methods/backspace-cursor.js +122 -0
  24. package/dist/components/editor/editor-methods/backspace-cursor.js.map +1 -0
  25. package/dist/components/editor/editor-methods/configuration.d.ts +17 -0
  26. package/dist/components/editor/editor-methods/configuration.d.ts.map +1 -0
  27. package/dist/components/editor/editor-methods/configuration.js +107 -0
  28. package/dist/components/editor/editor-methods/configuration.js.map +1 -0
  29. package/dist/components/editor/editor-methods/cursor-movement.d.ts +7 -0
  30. package/dist/components/editor/editor-methods/cursor-movement.d.ts.map +1 -0
  31. package/dist/components/editor/editor-methods/cursor-movement.js +112 -0
  32. package/dist/components/editor/editor-methods/cursor-movement.js.map +1 -0
  33. package/dist/components/editor/editor-methods/input-handling.d.ts +3 -0
  34. package/dist/components/editor/editor-methods/input-handling.d.ts.map +1 -0
  35. package/dist/components/editor/editor-methods/input-handling.js +257 -0
  36. package/dist/components/editor/editor-methods/input-handling.js.map +1 -0
  37. package/dist/components/editor/editor-methods/paste-submit.d.ts +7 -0
  38. package/dist/components/editor/editor-methods/paste-submit.d.ts.map +1 -0
  39. package/dist/components/editor/editor-methods/paste-submit.js +105 -0
  40. package/dist/components/editor/editor-methods/paste-submit.js.map +1 -0
  41. package/dist/components/editor/editor-methods/render.d.ts +3 -0
  42. package/dist/components/editor/editor-methods/render.d.ts.map +1 -0
  43. package/dist/components/editor/editor-methods/render.js +114 -0
  44. package/dist/components/editor/editor-methods/render.js.map +1 -0
  45. package/dist/components/editor/editor-methods/text-insertion.d.ts +4 -0
  46. package/dist/components/editor/editor-methods/text-insertion.d.ts.map +1 -0
  47. package/dist/components/editor/editor-methods/text-insertion.js +91 -0
  48. package/dist/components/editor/editor-methods/text-insertion.js.map +1 -0
  49. package/dist/components/editor/editor-methods/text-layout.d.ts +15 -0
  50. package/dist/components/editor/editor-methods/text-layout.d.ts.map +1 -0
  51. package/dist/components/editor/editor-methods/text-layout.js +129 -0
  52. package/dist/components/editor/editor-methods/text-layout.js.map +1 -0
  53. package/dist/components/editor/editor-methods/vertical-movement.d.ts +8 -0
  54. package/dist/components/editor/editor-methods/vertical-movement.d.ts.map +1 -0
  55. package/dist/components/editor/editor-methods/vertical-movement.js +123 -0
  56. package/dist/components/editor/editor-methods/vertical-movement.js.map +1 -0
  57. package/dist/components/editor/editor-methods/word-operations.d.ts +19 -0
  58. package/dist/components/editor/editor-methods/word-operations.d.ts.map +1 -0
  59. package/dist/components/editor/editor-methods/word-operations.js +122 -0
  60. package/dist/components/editor/editor-methods/word-operations.js.map +1 -0
  61. package/dist/components/editor/editor-methods/yank-undo.d.ts +11 -0
  62. package/dist/components/editor/editor-methods/yank-undo.d.ts.map +1 -0
  63. package/dist/components/editor/editor-methods/yank-undo.js +132 -0
  64. package/dist/components/editor/editor-methods/yank-undo.js.map +1 -0
  65. package/dist/components/editor/editor.d.ts +67 -0
  66. package/dist/components/editor/editor.d.ts.map +1 -0
  67. package/dist/components/editor/editor.js +93 -0
  68. package/dist/components/editor/editor.js.map +1 -0
  69. package/dist/components/editor/helpers.d.ts +3 -0
  70. package/dist/components/editor/helpers.d.ts.map +1 -0
  71. package/dist/components/editor/helpers.js +3 -0
  72. package/dist/components/editor/helpers.js.map +1 -0
  73. package/dist/components/editor/index.d.ts +4 -0
  74. package/dist/components/editor/index.d.ts.map +1 -0
  75. package/dist/components/editor/index.js +3 -0
  76. package/dist/components/editor/index.js.map +1 -0
  77. package/dist/components/editor/paste-marker.d.ts +5 -0
  78. package/dist/components/editor/paste-marker.d.ts.map +1 -0
  79. package/dist/components/editor/paste-marker.js +134 -0
  80. package/dist/components/editor/paste-marker.js.map +1 -0
  81. package/dist/components/editor/trigger-patterns.d.ts +4 -0
  82. package/dist/components/editor/trigger-patterns.d.ts.map +1 -0
  83. package/dist/components/editor/trigger-patterns.js +11 -0
  84. package/dist/components/editor/trigger-patterns.js.map +1 -0
  85. package/dist/components/editor/types.d.ts +25 -0
  86. package/dist/components/editor/types.d.ts.map +1 -0
  87. package/dist/components/editor/types.js +2 -0
  88. package/dist/components/editor/types.js.map +1 -0
  89. package/dist/components/editor.d.ts +1 -253
  90. package/dist/components/editor.d.ts.map +1 -1
  91. package/dist/components/editor.js +1 -1915
  92. package/dist/components/editor.js.map +1 -1
  93. package/dist/components/image.d.ts.map +1 -1
  94. package/dist/components/image.js.map +1 -1
  95. package/dist/components/input/constants.d.ts +2 -0
  96. package/dist/components/input/constants.d.ts.map +1 -0
  97. package/dist/components/input/constants.js +3 -0
  98. package/dist/components/input/constants.js.map +1 -0
  99. package/dist/components/input/index.d.ts +2 -0
  100. package/dist/components/input/index.d.ts.map +1 -0
  101. package/dist/components/input/index.js +2 -0
  102. package/dist/components/input/index.js.map +1 -0
  103. package/dist/components/input/input-methods/input-handling.d.ts +3 -0
  104. package/dist/components/input/input-methods/input-handling.d.ts.map +1 -0
  105. package/dist/components/input/input-methods/input-handling.js +145 -0
  106. package/dist/components/input/input-methods/input-handling.js.map +1 -0
  107. package/dist/components/input/input-methods/render.d.ts +3 -0
  108. package/dist/components/input/input-methods/render.d.ts.map +1 -0
  109. package/dist/components/input/input-methods/render.js +62 -0
  110. package/dist/components/input/input-methods/render.js.map +1 -0
  111. package/dist/components/input/input-methods/text-editing.d.ts +17 -0
  112. package/dist/components/input/input-methods/text-editing.d.ts.map +1 -0
  113. package/dist/components/input/input-methods/text-editing.js +145 -0
  114. package/dist/components/input/input-methods/text-editing.js.map +1 -0
  115. package/dist/components/input/input-methods/value-access.d.ts +4 -0
  116. package/dist/components/input/input-methods/value-access.d.ts.map +1 -0
  117. package/dist/components/input/input-methods/value-access.js +20 -0
  118. package/dist/components/input/input-methods/value-access.js.map +1 -0
  119. package/dist/components/input/input.d.ts +37 -0
  120. package/dist/components/input/input.d.ts.map +1 -0
  121. package/dist/components/input/input.js +77 -0
  122. package/dist/components/input/input.js.map +1 -0
  123. package/dist/components/input/types.d.ts +5 -0
  124. package/dist/components/input/types.d.ts.map +1 -0
  125. package/dist/components/input/types.js +2 -0
  126. package/dist/components/input/types.js.map +1 -0
  127. package/dist/components/input.d.ts +1 -36
  128. package/dist/components/input.d.ts.map +1 -1
  129. package/dist/components/input.js +1 -377
  130. package/dist/components/input.js.map +1 -1
  131. package/dist/components/loader.d.ts.map +1 -1
  132. package/dist/components/loader.js.map +1 -1
  133. package/dist/components/markdown/constants.d.ts +4 -0
  134. package/dist/components/markdown/constants.d.ts.map +1 -0
  135. package/dist/components/markdown/constants.js +8 -0
  136. package/dist/components/markdown/constants.js.map +1 -0
  137. package/dist/components/markdown/index.d.ts +3 -0
  138. package/dist/components/markdown/index.d.ts.map +1 -0
  139. package/dist/components/markdown/index.js +2 -0
  140. package/dist/components/markdown/index.js.map +1 -0
  141. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts +7 -0
  142. package/dist/components/markdown/markdown-methods/inline-rendering.d.ts.map +1 -0
  143. package/dist/components/markdown/markdown-methods/inline-rendering.js +95 -0
  144. package/dist/components/markdown/markdown-methods/inline-rendering.js.map +1 -0
  145. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts +7 -0
  146. package/dist/components/markdown/markdown-methods/list-table-helpers.d.ts.map +1 -0
  147. package/dist/components/markdown/markdown-methods/list-table-helpers.js +61 -0
  148. package/dist/components/markdown/markdown-methods/list-table-helpers.js.map +1 -0
  149. package/dist/components/markdown/markdown-methods/table-rendering.d.ts +5 -0
  150. package/dist/components/markdown/markdown-methods/table-rendering.d.ts.map +1 -0
  151. package/dist/components/markdown/markdown-methods/table-rendering.js +146 -0
  152. package/dist/components/markdown/markdown-methods/table-rendering.js.map +1 -0
  153. package/dist/components/markdown/markdown-methods/text-rendering.d.ts +6 -0
  154. package/dist/components/markdown/markdown-methods/text-rendering.d.ts.map +1 -0
  155. package/dist/components/markdown/markdown-methods/text-rendering.js +115 -0
  156. package/dist/components/markdown/markdown-methods/text-rendering.js.map +1 -0
  157. package/dist/components/markdown/markdown-methods/theming.d.ts +6 -0
  158. package/dist/components/markdown/markdown-methods/theming.d.ts.map +1 -0
  159. package/dist/components/markdown/markdown-methods/theming.js +41 -0
  160. package/dist/components/markdown/markdown-methods/theming.js.map +1 -0
  161. package/dist/components/markdown/markdown-methods/token-rendering.d.ts +5 -0
  162. package/dist/components/markdown/markdown-methods/token-rendering.d.ts.map +1 -0
  163. package/dist/components/markdown/markdown-methods/token-rendering.js +142 -0
  164. package/dist/components/markdown/markdown-methods/token-rendering.js.map +1 -0
  165. package/dist/components/markdown/markdown.d.ts +32 -0
  166. package/dist/components/markdown/markdown.d.ts.map +1 -0
  167. package/dist/components/markdown/markdown.js +72 -0
  168. package/dist/components/markdown/markdown.js.map +1 -0
  169. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts +6 -0
  170. package/dist/components/markdown/strictstrikethroughtokenizer.d.ts.map +1 -0
  171. package/dist/components/markdown/strictstrikethroughtokenizer.js +18 -0
  172. package/dist/components/markdown/strictstrikethroughtokenizer.js.map +1 -0
  173. package/dist/components/markdown/types.d.ts +42 -0
  174. package/dist/components/markdown/types.d.ts.map +1 -0
  175. package/dist/components/markdown/types.js +2 -0
  176. package/dist/components/markdown/types.js.map +1 -0
  177. package/dist/components/markdown.d.ts +1 -96
  178. package/dist/components/markdown.d.ts.map +1 -1
  179. package/dist/components/markdown.js +1 -653
  180. package/dist/components/markdown.js.map +1 -1
  181. package/dist/components/select-list.d.ts.map +1 -1
  182. package/dist/components/select-list.js +8 -3
  183. package/dist/components/select-list.js.map +1 -1
  184. package/dist/components/settings-list.d.ts.map +1 -1
  185. package/dist/components/settings-list.js +2 -6
  186. package/dist/components/settings-list.js.map +1 -1
  187. package/dist/components/spacer.d.ts.map +1 -1
  188. package/dist/components/spacer.js.map +1 -1
  189. package/dist/components/text.d.ts.map +1 -1
  190. package/dist/components/text.js +2 -2
  191. package/dist/components/text.js.map +1 -1
  192. package/dist/components/truncated-text.d.ts.map +1 -1
  193. package/dist/components/truncated-text.js.map +1 -1
  194. package/dist/editor-component.d.ts.map +1 -1
  195. package/dist/editor-component.js.map +1 -1
  196. package/dist/fuzzy.d.ts.map +1 -1
  197. package/dist/fuzzy.js.map +1 -1
  198. package/dist/index.d.ts +1 -1
  199. package/dist/index.d.ts.map +1 -1
  200. package/dist/index.js +1 -1
  201. package/dist/index.js.map +1 -1
  202. package/dist/keybindings.d.ts.map +1 -1
  203. package/dist/keybindings.js.map +1 -1
  204. package/dist/keys.d.ts.map +1 -1
  205. package/dist/keys.js +145 -14
  206. package/dist/keys.js.map +1 -1
  207. package/dist/kill-ring.d.ts.map +1 -1
  208. package/dist/kill-ring.js.map +1 -1
  209. package/dist/native-modifiers.d.ts +9 -0
  210. package/dist/native-modifiers.d.ts.map +1 -1
  211. package/dist/native-modifiers.js +5 -0
  212. package/dist/native-modifiers.js.map +1 -1
  213. package/dist/stdin-buffer.d.ts +3 -0
  214. package/dist/stdin-buffer.d.ts.map +1 -1
  215. package/dist/stdin-buffer.js +24 -21
  216. package/dist/stdin-buffer.js.map +1 -1
  217. package/dist/terminal/constants.d.ts +9 -0
  218. package/dist/terminal/constants.d.ts.map +1 -0
  219. package/dist/terminal/constants.js +10 -0
  220. package/dist/terminal/constants.js.map +1 -0
  221. package/dist/terminal/helpers.d.ts +6 -0
  222. package/dist/terminal/helpers.d.ts.map +1 -0
  223. package/dist/terminal/helpers.js +23 -0
  224. package/dist/terminal/helpers.js.map +1 -0
  225. package/dist/terminal/index.d.ts +4 -0
  226. package/dist/terminal/index.d.ts.map +1 -0
  227. package/dist/terminal/index.js +3 -0
  228. package/dist/terminal/index.js.map +1 -0
  229. package/dist/terminal/processterminal-methods/cursor-screen.d.ts +11 -0
  230. package/dist/terminal/processterminal-methods/cursor-screen.d.ts.map +1 -0
  231. package/dist/terminal/processterminal-methods/cursor-screen.js +50 -0
  232. package/dist/terminal/processterminal-methods/cursor-screen.js.map +1 -0
  233. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts +14 -0
  234. package/dist/terminal/processterminal-methods/keyboard-protocol.d.ts.map +1 -0
  235. package/dist/terminal/processterminal-methods/keyboard-protocol.js +147 -0
  236. package/dist/terminal/processterminal-methods/keyboard-protocol.js.map +1 -0
  237. package/dist/terminal/processterminal-methods/terminal-io.d.ts +9 -0
  238. package/dist/terminal/processterminal-methods/terminal-io.d.ts.map +1 -0
  239. package/dist/terminal/processterminal-methods/terminal-io.js +153 -0
  240. package/dist/terminal/processterminal-methods/terminal-io.js.map +1 -0
  241. package/dist/terminal/processterminal.d.ts +49 -0
  242. package/dist/terminal/processterminal.d.ts.map +1 -0
  243. package/dist/terminal/processterminal.js +129 -0
  244. package/dist/terminal/processterminal.js.map +1 -0
  245. package/dist/terminal/types.d.ts +31 -0
  246. package/dist/terminal/types.d.ts.map +1 -0
  247. package/dist/terminal/types.js +2 -0
  248. package/dist/terminal/types.js.map +1 -0
  249. package/dist/terminal-colors.d.ts +2 -0
  250. package/dist/terminal-colors.d.ts.map +1 -1
  251. package/dist/terminal-colors.js +17 -5
  252. package/dist/terminal-colors.js.map +1 -1
  253. package/dist/terminal-image.d.ts.map +1 -1
  254. package/dist/terminal-image.js.map +1 -1
  255. package/dist/terminal.d.ts +1 -109
  256. package/dist/terminal.d.ts.map +1 -1
  257. package/dist/terminal.js +1 -432
  258. package/dist/terminal.js.map +1 -1
  259. package/dist/tui/constants.d.ts +3 -0
  260. package/dist/tui/constants.d.ts.map +1 -0
  261. package/dist/tui/constants.js +3 -0
  262. package/dist/tui/constants.js.map +1 -0
  263. package/dist/tui/container.d.ts +10 -0
  264. package/dist/tui/container.d.ts.map +1 -0
  265. package/dist/tui/container.js +31 -0
  266. package/dist/tui/container.js.map +1 -0
  267. package/dist/tui/helpers.d.ts +8 -0
  268. package/dist/tui/helpers.d.ts.map +1 -0
  269. package/dist/tui/helpers.js +53 -0
  270. package/dist/tui/helpers.js.map +1 -0
  271. package/dist/tui/index.d.ts +6 -0
  272. package/dist/tui/index.d.ts.map +1 -0
  273. package/dist/tui/index.js +5 -0
  274. package/dist/tui/index.js.map +1 -0
  275. package/dist/tui/tui-methods/configuration.d.ts +20 -0
  276. package/dist/tui/tui-methods/configuration.d.ts.map +1 -0
  277. package/dist/tui/tui-methods/configuration.js +131 -0
  278. package/dist/tui/tui-methods/configuration.js.map +1 -0
  279. package/dist/tui/tui-methods/cursor-background.d.ts +10 -0
  280. package/dist/tui/tui-methods/cursor-background.d.ts.map +1 -0
  281. package/dist/tui/tui-methods/cursor-background.js +52 -0
  282. package/dist/tui/tui-methods/cursor-background.js.map +1 -0
  283. package/dist/tui/tui-methods/incremental-render.d.ts +17 -0
  284. package/dist/tui/tui-methods/incremental-render.d.ts.map +1 -0
  285. package/dist/tui/tui-methods/incremental-render.js +259 -0
  286. package/dist/tui/tui-methods/incremental-render.js.map +1 -0
  287. package/dist/tui/tui-methods/input-handling.d.ts +5 -0
  288. package/dist/tui/tui-methods/input-handling.d.ts.map +1 -0
  289. package/dist/tui/tui-methods/input-handling.js +111 -0
  290. package/dist/tui/tui-methods/input-handling.js.map +1 -0
  291. package/dist/tui/tui-methods/line-compositing.d.ts +7 -0
  292. package/dist/tui/tui-methods/line-compositing.d.ts.map +1 -0
  293. package/dist/tui/tui-methods/line-compositing.js +61 -0
  294. package/dist/tui/tui-methods/line-compositing.js.map +1 -0
  295. package/dist/tui/tui-methods/overlay-compositing.d.ts +12 -0
  296. package/dist/tui/tui-methods/overlay-compositing.d.ts.map +1 -0
  297. package/dist/tui/tui-methods/overlay-compositing.js +123 -0
  298. package/dist/tui/tui-methods/overlay-compositing.js.map +1 -0
  299. package/dist/tui/tui-methods/overlay-layout.d.ts +11 -0
  300. package/dist/tui/tui-methods/overlay-layout.d.ts.map +1 -0
  301. package/dist/tui/tui-methods/overlay-layout.js +124 -0
  302. package/dist/tui/tui-methods/overlay-layout.js.map +1 -0
  303. package/dist/tui/tui-methods/overlay-management.d.ts +11 -0
  304. package/dist/tui/tui-methods/overlay-management.d.ts.map +1 -0
  305. package/dist/tui/tui-methods/overlay-management.js +152 -0
  306. package/dist/tui/tui-methods/overlay-management.js.map +1 -0
  307. package/dist/tui/tui-methods/render-pipeline.d.ts +3 -0
  308. package/dist/tui/tui-methods/render-pipeline.d.ts.map +1 -0
  309. package/dist/tui/tui-methods/render-pipeline.js +176 -0
  310. package/dist/tui/tui-methods/render-pipeline.js.map +1 -0
  311. package/dist/tui/tui-methods/render-width-error.d.ts +3 -0
  312. package/dist/tui/tui-methods/render-width-error.d.ts.map +1 -0
  313. package/dist/tui/tui-methods/render-width-error.js +28 -0
  314. package/dist/tui/tui-methods/render-width-error.js.map +1 -0
  315. package/dist/tui/tui-methods/terminal-control.d.ts +8 -0
  316. package/dist/tui/tui-methods/terminal-control.d.ts.map +1 -0
  317. package/dist/tui/tui-methods/terminal-control.js +101 -0
  318. package/dist/tui/tui-methods/terminal-control.js.map +1 -0
  319. package/dist/tui/tui.d.ts +59 -0
  320. package/dist/tui/tui.d.ts.map +1 -0
  321. package/dist/tui/tui.js +78 -0
  322. package/dist/tui/tui.js.map +1 -0
  323. package/dist/tui/types.d.ts +124 -0
  324. package/dist/tui/types.d.ts.map +1 -0
  325. package/dist/tui/types.js +2 -0
  326. package/dist/tui/types.js.map +1 -0
  327. package/dist/tui.d.ts +1 -254
  328. package/dist/tui.d.ts.map +1 -1
  329. package/dist/tui.js +1 -1344
  330. package/dist/tui.js.map +1 -1
  331. package/dist/undo-stack.d.ts.map +1 -1
  332. package/dist/undo-stack.js.map +1 -1
  333. package/dist/utils/ansi-wrapping.d.ts +5 -0
  334. package/dist/utils/ansi-wrapping.d.ts.map +1 -0
  335. package/dist/utils/ansi-wrapping.js +52 -0
  336. package/dist/utils/ansi-wrapping.js.map +1 -0
  337. package/dist/utils/ansicodetracker.d.ts +27 -0
  338. package/dist/utils/ansicodetracker.d.ts.map +1 -0
  339. package/dist/utils/ansicodetracker.js +222 -0
  340. package/dist/utils/ansicodetracker.js.map +1 -0
  341. package/dist/utils/column-slicing.d.ts +12 -0
  342. package/dist/utils/column-slicing.d.ts.map +1 -0
  343. package/dist/utils/column-slicing.js +111 -0
  344. package/dist/utils/column-slicing.js.map +1 -0
  345. package/dist/utils/column-truncation.d.ts +2 -0
  346. package/dist/utils/column-truncation.d.ts.map +1 -0
  347. package/dist/utils/column-truncation.js +129 -0
  348. package/dist/utils/column-truncation.js.map +1 -0
  349. package/dist/utils/constants.d.ts +12 -0
  350. package/dist/utils/constants.d.ts.map +1 -0
  351. package/dist/utils/constants.js +12 -0
  352. package/dist/utils/constants.js.map +1 -0
  353. package/dist/utils/index.d.ts +8 -0
  354. package/dist/utils/index.d.ts.map +1 -0
  355. package/dist/utils/index.js +8 -0
  356. package/dist/utils/index.js.map +1 -0
  357. package/dist/utils/install-delegated-methods.d.ts +5 -0
  358. package/dist/utils/install-delegated-methods.d.ts.map +1 -0
  359. package/dist/utils/install-delegated-methods.js +27 -0
  360. package/dist/utils/install-delegated-methods.js.map +1 -0
  361. package/dist/utils/segmentation.d.ts +10 -0
  362. package/dist/utils/segmentation.d.ts.map +1 -0
  363. package/dist/utils/segmentation.js +111 -0
  364. package/dist/utils/segmentation.js.map +1 -0
  365. package/dist/utils/terminal-output.d.ts +10 -0
  366. package/dist/utils/terminal-output.d.ts.map +1 -0
  367. package/dist/utils/terminal-output.js +122 -0
  368. package/dist/utils/terminal-output.js.map +1 -0
  369. package/dist/utils/types.d.ts +7 -0
  370. package/dist/utils/types.d.ts.map +1 -0
  371. package/dist/utils/types.js +2 -0
  372. package/dist/utils/types.js.map +1 -0
  373. package/dist/utils/width-truncation.d.ts +6 -0
  374. package/dist/utils/width-truncation.d.ts.map +1 -0
  375. package/dist/utils/width-truncation.js +121 -0
  376. package/dist/utils/width-truncation.js.map +1 -0
  377. package/dist/utils/word-wrapping.d.ts +4 -0
  378. package/dist/utils/word-wrapping.d.ts.map +1 -0
  379. package/dist/utils/word-wrapping.js +139 -0
  380. package/dist/utils/word-wrapping.js.map +1 -0
  381. package/dist/utils.d.ts +1 -84
  382. package/dist/utils.d.ts.map +1 -1
  383. package/dist/utils.js +1 -1059
  384. package/dist/utils.js.map +1 -1
  385. package/dist/word-navigation.d.ts.map +1 -1
  386. package/dist/word-navigation.js.map +1 -1
  387. package/package.json +2 -1
@@ -0,0 +1,222 @@
1
+ import { formatOsc8Close, formatOsc8Hyperlink, parseOsc8Hyperlink } from "./terminal-output.js";
2
+ export class AnsiCodeTracker {
3
+ // Track individual attributes separately so we can reset them specifically
4
+ bold = false;
5
+ dim = false;
6
+ italic = false;
7
+ underline = false;
8
+ blink = false;
9
+ inverse = false;
10
+ hidden = false;
11
+ strikethrough = false;
12
+ fgColor = null; // Stores the full code like "31" or "38;5;240"
13
+ bgColor = null; // Stores the full code like "41" or "48;5;240"
14
+ activeHyperlink = null;
15
+ process(ansiCode) {
16
+ // OSC 8 hyperlink: \x1b]8;;<url>\x1b\\ (open) or \x1b]8;;\x1b\\ (close).
17
+ // Preserve the original terminator because some terminals only make BEL-terminated
18
+ // links clickable. OAuth login URLs use BEL, so reopening wrapped lines with ST
19
+ // made only the first physical line clickable in those terminals.
20
+ const hyperlink = parseOsc8Hyperlink(ansiCode);
21
+ if (hyperlink !== undefined) {
22
+ this.activeHyperlink = hyperlink;
23
+ return;
24
+ }
25
+ if (!ansiCode.endsWith("m")) {
26
+ return;
27
+ }
28
+ // Extract the parameters between \x1b[ and m
29
+ const match = ansiCode.match(/\x1b\[([\d;]*)m/);
30
+ if (!match)
31
+ return;
32
+ const params = match[1];
33
+ if (params === "" || params === "0") {
34
+ // Full reset
35
+ this.reset();
36
+ return;
37
+ }
38
+ // Parse parameters (can be semicolon-separated)
39
+ const parts = params.split(";");
40
+ let i = 0;
41
+ while (i < parts.length) {
42
+ const code = Number.parseInt(parts[i], 10);
43
+ // Handle 256-color and RGB codes which consume multiple parameters
44
+ if (code === 38 || code === 48) {
45
+ // 38;5;N (256 color fg) or 38;2;R;G;B (RGB fg)
46
+ // 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)
47
+ if (parts[i + 1] === "5" && parts[i + 2] !== undefined) {
48
+ // 256 color: 38;5;N or 48;5;N
49
+ const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;
50
+ if (code === 38) {
51
+ this.fgColor = colorCode;
52
+ }
53
+ else {
54
+ this.bgColor = colorCode;
55
+ }
56
+ i += 3;
57
+ continue;
58
+ }
59
+ else if (parts[i + 1] === "2" && parts[i + 4] !== undefined) {
60
+ // RGB color: 38;2;R;G;B or 48;2;R;G;B
61
+ const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;
62
+ if (code === 38) {
63
+ this.fgColor = colorCode;
64
+ }
65
+ else {
66
+ this.bgColor = colorCode;
67
+ }
68
+ i += 5;
69
+ continue;
70
+ }
71
+ }
72
+ // Standard SGR codes
73
+ switch (code) {
74
+ case 0:
75
+ this.reset();
76
+ break;
77
+ case 1:
78
+ this.bold = true;
79
+ break;
80
+ case 2:
81
+ this.dim = true;
82
+ break;
83
+ case 3:
84
+ this.italic = true;
85
+ break;
86
+ case 4:
87
+ this.underline = true;
88
+ break;
89
+ case 5:
90
+ this.blink = true;
91
+ break;
92
+ case 7:
93
+ this.inverse = true;
94
+ break;
95
+ case 8:
96
+ this.hidden = true;
97
+ break;
98
+ case 9:
99
+ this.strikethrough = true;
100
+ break;
101
+ case 21:
102
+ this.bold = false;
103
+ break; // Some terminals
104
+ case 22:
105
+ this.bold = false;
106
+ this.dim = false;
107
+ break;
108
+ case 23:
109
+ this.italic = false;
110
+ break;
111
+ case 24:
112
+ this.underline = false;
113
+ break;
114
+ case 25:
115
+ this.blink = false;
116
+ break;
117
+ case 27:
118
+ this.inverse = false;
119
+ break;
120
+ case 28:
121
+ this.hidden = false;
122
+ break;
123
+ case 29:
124
+ this.strikethrough = false;
125
+ break;
126
+ case 39:
127
+ this.fgColor = null;
128
+ break; // Default fg
129
+ case 49:
130
+ this.bgColor = null;
131
+ break; // Default bg
132
+ default:
133
+ // Standard foreground colors 30-37, 90-97
134
+ if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {
135
+ this.fgColor = String(code);
136
+ }
137
+ // Standard background colors 40-47, 100-107
138
+ else if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {
139
+ this.bgColor = String(code);
140
+ }
141
+ break;
142
+ }
143
+ i++;
144
+ }
145
+ }
146
+ reset() {
147
+ this.bold = false;
148
+ this.dim = false;
149
+ this.italic = false;
150
+ this.underline = false;
151
+ this.blink = false;
152
+ this.inverse = false;
153
+ this.hidden = false;
154
+ this.strikethrough = false;
155
+ this.fgColor = null;
156
+ this.bgColor = null;
157
+ // SGR reset does not affect OSC 8 hyperlink state
158
+ }
159
+ /** Clear all state for reuse. */
160
+ clear() {
161
+ this.reset();
162
+ this.activeHyperlink = null;
163
+ }
164
+ getActiveCodes() {
165
+ const codes = [];
166
+ if (this.bold)
167
+ codes.push("1");
168
+ if (this.dim)
169
+ codes.push("2");
170
+ if (this.italic)
171
+ codes.push("3");
172
+ if (this.underline)
173
+ codes.push("4");
174
+ if (this.blink)
175
+ codes.push("5");
176
+ if (this.inverse)
177
+ codes.push("7");
178
+ if (this.hidden)
179
+ codes.push("8");
180
+ if (this.strikethrough)
181
+ codes.push("9");
182
+ if (this.fgColor)
183
+ codes.push(this.fgColor);
184
+ if (this.bgColor)
185
+ codes.push(this.bgColor);
186
+ let result = codes.length > 0 ? `\x1b[${codes.join(";")}m` : "";
187
+ if (this.activeHyperlink) {
188
+ result += formatOsc8Hyperlink(this.activeHyperlink);
189
+ }
190
+ return result;
191
+ }
192
+ hasActiveCodes() {
193
+ return (this.bold ||
194
+ this.dim ||
195
+ this.italic ||
196
+ this.underline ||
197
+ this.blink ||
198
+ this.inverse ||
199
+ this.hidden ||
200
+ this.strikethrough ||
201
+ this.fgColor !== null ||
202
+ this.bgColor !== null ||
203
+ this.activeHyperlink !== null);
204
+ }
205
+ /**
206
+ * Get reset codes for attributes that need to be turned off at line end.
207
+ * Underline must be closed to prevent bleeding into padding.
208
+ * Active OSC 8 hyperlinks must be closed and re-opened on the next line.
209
+ * Returns empty string if no attributes need closing.
210
+ */
211
+ getLineEndReset() {
212
+ let result = "";
213
+ if (this.underline) {
214
+ result += "\x1b[24m"; // Underline off only
215
+ }
216
+ if (this.activeHyperlink) {
217
+ result += formatOsc8Close(this.activeHyperlink.terminator); // Re-opened at line start via getActiveCodes()
218
+ }
219
+ return result;
220
+ }
221
+ }
222
+ //# sourceMappingURL=ansicodetracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ansicodetracker.js","sourceRoot":"","sources":["../../src/utils/ansicodetracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { formatOsc8Close, formatOsc8Hyperlink, parseOsc8Hyperlink } from \"./terminal-output.ts\";\nimport type { ActiveHyperlink } from \"./types.ts\";\n\nexport class AnsiCodeTracker {\n // Track individual attributes separately so we can reset them specifically\n private bold = false;\n private dim = false;\n private italic = false;\n private underline = false;\n private blink = false;\n private inverse = false;\n private hidden = false;\n private strikethrough = false;\n private fgColor: string | null = null; // Stores the full code like \"31\" or \"38;5;240\"\n private bgColor: string | null = null; // Stores the full code like \"41\" or \"48;5;240\"\n private activeHyperlink: ActiveHyperlink | null = null;\n\n process(ansiCode: string): void {\n // OSC 8 hyperlink: \\x1b]8;;<url>\\x1b\\\\ (open) or \\x1b]8;;\\x1b\\\\ (close).\n // Preserve the original terminator because some terminals only make BEL-terminated\n // links clickable. OAuth login URLs use BEL, so reopening wrapped lines with ST\n // made only the first physical line clickable in those terminals.\n const hyperlink = parseOsc8Hyperlink(ansiCode);\n if (hyperlink !== undefined) {\n this.activeHyperlink = hyperlink;\n return;\n }\n\n if (!ansiCode.endsWith(\"m\")) {\n return;\n }\n\n // Extract the parameters between \\x1b[ and m\n const match = ansiCode.match(/\\x1b\\[([\\d;]*)m/);\n if (!match) return;\n\n const params = match[1];\n if (params === \"\" || params === \"0\") {\n // Full reset\n this.reset();\n return;\n }\n\n // Parse parameters (can be semicolon-separated)\n const parts = params.split(\";\");\n let i = 0;\n while (i < parts.length) {\n const code = Number.parseInt(parts[i], 10);\n\n // Handle 256-color and RGB codes which consume multiple parameters\n if (code === 38 || code === 48) {\n // 38;5;N (256 color fg) or 38;2;R;G;B (RGB fg)\n // 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)\n if (parts[i + 1] === \"5\" && parts[i + 2] !== undefined) {\n // 256 color: 38;5;N or 48;5;N\n const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;\n if (code === 38) {\n this.fgColor = colorCode;\n } else {\n this.bgColor = colorCode;\n }\n i += 3;\n continue;\n } else if (parts[i + 1] === \"2\" && parts[i + 4] !== undefined) {\n // RGB color: 38;2;R;G;B or 48;2;R;G;B\n const colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;\n if (code === 38) {\n this.fgColor = colorCode;\n } else {\n this.bgColor = colorCode;\n }\n i += 5;\n continue;\n }\n }\n\n // Standard SGR codes\n switch (code) {\n case 0:\n this.reset();\n break;\n case 1:\n this.bold = true;\n break;\n case 2:\n this.dim = true;\n break;\n case 3:\n this.italic = true;\n break;\n case 4:\n this.underline = true;\n break;\n case 5:\n this.blink = true;\n break;\n case 7:\n this.inverse = true;\n break;\n case 8:\n this.hidden = true;\n break;\n case 9:\n this.strikethrough = true;\n break;\n case 21:\n this.bold = false;\n break; // Some terminals\n case 22:\n this.bold = false;\n this.dim = false;\n break;\n case 23:\n this.italic = false;\n break;\n case 24:\n this.underline = false;\n break;\n case 25:\n this.blink = false;\n break;\n case 27:\n this.inverse = false;\n break;\n case 28:\n this.hidden = false;\n break;\n case 29:\n this.strikethrough = false;\n break;\n case 39:\n this.fgColor = null;\n break; // Default fg\n case 49:\n this.bgColor = null;\n break; // Default bg\n default:\n // Standard foreground colors 30-37, 90-97\n if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {\n this.fgColor = String(code);\n }\n // Standard background colors 40-47, 100-107\n else if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {\n this.bgColor = String(code);\n }\n break;\n }\n i++;\n }\n }\n\n private reset(): void {\n this.bold = false;\n this.dim = false;\n this.italic = false;\n this.underline = false;\n this.blink = false;\n this.inverse = false;\n this.hidden = false;\n this.strikethrough = false;\n this.fgColor = null;\n this.bgColor = null;\n // SGR reset does not affect OSC 8 hyperlink state\n }\n\n /** Clear all state for reuse. */\n clear(): void {\n this.reset();\n this.activeHyperlink = null;\n }\n\n getActiveCodes(): string {\n const codes: string[] = [];\n if (this.bold) codes.push(\"1\");\n if (this.dim) codes.push(\"2\");\n if (this.italic) codes.push(\"3\");\n if (this.underline) codes.push(\"4\");\n if (this.blink) codes.push(\"5\");\n if (this.inverse) codes.push(\"7\");\n if (this.hidden) codes.push(\"8\");\n if (this.strikethrough) codes.push(\"9\");\n if (this.fgColor) codes.push(this.fgColor);\n if (this.bgColor) codes.push(this.bgColor);\n\n let result = codes.length > 0 ? `\\x1b[${codes.join(\";\")}m` : \"\";\n if (this.activeHyperlink) {\n result += formatOsc8Hyperlink(this.activeHyperlink);\n }\n return result;\n }\n\n hasActiveCodes(): boolean {\n return (\n this.bold ||\n this.dim ||\n this.italic ||\n this.underline ||\n this.blink ||\n this.inverse ||\n this.hidden ||\n this.strikethrough ||\n this.fgColor !== null ||\n this.bgColor !== null ||\n this.activeHyperlink !== null\n );\n }\n\n /**\n * Get reset codes for attributes that need to be turned off at line end.\n * Underline must be closed to prevent bleeding into padding.\n * Active OSC 8 hyperlinks must be closed and re-opened on the next line.\n * Returns empty string if no attributes need closing.\n */\n getLineEndReset(): string {\n let result = \"\";\n if (this.underline) {\n result += \"\\x1b[24m\"; // Underline off only\n }\n if (this.activeHyperlink) {\n result += formatOsc8Close(this.activeHyperlink.terminator); // Re-opened at line start via getActiveCodes()\n }\n return result;\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare function sliceWithWidth(line: string, startCol: number, length: number, strict?: boolean): {
2
+ text: string;
3
+ width: number;
4
+ };
5
+ export declare function sliceByColumn(line: string, startCol: number, length: number, strict?: boolean): string;
6
+ export declare function extractSegments(line: string, beforeEnd: number, afterStart: number, afterLen: number, strictAfter?: boolean): {
7
+ before: string;
8
+ beforeWidth: number;
9
+ after: string;
10
+ afterWidth: number;
11
+ };
12
+ //# sourceMappingURL=column-slicing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-slicing.d.ts","sourceRoot":"","sources":["../../src/utils/column-slicing.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA2CjC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAEpG;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,UAAQ,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAiE5E","sourcesContent":["import { AnsiCodeTracker } from \"./ansicodetracker.ts\";\nimport { graphemeSegmenter } from \"./constants.ts\";\nimport { extractAnsiCode, graphemeWidth } from \"./segmentation.ts\";\n\nconst pooledStyleTracker = new AnsiCodeTracker();\n\nexport function sliceWithWidth(\n line: string,\n startCol: number,\n length: number,\n strict = false,\n): { text: string; width: number } {\n if (length <= 0) return { text: \"\", width: 0 };\n const endCol = startCol + length;\n let result = \"\",\n resultWidth = 0,\n currentCol = 0,\n i = 0,\n pendingAnsi = \"\";\n\n while (i < line.length) {\n const ansi = extractAnsiCode(line, i);\n if (ansi) {\n if (currentCol >= startCol && currentCol < endCol) result += ansi.code;\n else if (currentCol < startCol) pendingAnsi += ansi.code;\n i += ansi.length;\n continue;\n }\n\n let textEnd = i;\n while (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n const w = graphemeWidth(segment);\n const inRange = currentCol >= startCol && currentCol < endCol;\n const fits = !strict || currentCol + w <= endCol;\n if (inRange && fits) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += segment;\n resultWidth += w;\n }\n currentCol += w;\n if (currentCol >= endCol) break;\n }\n i = textEnd;\n if (currentCol >= endCol) break;\n }\n if (result.includes(\"\\x1b\") && !result.endsWith(\"\\x1b[0m\")) {\n result += \"\\x1b[0m\";\n }\n return { text: result, width: resultWidth };\n}\n\nexport function sliceByColumn(line: string, startCol: number, length: number, strict = false): string {\n return sliceWithWidth(line, startCol, length, strict).text;\n}\n\nexport function extractSegments(\n line: string,\n beforeEnd: number,\n afterStart: number,\n afterLen: number,\n strictAfter = false,\n): { before: string; beforeWidth: number; after: string; afterWidth: number } {\n let before = \"\",\n beforeWidth = 0,\n after = \"\",\n afterWidth = 0;\n let currentCol = 0,\n i = 0;\n let pendingAnsiBefore = \"\";\n let afterStarted = false;\n const afterEnd = afterStart + afterLen;\n\n // Track styling state so \"after\" inherits styling from before the overlay\n pooledStyleTracker.clear();\n\n while (i < line.length) {\n const ansi = extractAnsiCode(line, i);\n if (ansi) {\n // Track all SGR codes to know styling state at afterStart\n pooledStyleTracker.process(ansi.code);\n // Include ANSI codes in their respective segments\n if (currentCol < beforeEnd) {\n pendingAnsiBefore += ansi.code;\n } else if (currentCol >= afterStart && currentCol < afterEnd && afterStarted) {\n // Only include after we've started \"after\" (styling already prepended)\n after += ansi.code;\n }\n i += ansi.length;\n continue;\n }\n\n let textEnd = i;\n while (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n const w = graphemeWidth(segment);\n\n if (currentCol < beforeEnd && currentCol + w <= beforeEnd) {\n if (pendingAnsiBefore) {\n before += pendingAnsiBefore;\n pendingAnsiBefore = \"\";\n }\n before += segment;\n beforeWidth += w;\n } else if (currentCol >= afterStart && currentCol < afterEnd) {\n const fits = !strictAfter || currentCol + w <= afterEnd;\n if (fits) {\n // On first \"after\" grapheme, prepend inherited styling from before overlay\n if (!afterStarted) {\n after += pooledStyleTracker.getActiveCodes();\n afterStarted = true;\n }\n after += segment;\n afterWidth += w;\n }\n }\n\n currentCol += w;\n // Early exit: done with \"before\" only, or done with both segments\n if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n }\n i = textEnd;\n if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n }\n\n return { before, beforeWidth, after, afterWidth };\n}\n"]}
@@ -0,0 +1,111 @@
1
+ import { AnsiCodeTracker } from "./ansicodetracker.js";
2
+ import { graphemeSegmenter } from "./constants.js";
3
+ import { extractAnsiCode, graphemeWidth } from "./segmentation.js";
4
+ const pooledStyleTracker = new AnsiCodeTracker();
5
+ export function sliceWithWidth(line, startCol, length, strict = false) {
6
+ if (length <= 0)
7
+ return { text: "", width: 0 };
8
+ const endCol = startCol + length;
9
+ let result = "", resultWidth = 0, currentCol = 0, i = 0, pendingAnsi = "";
10
+ while (i < line.length) {
11
+ const ansi = extractAnsiCode(line, i);
12
+ if (ansi) {
13
+ if (currentCol >= startCol && currentCol < endCol)
14
+ result += ansi.code;
15
+ else if (currentCol < startCol)
16
+ pendingAnsi += ansi.code;
17
+ i += ansi.length;
18
+ continue;
19
+ }
20
+ let textEnd = i;
21
+ while (textEnd < line.length && !extractAnsiCode(line, textEnd))
22
+ textEnd++;
23
+ for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {
24
+ const w = graphemeWidth(segment);
25
+ const inRange = currentCol >= startCol && currentCol < endCol;
26
+ const fits = !strict || currentCol + w <= endCol;
27
+ if (inRange && fits) {
28
+ if (pendingAnsi) {
29
+ result += pendingAnsi;
30
+ pendingAnsi = "";
31
+ }
32
+ result += segment;
33
+ resultWidth += w;
34
+ }
35
+ currentCol += w;
36
+ if (currentCol >= endCol)
37
+ break;
38
+ }
39
+ i = textEnd;
40
+ if (currentCol >= endCol)
41
+ break;
42
+ }
43
+ if (result.includes("\x1b") && !result.endsWith("\x1b[0m")) {
44
+ result += "\x1b[0m";
45
+ }
46
+ return { text: result, width: resultWidth };
47
+ }
48
+ export function sliceByColumn(line, startCol, length, strict = false) {
49
+ return sliceWithWidth(line, startCol, length, strict).text;
50
+ }
51
+ export function extractSegments(line, beforeEnd, afterStart, afterLen, strictAfter = false) {
52
+ let before = "", beforeWidth = 0, after = "", afterWidth = 0;
53
+ let currentCol = 0, i = 0;
54
+ let pendingAnsiBefore = "";
55
+ let afterStarted = false;
56
+ const afterEnd = afterStart + afterLen;
57
+ // Track styling state so "after" inherits styling from before the overlay
58
+ pooledStyleTracker.clear();
59
+ while (i < line.length) {
60
+ const ansi = extractAnsiCode(line, i);
61
+ if (ansi) {
62
+ // Track all SGR codes to know styling state at afterStart
63
+ pooledStyleTracker.process(ansi.code);
64
+ // Include ANSI codes in their respective segments
65
+ if (currentCol < beforeEnd) {
66
+ pendingAnsiBefore += ansi.code;
67
+ }
68
+ else if (currentCol >= afterStart && currentCol < afterEnd && afterStarted) {
69
+ // Only include after we've started "after" (styling already prepended)
70
+ after += ansi.code;
71
+ }
72
+ i += ansi.length;
73
+ continue;
74
+ }
75
+ let textEnd = i;
76
+ while (textEnd < line.length && !extractAnsiCode(line, textEnd))
77
+ textEnd++;
78
+ for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {
79
+ const w = graphemeWidth(segment);
80
+ if (currentCol < beforeEnd && currentCol + w <= beforeEnd) {
81
+ if (pendingAnsiBefore) {
82
+ before += pendingAnsiBefore;
83
+ pendingAnsiBefore = "";
84
+ }
85
+ before += segment;
86
+ beforeWidth += w;
87
+ }
88
+ else if (currentCol >= afterStart && currentCol < afterEnd) {
89
+ const fits = !strictAfter || currentCol + w <= afterEnd;
90
+ if (fits) {
91
+ // On first "after" grapheme, prepend inherited styling from before overlay
92
+ if (!afterStarted) {
93
+ after += pooledStyleTracker.getActiveCodes();
94
+ afterStarted = true;
95
+ }
96
+ after += segment;
97
+ afterWidth += w;
98
+ }
99
+ }
100
+ currentCol += w;
101
+ // Early exit: done with "before" only, or done with both segments
102
+ if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd)
103
+ break;
104
+ }
105
+ i = textEnd;
106
+ if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd)
107
+ break;
108
+ }
109
+ return { before, beforeWidth, after, afterWidth };
110
+ }
111
+ //# sourceMappingURL=column-slicing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-slicing.js","sourceRoot":"","sources":["../../src/utils/column-slicing.ts"],"names":[],"mappings":"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","sourcesContent":["import { AnsiCodeTracker } from \"./ansicodetracker.ts\";\nimport { graphemeSegmenter } from \"./constants.ts\";\nimport { extractAnsiCode, graphemeWidth } from \"./segmentation.ts\";\n\nconst pooledStyleTracker = new AnsiCodeTracker();\n\nexport function sliceWithWidth(\n line: string,\n startCol: number,\n length: number,\n strict = false,\n): { text: string; width: number } {\n if (length <= 0) return { text: \"\", width: 0 };\n const endCol = startCol + length;\n let result = \"\",\n resultWidth = 0,\n currentCol = 0,\n i = 0,\n pendingAnsi = \"\";\n\n while (i < line.length) {\n const ansi = extractAnsiCode(line, i);\n if (ansi) {\n if (currentCol >= startCol && currentCol < endCol) result += ansi.code;\n else if (currentCol < startCol) pendingAnsi += ansi.code;\n i += ansi.length;\n continue;\n }\n\n let textEnd = i;\n while (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n const w = graphemeWidth(segment);\n const inRange = currentCol >= startCol && currentCol < endCol;\n const fits = !strict || currentCol + w <= endCol;\n if (inRange && fits) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += segment;\n resultWidth += w;\n }\n currentCol += w;\n if (currentCol >= endCol) break;\n }\n i = textEnd;\n if (currentCol >= endCol) break;\n }\n if (result.includes(\"\\x1b\") && !result.endsWith(\"\\x1b[0m\")) {\n result += \"\\x1b[0m\";\n }\n return { text: result, width: resultWidth };\n}\n\nexport function sliceByColumn(line: string, startCol: number, length: number, strict = false): string {\n return sliceWithWidth(line, startCol, length, strict).text;\n}\n\nexport function extractSegments(\n line: string,\n beforeEnd: number,\n afterStart: number,\n afterLen: number,\n strictAfter = false,\n): { before: string; beforeWidth: number; after: string; afterWidth: number } {\n let before = \"\",\n beforeWidth = 0,\n after = \"\",\n afterWidth = 0;\n let currentCol = 0,\n i = 0;\n let pendingAnsiBefore = \"\";\n let afterStarted = false;\n const afterEnd = afterStart + afterLen;\n\n // Track styling state so \"after\" inherits styling from before the overlay\n pooledStyleTracker.clear();\n\n while (i < line.length) {\n const ansi = extractAnsiCode(line, i);\n if (ansi) {\n // Track all SGR codes to know styling state at afterStart\n pooledStyleTracker.process(ansi.code);\n // Include ANSI codes in their respective segments\n if (currentCol < beforeEnd) {\n pendingAnsiBefore += ansi.code;\n } else if (currentCol >= afterStart && currentCol < afterEnd && afterStarted) {\n // Only include after we've started \"after\" (styling already prepended)\n after += ansi.code;\n }\n i += ansi.length;\n continue;\n }\n\n let textEnd = i;\n while (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n for (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n const w = graphemeWidth(segment);\n\n if (currentCol < beforeEnd && currentCol + w <= beforeEnd) {\n if (pendingAnsiBefore) {\n before += pendingAnsiBefore;\n pendingAnsiBefore = \"\";\n }\n before += segment;\n beforeWidth += w;\n } else if (currentCol >= afterStart && currentCol < afterEnd) {\n const fits = !strictAfter || currentCol + w <= afterEnd;\n if (fits) {\n // On first \"after\" grapheme, prepend inherited styling from before overlay\n if (!afterStarted) {\n after += pooledStyleTracker.getActiveCodes();\n afterStarted = true;\n }\n after += segment;\n afterWidth += w;\n }\n }\n\n currentCol += w;\n // Early exit: done with \"before\" only, or done with both segments\n if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n }\n i = textEnd;\n if (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n }\n\n return { before, beforeWidth, after, afterWidth };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function truncateToWidth(text: string, maxWidth: number, ellipsis?: string, pad?: boolean): string;
2
+ //# sourceMappingURL=column-truncation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-truncation.d.ts","sourceRoot":"","sources":["../../src/utils/column-truncation.ts"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAY,EAAE,GAAG,GAAE,OAAe,GAAG,MAAM,CAmIpH","sourcesContent":["import { graphemeSegmenter } from \"./constants.ts\";\nimport { extractAnsiCode, graphemeWidth, isPrintableAscii } from \"./segmentation.ts\";\nimport { finalizeTruncatedResult } from \"./terminal-output.ts\";\nimport { truncateFragmentToWidth, visibleWidth } from \"./width-truncation.ts\";\n\nexport function truncateToWidth(text: string, maxWidth: number, ellipsis: string = \"…\", pad: boolean = false): string {\n if (maxWidth <= 0) {\n return \"\";\n }\n\n if (text.length === 0) {\n return pad ? \" \".repeat(maxWidth) : \"\";\n }\n\n const ellipsisWidth = visibleWidth(ellipsis);\n if (ellipsisWidth >= maxWidth) {\n const textWidth = visibleWidth(text);\n if (textWidth <= maxWidth) {\n return pad ? text + \" \".repeat(maxWidth - textWidth) : text;\n }\n\n const clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);\n if (clippedEllipsis.width === 0) {\n return pad ? \" \".repeat(maxWidth) : \"\";\n }\n return finalizeTruncatedResult(\"\", 0, clippedEllipsis.text, clippedEllipsis.width, maxWidth, pad);\n }\n\n if (isPrintableAscii(text)) {\n if (text.length <= maxWidth) {\n return pad ? text + \" \".repeat(maxWidth - text.length) : text;\n }\n const targetWidth = maxWidth - ellipsisWidth;\n return finalizeTruncatedResult(text.slice(0, targetWidth), targetWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n }\n\n const targetWidth = maxWidth - ellipsisWidth;\n let result = \"\";\n let pendingAnsi = \"\";\n let visibleSoFar = 0;\n let keptWidth = 0;\n let keepContiguousPrefix = true;\n let overflowed = false;\n let exhaustedInput = false;\n const hasAnsi = text.includes(\"\\x1b\");\n const hasTabs = text.includes(\"\\t\");\n\n if (!hasAnsi && !hasTabs) {\n for (const { segment } of graphemeSegmenter.segment(text)) {\n const width = graphemeWidth(segment);\n if (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n result += segment;\n keptWidth += width;\n } else {\n keepContiguousPrefix = false;\n }\n visibleSoFar += width;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n }\n exhaustedInput = !overflowed;\n } else {\n let i = 0;\n while (i < text.length) {\n const ansi = extractAnsiCode(text, i);\n if (ansi) {\n pendingAnsi += ansi.code;\n i += ansi.length;\n continue;\n }\n\n if (text[i] === \"\\t\") {\n if (keepContiguousPrefix && keptWidth + 4 <= targetWidth) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += \"\\t\";\n keptWidth += 4;\n } else {\n keepContiguousPrefix = false;\n pendingAnsi = \"\";\n }\n visibleSoFar += 4;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n i++;\n continue;\n }\n\n let end = i;\n while (end < text.length && text[end] !== \"\\t\") {\n const nextAnsi = extractAnsiCode(text, end);\n if (nextAnsi) {\n break;\n }\n end++;\n }\n\n for (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n const width = graphemeWidth(segment);\n if (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += segment;\n keptWidth += width;\n } else {\n keepContiguousPrefix = false;\n pendingAnsi = \"\";\n }\n\n visibleSoFar += width;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n }\n if (overflowed) {\n break;\n }\n i = end;\n }\n exhaustedInput = i >= text.length;\n }\n\n if (!overflowed && exhaustedInput) {\n return pad ? text + \" \".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;\n }\n\n return finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n}\n"]}
@@ -0,0 +1,129 @@
1
+ import { graphemeSegmenter } from "./constants.js";
2
+ import { extractAnsiCode, graphemeWidth, isPrintableAscii } from "./segmentation.js";
3
+ import { finalizeTruncatedResult } from "./terminal-output.js";
4
+ import { truncateFragmentToWidth, visibleWidth } from "./width-truncation.js";
5
+ export function truncateToWidth(text, maxWidth, ellipsis = "…", pad = false) {
6
+ if (maxWidth <= 0) {
7
+ return "";
8
+ }
9
+ if (text.length === 0) {
10
+ return pad ? " ".repeat(maxWidth) : "";
11
+ }
12
+ const ellipsisWidth = visibleWidth(ellipsis);
13
+ if (ellipsisWidth >= maxWidth) {
14
+ const textWidth = visibleWidth(text);
15
+ if (textWidth <= maxWidth) {
16
+ return pad ? text + " ".repeat(maxWidth - textWidth) : text;
17
+ }
18
+ const clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);
19
+ if (clippedEllipsis.width === 0) {
20
+ return pad ? " ".repeat(maxWidth) : "";
21
+ }
22
+ return finalizeTruncatedResult("", 0, clippedEllipsis.text, clippedEllipsis.width, maxWidth, pad);
23
+ }
24
+ if (isPrintableAscii(text)) {
25
+ if (text.length <= maxWidth) {
26
+ return pad ? text + " ".repeat(maxWidth - text.length) : text;
27
+ }
28
+ const targetWidth = maxWidth - ellipsisWidth;
29
+ return finalizeTruncatedResult(text.slice(0, targetWidth), targetWidth, ellipsis, ellipsisWidth, maxWidth, pad);
30
+ }
31
+ const targetWidth = maxWidth - ellipsisWidth;
32
+ let result = "";
33
+ let pendingAnsi = "";
34
+ let visibleSoFar = 0;
35
+ let keptWidth = 0;
36
+ let keepContiguousPrefix = true;
37
+ let overflowed = false;
38
+ let exhaustedInput = false;
39
+ const hasAnsi = text.includes("\x1b");
40
+ const hasTabs = text.includes("\t");
41
+ if (!hasAnsi && !hasTabs) {
42
+ for (const { segment } of graphemeSegmenter.segment(text)) {
43
+ const width = graphemeWidth(segment);
44
+ if (keepContiguousPrefix && keptWidth + width <= targetWidth) {
45
+ result += segment;
46
+ keptWidth += width;
47
+ }
48
+ else {
49
+ keepContiguousPrefix = false;
50
+ }
51
+ visibleSoFar += width;
52
+ if (visibleSoFar > maxWidth) {
53
+ overflowed = true;
54
+ break;
55
+ }
56
+ }
57
+ exhaustedInput = !overflowed;
58
+ }
59
+ else {
60
+ let i = 0;
61
+ while (i < text.length) {
62
+ const ansi = extractAnsiCode(text, i);
63
+ if (ansi) {
64
+ pendingAnsi += ansi.code;
65
+ i += ansi.length;
66
+ continue;
67
+ }
68
+ if (text[i] === "\t") {
69
+ if (keepContiguousPrefix && keptWidth + 4 <= targetWidth) {
70
+ if (pendingAnsi) {
71
+ result += pendingAnsi;
72
+ pendingAnsi = "";
73
+ }
74
+ result += "\t";
75
+ keptWidth += 4;
76
+ }
77
+ else {
78
+ keepContiguousPrefix = false;
79
+ pendingAnsi = "";
80
+ }
81
+ visibleSoFar += 4;
82
+ if (visibleSoFar > maxWidth) {
83
+ overflowed = true;
84
+ break;
85
+ }
86
+ i++;
87
+ continue;
88
+ }
89
+ let end = i;
90
+ while (end < text.length && text[end] !== "\t") {
91
+ const nextAnsi = extractAnsiCode(text, end);
92
+ if (nextAnsi) {
93
+ break;
94
+ }
95
+ end++;
96
+ }
97
+ for (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {
98
+ const width = graphemeWidth(segment);
99
+ if (keepContiguousPrefix && keptWidth + width <= targetWidth) {
100
+ if (pendingAnsi) {
101
+ result += pendingAnsi;
102
+ pendingAnsi = "";
103
+ }
104
+ result += segment;
105
+ keptWidth += width;
106
+ }
107
+ else {
108
+ keepContiguousPrefix = false;
109
+ pendingAnsi = "";
110
+ }
111
+ visibleSoFar += width;
112
+ if (visibleSoFar > maxWidth) {
113
+ overflowed = true;
114
+ break;
115
+ }
116
+ }
117
+ if (overflowed) {
118
+ break;
119
+ }
120
+ i = end;
121
+ }
122
+ exhaustedInput = i >= text.length;
123
+ }
124
+ if (!overflowed && exhaustedInput) {
125
+ return pad ? text + " ".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;
126
+ }
127
+ return finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);
128
+ }
129
+ //# sourceMappingURL=column-truncation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"column-truncation.js","sourceRoot":"","sources":["../../src/utils/column-truncation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE9E,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,QAAgB,EAAE,QAAQ,GAAW,KAAG,EAAE,GAAG,GAAY,KAAK,EAAU;IACpH,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,aAAa,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,aAAa,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;YAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,CAAC;QAED,MAAM,eAAe,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,eAAe,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,uBAAuB,CAAC,EAAE,EAAE,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACpG,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC5B,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,CAAC;QACD,MAAM,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;QAC7C,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC7C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,oBAAoB,GAAG,IAAI,CAAC;IAChC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,oBAAoB,IAAI,SAAS,GAAG,KAAK,IAAI,WAAW,EAAE,CAAC;gBAC7D,MAAM,IAAI,OAAO,CAAC;gBAClB,SAAS,IAAI,KAAK,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,oBAAoB,GAAG,KAAK,CAAC;YAC/B,CAAC;YACD,YAAY,IAAI,KAAK,CAAC;YACtB,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;gBAC5B,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;QACD,cAAc,GAAG,CAAC,UAAU,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC;gBACzB,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;gBACjB,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACrB,IAAI,oBAAoB,IAAI,SAAS,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;oBACzD,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,IAAI,WAAW,CAAC;wBACtB,WAAW,GAAG,EAAE,CAAC;oBACnB,CAAC;oBACD,MAAM,IAAI,IAAI,CAAC;oBACf,SAAS,IAAI,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,oBAAoB,GAAG,KAAK,CAAC;oBAC7B,WAAW,GAAG,EAAE,CAAC;gBACnB,CAAC;gBACD,YAAY,IAAI,CAAC,CAAC;gBAClB,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;oBAC5B,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;gBACD,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YAED,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC5C,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM;gBACR,CAAC;gBACD,GAAG,EAAE,CAAC;YACR,CAAC;YAED,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxE,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;gBACrC,IAAI,oBAAoB,IAAI,SAAS,GAAG,KAAK,IAAI,WAAW,EAAE,CAAC;oBAC7D,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,IAAI,WAAW,CAAC;wBACtB,WAAW,GAAG,EAAE,CAAC;oBACnB,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC;oBAClB,SAAS,IAAI,KAAK,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,oBAAoB,GAAG,KAAK,CAAC;oBAC7B,WAAW,GAAG,EAAE,CAAC;gBACnB,CAAC;gBAED,YAAY,IAAI,KAAK,CAAC;gBACtB,IAAI,YAAY,GAAG,QAAQ,EAAE,CAAC;oBAC5B,UAAU,GAAG,IAAI,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM;YACR,CAAC;YACD,CAAC,GAAG,GAAG,CAAC;QACV,CAAC;QACD,cAAc,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,CAAC;IAED,OAAO,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;AAAA,CAC3F","sourcesContent":["import { graphemeSegmenter } from \"./constants.ts\";\nimport { extractAnsiCode, graphemeWidth, isPrintableAscii } from \"./segmentation.ts\";\nimport { finalizeTruncatedResult } from \"./terminal-output.ts\";\nimport { truncateFragmentToWidth, visibleWidth } from \"./width-truncation.ts\";\n\nexport function truncateToWidth(text: string, maxWidth: number, ellipsis: string = \"…\", pad: boolean = false): string {\n if (maxWidth <= 0) {\n return \"\";\n }\n\n if (text.length === 0) {\n return pad ? \" \".repeat(maxWidth) : \"\";\n }\n\n const ellipsisWidth = visibleWidth(ellipsis);\n if (ellipsisWidth >= maxWidth) {\n const textWidth = visibleWidth(text);\n if (textWidth <= maxWidth) {\n return pad ? text + \" \".repeat(maxWidth - textWidth) : text;\n }\n\n const clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);\n if (clippedEllipsis.width === 0) {\n return pad ? \" \".repeat(maxWidth) : \"\";\n }\n return finalizeTruncatedResult(\"\", 0, clippedEllipsis.text, clippedEllipsis.width, maxWidth, pad);\n }\n\n if (isPrintableAscii(text)) {\n if (text.length <= maxWidth) {\n return pad ? text + \" \".repeat(maxWidth - text.length) : text;\n }\n const targetWidth = maxWidth - ellipsisWidth;\n return finalizeTruncatedResult(text.slice(0, targetWidth), targetWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n }\n\n const targetWidth = maxWidth - ellipsisWidth;\n let result = \"\";\n let pendingAnsi = \"\";\n let visibleSoFar = 0;\n let keptWidth = 0;\n let keepContiguousPrefix = true;\n let overflowed = false;\n let exhaustedInput = false;\n const hasAnsi = text.includes(\"\\x1b\");\n const hasTabs = text.includes(\"\\t\");\n\n if (!hasAnsi && !hasTabs) {\n for (const { segment } of graphemeSegmenter.segment(text)) {\n const width = graphemeWidth(segment);\n if (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n result += segment;\n keptWidth += width;\n } else {\n keepContiguousPrefix = false;\n }\n visibleSoFar += width;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n }\n exhaustedInput = !overflowed;\n } else {\n let i = 0;\n while (i < text.length) {\n const ansi = extractAnsiCode(text, i);\n if (ansi) {\n pendingAnsi += ansi.code;\n i += ansi.length;\n continue;\n }\n\n if (text[i] === \"\\t\") {\n if (keepContiguousPrefix && keptWidth + 4 <= targetWidth) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += \"\\t\";\n keptWidth += 4;\n } else {\n keepContiguousPrefix = false;\n pendingAnsi = \"\";\n }\n visibleSoFar += 4;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n i++;\n continue;\n }\n\n let end = i;\n while (end < text.length && text[end] !== \"\\t\") {\n const nextAnsi = extractAnsiCode(text, end);\n if (nextAnsi) {\n break;\n }\n end++;\n }\n\n for (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n const width = graphemeWidth(segment);\n if (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n if (pendingAnsi) {\n result += pendingAnsi;\n pendingAnsi = \"\";\n }\n result += segment;\n keptWidth += width;\n } else {\n keepContiguousPrefix = false;\n pendingAnsi = \"\";\n }\n\n visibleSoFar += width;\n if (visibleSoFar > maxWidth) {\n overflowed = true;\n break;\n }\n }\n if (overflowed) {\n break;\n }\n i = end;\n }\n exhaustedInput = i >= text.length;\n }\n\n if (!overflowed && exhaustedInput) {\n return pad ? text + \" \".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;\n }\n\n return finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n}\n"]}
@@ -0,0 +1,12 @@
1
+ export declare const graphemeSegmenter: Intl.Segmenter;
2
+ export declare const wordSegmenter: Intl.Segmenter;
3
+ export declare const zeroWidthRegex: RegExp;
4
+ export declare const leadingNonPrintingRegex: RegExp;
5
+ export declare const rgiEmojiRegex: RegExp;
6
+ export declare const WIDTH_CACHE_SIZE = 512;
7
+ export declare const widthCache: Map<string, number>;
8
+ export declare const cjkBreakRegex: RegExp;
9
+ export declare const THAI_LAO_AM_REGEX: RegExp;
10
+ export declare const THAI_LAO_AM_GLOBAL_REGEX: RegExp;
11
+ export declare const PUNCTUATION_REGEX: RegExp;
12
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,gBAA6D,CAAC;AAE5F,eAAO,MAAM,aAAa,gBAAyD,CAAC;AAEpF,eAAO,MAAM,cAAc,QAAgF,CAAC;AAE5G,eAAO,MAAM,uBAAuB,QAC+C,CAAC;AAEpF,eAAO,MAAM,aAAa,QAAqB,CAAC;AAEhD,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,UAAU,qBAA4B,CAAC;AAEpD,eAAO,MAAM,aAAa,QAC4H,CAAC;AAEvJ,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAElD,eAAO,MAAM,wBAAwB,QAAoB,CAAC;AAE1D,eAAO,MAAM,iBAAiB,QAAyC,CAAC","sourcesContent":["export const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport const wordSegmenter = new Intl.Segmenter(undefined, { granularity: \"word\" });\n\nexport const zeroWidthRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$/v;\n\nexport const leadingNonPrintingRegex =\n /^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+/v;\n\nexport const rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\nexport const WIDTH_CACHE_SIZE = 512;\n\nexport const widthCache = new Map<string, number>();\n\nexport const cjkBreakRegex =\n /[\\p{Script_Extensions=Han}\\p{Script_Extensions=Hiragana}\\p{Script_Extensions=Katakana}\\p{Script_Extensions=Hangul}\\p{Script_Extensions=Bopomofo}]/u;\n\nexport const THAI_LAO_AM_REGEX = /[\\u0e33\\u0eb3]/;\n\nexport const THAI_LAO_AM_GLOBAL_REGEX = /[\\u0e33\\u0eb3]/g;\n\nexport const PUNCTUATION_REGEX = /[(){}[\\]<>.,;:'\"!?+\\-=*/\\\\|&%^$#@~`]/;\n"]}
@@ -0,0 +1,12 @@
1
+ export const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
2
+ export const wordSegmenter = new Intl.Segmenter(undefined, { granularity: "word" });
3
+ export const zeroWidthRegex = /^(?:\p{Default_Ignorable_Code_Point}|\p{Control}|\p{Mark}|\p{Surrogate})+$/v;
4
+ export const leadingNonPrintingRegex = /^[\p{Default_Ignorable_Code_Point}\p{Control}\p{Format}\p{Mark}\p{Surrogate}]+/v;
5
+ export const rgiEmojiRegex = /^\p{RGI_Emoji}$/v;
6
+ export const WIDTH_CACHE_SIZE = 512;
7
+ export const widthCache = new Map();
8
+ export const cjkBreakRegex = /[\p{Script_Extensions=Han}\p{Script_Extensions=Hiragana}\p{Script_Extensions=Katakana}\p{Script_Extensions=Hangul}\p{Script_Extensions=Bopomofo}]/u;
9
+ export const THAI_LAO_AM_REGEX = /[\u0e33\u0eb3]/;
10
+ export const THAI_LAO_AM_GLOBAL_REGEX = /[\u0e33\u0eb3]/g;
11
+ export const PUNCTUATION_REGEX = /[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;
12
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;AAE5F,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,6EAA6E,CAAC;AAE5G,MAAM,CAAC,MAAM,uBAAuB,GAClC,iFAAiF,CAAC;AAEpF,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAEhD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,aAAa,GACxB,oJAAoJ,CAAC;AAEvJ,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,MAAM,CAAC,MAAM,wBAAwB,GAAG,iBAAiB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAC","sourcesContent":["export const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\nexport const wordSegmenter = new Intl.Segmenter(undefined, { granularity: \"word\" });\n\nexport const zeroWidthRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$/v;\n\nexport const leadingNonPrintingRegex =\n /^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+/v;\n\nexport const rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\nexport const WIDTH_CACHE_SIZE = 512;\n\nexport const widthCache = new Map<string, number>();\n\nexport const cjkBreakRegex =\n /[\\p{Script_Extensions=Han}\\p{Script_Extensions=Hiragana}\\p{Script_Extensions=Katakana}\\p{Script_Extensions=Hangul}\\p{Script_Extensions=Bopomofo}]/u;\n\nexport const THAI_LAO_AM_REGEX = /[\\u0e33\\u0eb3]/;\n\nexport const THAI_LAO_AM_GLOBAL_REGEX = /[\\u0e33\\u0eb3]/g;\n\nexport const PUNCTUATION_REGEX = /[(){}[\\]<>.,;:'\"!?+\\-=*/\\\\|&%^$#@~`]/;\n"]}
@@ -0,0 +1,8 @@
1
+ export { applyBackgroundToLine, isPunctuationChar, isWhitespaceChar, wrapTextWithAnsi } from "./ansi-wrapping.ts";
2
+ export { extractSegments, sliceByColumn, sliceWithWidth } from "./column-slicing.ts";
3
+ export { truncateToWidth } from "./column-truncation.ts";
4
+ export { cjkBreakRegex, PUNCTUATION_REGEX } from "./constants.ts";
5
+ export { extractAnsiCode, getGraphemeSegmenter, getWordSegmenter } from "./segmentation.ts";
6
+ export { normalizeTerminalOutput } from "./terminal-output.ts";
7
+ export { visibleWidth } from "./width-truncation.ts";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC","sourcesContent":["export { applyBackgroundToLine, isPunctuationChar, isWhitespaceChar, wrapTextWithAnsi } from \"./ansi-wrapping.ts\";\nexport { extractSegments, sliceByColumn, sliceWithWidth } from \"./column-slicing.ts\";\nexport { truncateToWidth } from \"./column-truncation.ts\";\nexport { cjkBreakRegex, PUNCTUATION_REGEX } from \"./constants.ts\";\nexport { extractAnsiCode, getGraphemeSegmenter, getWordSegmenter } from \"./segmentation.ts\";\nexport { normalizeTerminalOutput } from \"./terminal-output.ts\";\nexport { visibleWidth } from \"./width-truncation.ts\";\n"]}
@@ -0,0 +1,8 @@
1
+ export { applyBackgroundToLine, isPunctuationChar, isWhitespaceChar, wrapTextWithAnsi } from "./ansi-wrapping.js";
2
+ export { extractSegments, sliceByColumn, sliceWithWidth } from "./column-slicing.js";
3
+ export { truncateToWidth } from "./column-truncation.js";
4
+ export { cjkBreakRegex, PUNCTUATION_REGEX } from "./constants.js";
5
+ export { extractAnsiCode, getGraphemeSegmenter, getWordSegmenter } from "./segmentation.js";
6
+ export { normalizeTerminalOutput } from "./terminal-output.js";
7
+ export { visibleWidth } from "./width-truncation.js";
8
+ //# sourceMappingURL=index.js.map