@kingkoo1985/ink 6.6.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 (225) hide show
  1. package/build/colorize.d.ts +4 -0
  2. package/build/colorize.js +59 -0
  3. package/build/colorize.js.map +1 -0
  4. package/build/components/AccessibilityContext.d.ts +3 -0
  5. package/build/components/AccessibilityContext.js +5 -0
  6. package/build/components/AccessibilityContext.js.map +1 -0
  7. package/build/components/App.d.ts +68 -0
  8. package/build/components/App.js +290 -0
  9. package/build/components/App.js.map +1 -0
  10. package/build/components/AppContext.d.ts +52 -0
  11. package/build/components/AppContext.js +16 -0
  12. package/build/components/AppContext.js.map +1 -0
  13. package/build/components/BackgroundContext.d.ts +4 -0
  14. package/build/components/BackgroundContext.js +3 -0
  15. package/build/components/BackgroundContext.js.map +1 -0
  16. package/build/components/Box.d.ts +171 -0
  17. package/build/components/Box.js +40 -0
  18. package/build/components/Box.js.map +1 -0
  19. package/build/components/ErrorOverview.d.ts +6 -0
  20. package/build/components/ErrorOverview.js +84 -0
  21. package/build/components/ErrorOverview.js.map +1 -0
  22. package/build/components/FocusContext.d.ts +16 -0
  23. package/build/components/FocusContext.js +16 -0
  24. package/build/components/FocusContext.js.map +1 -0
  25. package/build/components/Newline.d.ts +13 -0
  26. package/build/components/Newline.js +8 -0
  27. package/build/components/Newline.js.map +1 -0
  28. package/build/components/Spacer.d.ts +7 -0
  29. package/build/components/Spacer.js +11 -0
  30. package/build/components/Spacer.js.map +1 -0
  31. package/build/components/Static.d.ts +24 -0
  32. package/build/components/Static.js +29 -0
  33. package/build/components/Static.js.map +1 -0
  34. package/build/components/StaticRender.d.ts +8 -0
  35. package/build/components/StaticRender.js +19 -0
  36. package/build/components/StaticRender.js.map +1 -0
  37. package/build/components/StderrContext.d.ts +15 -0
  38. package/build/components/StderrContext.js +12 -0
  39. package/build/components/StderrContext.js.map +1 -0
  40. package/build/components/StdinContext.d.ts +22 -0
  41. package/build/components/StdinContext.js +16 -0
  42. package/build/components/StdinContext.js.map +1 -0
  43. package/build/components/StdoutContext.d.ts +15 -0
  44. package/build/components/StdoutContext.js +12 -0
  45. package/build/components/StdoutContext.js.map +1 -0
  46. package/build/components/Text.d.ts +63 -0
  47. package/build/components/Text.js +50 -0
  48. package/build/components/Text.js.map +1 -0
  49. package/build/components/Transform.d.ts +16 -0
  50. package/build/components/Transform.js +15 -0
  51. package/build/components/Transform.js.map +1 -0
  52. package/build/data-limited-lru-map.d.ts +20 -0
  53. package/build/data-limited-lru-map.js +65 -0
  54. package/build/data-limited-lru-map.js.map +1 -0
  55. package/build/debug-log.d.ts +2 -0
  56. package/build/debug-log.js +44 -0
  57. package/build/debug-log.js.map +1 -0
  58. package/build/devtools-window-polyfill.d.ts +1 -0
  59. package/build/devtools-window-polyfill.js +65 -0
  60. package/build/devtools-window-polyfill.js.map +1 -0
  61. package/build/devtools.d.ts +1 -0
  62. package/build/devtools.js +8 -0
  63. package/build/devtools.js.map +1 -0
  64. package/build/dom.d.ts +114 -0
  65. package/build/dom.js +169 -0
  66. package/build/dom.js.map +1 -0
  67. package/build/get-max-width.d.ts +3 -0
  68. package/build/get-max-width.js +10 -0
  69. package/build/get-max-width.js.map +1 -0
  70. package/build/hooks/use-app.d.ts +5 -0
  71. package/build/hooks/use-app.js +8 -0
  72. package/build/hooks/use-app.js.map +1 -0
  73. package/build/hooks/use-focus-manager.d.ts +28 -0
  74. package/build/hooks/use-focus-manager.js +17 -0
  75. package/build/hooks/use-focus-manager.js.map +1 -0
  76. package/build/hooks/use-focus.d.ts +29 -0
  77. package/build/hooks/use-focus.js +42 -0
  78. package/build/hooks/use-focus.js.map +1 -0
  79. package/build/hooks/use-input.d.ts +93 -0
  80. package/build/hooks/use-input.js +92 -0
  81. package/build/hooks/use-input.js.map +1 -0
  82. package/build/hooks/use-is-screen-reader-enabled.d.ts +5 -0
  83. package/build/hooks/use-is-screen-reader-enabled.js +11 -0
  84. package/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  85. package/build/hooks/use-stderr.d.ts +5 -0
  86. package/build/hooks/use-stderr.js +8 -0
  87. package/build/hooks/use-stderr.js.map +1 -0
  88. package/build/hooks/use-stdin.d.ts +5 -0
  89. package/build/hooks/use-stdin.js +8 -0
  90. package/build/hooks/use-stdin.js.map +1 -0
  91. package/build/hooks/use-stdout.d.ts +5 -0
  92. package/build/hooks/use-stdout.js +8 -0
  93. package/build/hooks/use-stdout.js.map +1 -0
  94. package/build/index.d.ts +38 -0
  95. package/build/index.js +27 -0
  96. package/build/index.js.map +1 -0
  97. package/build/ink.d.ts +110 -0
  98. package/build/ink.js +576 -0
  99. package/build/ink.js.map +1 -0
  100. package/build/instances.d.ts +3 -0
  101. package/build/instances.js +8 -0
  102. package/build/instances.js.map +1 -0
  103. package/build/layout.d.ts +18 -0
  104. package/build/layout.js +54 -0
  105. package/build/layout.js.map +1 -0
  106. package/build/log-update.d.ts +28 -0
  107. package/build/log-update.js +529 -0
  108. package/build/log-update.js.map +1 -0
  109. package/build/measure-element.d.ts +119 -0
  110. package/build/measure-element.js +825 -0
  111. package/build/measure-element.js.map +1 -0
  112. package/build/measure-text.d.ts +50 -0
  113. package/build/measure-text.js +237 -0
  114. package/build/measure-text.js.map +1 -0
  115. package/build/output.d.ts +242 -0
  116. package/build/output.js +607 -0
  117. package/build/output.js.map +1 -0
  118. package/build/parse-keypress.d.ts +14 -0
  119. package/build/parse-keypress.js +225 -0
  120. package/build/parse-keypress.js.map +1 -0
  121. package/build/reconciler.d.ts +4 -0
  122. package/build/reconciler.js +326 -0
  123. package/build/reconciler.js.map +1 -0
  124. package/build/render-background.d.ts +4 -0
  125. package/build/render-background.js +37 -0
  126. package/build/render-background.js.map +1 -0
  127. package/build/render-border.d.ts +4 -0
  128. package/build/render-border.js +81 -0
  129. package/build/render-border.js.map +1 -0
  130. package/build/render-cached.d.ts +18 -0
  131. package/build/render-cached.js +66 -0
  132. package/build/render-cached.js.map +1 -0
  133. package/build/render-container.d.ts +27 -0
  134. package/build/render-container.js +169 -0
  135. package/build/render-container.js.map +1 -0
  136. package/build/render-node-to-output.d.ts +32 -0
  137. package/build/render-node-to-output.js +177 -0
  138. package/build/render-node-to-output.js.map +1 -0
  139. package/build/render-screen-reader.d.ts +5 -0
  140. package/build/render-screen-reader.js +54 -0
  141. package/build/render-screen-reader.js.map +1 -0
  142. package/build/render-scrollbar.d.ts +23 -0
  143. package/build/render-scrollbar.js +70 -0
  144. package/build/render-scrollbar.js.map +1 -0
  145. package/build/render-sticky.d.ts +53 -0
  146. package/build/render-sticky.js +317 -0
  147. package/build/render-sticky.js.map +1 -0
  148. package/build/render-text-node.d.ts +20 -0
  149. package/build/render-text-node.js +155 -0
  150. package/build/render-text-node.js.map +1 -0
  151. package/build/render.d.ts +165 -0
  152. package/build/render.js +60 -0
  153. package/build/render.js.map +1 -0
  154. package/build/renderer.d.ts +24 -0
  155. package/build/renderer.js +292 -0
  156. package/build/renderer.js.map +1 -0
  157. package/build/replay.d.ts +59 -0
  158. package/build/replay.js +128 -0
  159. package/build/replay.js.map +1 -0
  160. package/build/resize-observer.d.ts +24 -0
  161. package/build/resize-observer.js +102 -0
  162. package/build/resize-observer.js.map +1 -0
  163. package/build/scroll.d.ts +11 -0
  164. package/build/scroll.js +123 -0
  165. package/build/scroll.js.map +1 -0
  166. package/build/selection.d.ts +52 -0
  167. package/build/selection.js +359 -0
  168. package/build/selection.js.map +1 -0
  169. package/build/serialization.d.ts +25 -0
  170. package/build/serialization.js +224 -0
  171. package/build/serialization.js.map +1 -0
  172. package/build/squash-text-nodes.d.ts +16 -0
  173. package/build/squash-text-nodes.js +58 -0
  174. package/build/squash-text-nodes.js.map +1 -0
  175. package/build/styled-line.d.ts +58 -0
  176. package/build/styled-line.js +629 -0
  177. package/build/styled-line.js.map +1 -0
  178. package/build/styles.d.ts +286 -0
  179. package/build/styles.js +257 -0
  180. package/build/styles.js.map +1 -0
  181. package/build/terminal-buffer.d.ts +57 -0
  182. package/build/terminal-buffer.js +507 -0
  183. package/build/terminal-buffer.js.map +1 -0
  184. package/build/text-wrap.d.ts +12 -0
  185. package/build/text-wrap.js +154 -0
  186. package/build/text-wrap.js.map +1 -0
  187. package/build/tokenize.d.ts +47 -0
  188. package/build/tokenize.js +419 -0
  189. package/build/tokenize.js.map +1 -0
  190. package/build/vertical-gap.d.ts +17 -0
  191. package/build/vertical-gap.js +20 -0
  192. package/build/vertical-gap.js.map +1 -0
  193. package/build/worker/animation-controller.d.ts +72 -0
  194. package/build/worker/animation-controller.js +128 -0
  195. package/build/worker/animation-controller.js.map +1 -0
  196. package/build/worker/ansi-utils.d.ts +16 -0
  197. package/build/worker/ansi-utils.js +40 -0
  198. package/build/worker/ansi-utils.js.map +1 -0
  199. package/build/worker/canvas.d.ts +49 -0
  200. package/build/worker/canvas.js +90 -0
  201. package/build/worker/canvas.js.map +1 -0
  202. package/build/worker/compositor.d.ts +33 -0
  203. package/build/worker/compositor.js +308 -0
  204. package/build/worker/compositor.js.map +1 -0
  205. package/build/worker/platform.d.ts +15 -0
  206. package/build/worker/platform.js +19 -0
  207. package/build/worker/platform.js.map +1 -0
  208. package/build/worker/render-worker.d.ts +112 -0
  209. package/build/worker/render-worker.js +944 -0
  210. package/build/worker/render-worker.js.map +1 -0
  211. package/build/worker/scene-manager.d.ts +26 -0
  212. package/build/worker/scene-manager.js +109 -0
  213. package/build/worker/scene-manager.js.map +1 -0
  214. package/build/worker/scroll-optimizer.d.ts +32 -0
  215. package/build/worker/scroll-optimizer.js +110 -0
  216. package/build/worker/scroll-optimizer.js.map +1 -0
  217. package/build/worker/terminal-writer.d.ts +116 -0
  218. package/build/worker/terminal-writer.js +708 -0
  219. package/build/worker/terminal-writer.js.map +1 -0
  220. package/build/worker/worker-entry.d.ts +6 -0
  221. package/build/worker/worker-entry.js +130 -0
  222. package/build/worker/worker-entry.js.map +1 -0
  223. package/license +9 -0
  224. package/package.json +208 -0
  225. package/readme.md +2353 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { collectSortedFragments } from './measure-element.js';
7
+ export const processLayout = (node, callbacks) => {
8
+ const { initialState, onNewline, onSpace, onText } = callbacks;
9
+ if ((node.nodeName !== 'ink-box' &&
10
+ node.nodeName !== 'ink-root' &&
11
+ node.nodeName !== 'ink-text' &&
12
+ node.nodeName !== 'ink-virtual-text') ||
13
+ !node.yogaNode) {
14
+ return { state: initialState(), lineBottom: 0 };
15
+ }
16
+ const { fragments } = collectSortedFragments(node);
17
+ const state = {
18
+ ...initialState(),
19
+ currentX: 0,
20
+ lineBottom: 0,
21
+ yieldedContent: false,
22
+ };
23
+ for (const fragment of fragments) {
24
+ if (fragment.y >= state.lineBottom) {
25
+ const gap = fragment.y - state.lineBottom;
26
+ const newlines = state.yieldedContent ? 1 + gap : gap;
27
+ if (newlines > 0) {
28
+ onNewline(newlines, state);
29
+ state.currentX = 0;
30
+ }
31
+ state.lineBottom = fragment.y;
32
+ }
33
+ if (fragment.x > state.currentX) {
34
+ const spaces = fragment.x - state.currentX;
35
+ onSpace(spaces, state);
36
+ state.currentX = fragment.x;
37
+ }
38
+ if (fragment.text.length > 0) {
39
+ state.yieldedContent = true;
40
+ onText(fragment, state);
41
+ }
42
+ const newlinesInText = (fragment.text.match(/\n/g) ?? []).length;
43
+ if (newlinesInText > 0) {
44
+ const lastNewlineIndex = fragment.text.lastIndexOf('\n');
45
+ state.currentX = fragment.text.length - lastNewlineIndex - 1;
46
+ }
47
+ else {
48
+ state.currentX += fragment.text.length;
49
+ }
50
+ state.lineBottom = Math.max(state.lineBottom, fragment.y + fragment.height);
51
+ }
52
+ return { state, lineBottom: state.lineBottom };
53
+ };
54
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../src/layout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAC,sBAAsB,EAAoB,MAAM,sBAAsB,CAAC;AAW/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,IAAa,EACb,SAA6B,EACI,EAAE;IACnC,MAAM,EAAC,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAC,GAAG,SAAS,CAAC;IAE7D,IACC,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;QAC3B,IAAI,CAAC,QAAQ,KAAK,UAAU;QAC5B,IAAI,CAAC,QAAQ,KAAK,UAAU;QAC5B,IAAI,CAAC,QAAQ,KAAK,kBAAkB,CAAC;QACtC,CAAC,IAAI,CAAC,QAAQ,EACb,CAAC;QACF,OAAO,EAAC,KAAK,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,CAAC,EAAC,CAAC;IAC/C,CAAC;IAED,MAAM,EAAC,SAAS,EAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAIP;QACH,GAAG,YAAY,EAAE;QACjB,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,KAAK;KACrB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,IAAI,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;YAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAEtD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAClB,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAC3B,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;YACpB,CAAC;YAED,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC3C,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvB,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACjE,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACzD,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAC,CAAC;AAC9C,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type Writable } from 'node:stream';
2
+ import { type StyledLine } from './styled-line.js';
3
+ export type CursorPosition = {
4
+ row: number;
5
+ col: number;
6
+ };
7
+ /**
8
+ * Position terminal cursor for IME support.
9
+ * Calculates relative distance from the end of output to the cursor position.
10
+ */
11
+ export declare function positionImeCursor(lineCount: number, cursorPosition: CursorPosition): string;
12
+ export type LogUpdate = {
13
+ clear: () => void;
14
+ done: () => void;
15
+ sync: (str: string, cursorPosition?: CursorPosition) => void;
16
+ (str: string, styledOutput: StyledLine[], debugRainbowColor?: string, cursorPosition?: CursorPosition): void;
17
+ };
18
+ declare const logUpdate: {
19
+ create: (stream: Writable, { showCursor, alternateBuffer, alternateBufferAlreadyActive, incremental, getRows, getColumns, }?: {
20
+ showCursor?: boolean;
21
+ alternateBuffer?: boolean;
22
+ alternateBufferAlreadyActive?: boolean;
23
+ incremental?: boolean;
24
+ getRows?: () => number;
25
+ getColumns?: () => number;
26
+ }) => LogUpdate;
27
+ };
28
+ export default logUpdate;
@@ -0,0 +1,529 @@
1
+ import process from 'node:process';
2
+ import ansiEscapes from 'ansi-escapes';
3
+ import cliCursor from 'cli-cursor';
4
+ import colorize from './colorize.js';
5
+ // Debugging option to simulate flicker if for terminals that do not support enableSynchronizedOutput.
6
+ const enableSynchronizedOutput = true;
7
+ const enterSynchronizedOutput = '\u001B[?2026h';
8
+ const exitSynchronizedOutput = '\u001B[?2026l';
9
+ /**
10
+ * Build cursor movement sequence to move from currentRow to targetRow and targetCol.
11
+ * Uses safe pattern: go to line start → move rows → set column
12
+ * This avoids issues with intermediate lines being shorter than cursor position.
13
+ */
14
+ function buildCursorMovement(currentRow, targetRow, targetCol) {
15
+ let buffer = '';
16
+ buffer += ansiEscapes.cursorTo(0);
17
+ const rowDiff = targetRow - currentRow;
18
+ if (rowDiff > 0) {
19
+ buffer += ansiEscapes.cursorDown(rowDiff);
20
+ }
21
+ else if (rowDiff < 0) {
22
+ buffer += ansiEscapes.cursorUp(-rowDiff);
23
+ }
24
+ buffer += ansiEscapes.cursorTo(targetCol);
25
+ return buffer;
26
+ }
27
+ /**
28
+ * Position terminal cursor for IME support.
29
+ * Calculates relative distance from the end of output to the cursor position.
30
+ */
31
+ export function positionImeCursor(lineCount, cursorPosition) {
32
+ let buffer = '';
33
+ const moveUp = lineCount - 1 - cursorPosition.row;
34
+ if (moveUp > 0) {
35
+ buffer += ansiEscapes.cursorUp(moveUp);
36
+ }
37
+ buffer += ansiEscapes.cursorTo(cursorPosition.col);
38
+ return buffer;
39
+ }
40
+ const enterAlternateBuffer = (stream, alreadyActive) => {
41
+ if (!alreadyActive) {
42
+ stream.write(ansiEscapes.enterAlternativeScreen);
43
+ }
44
+ stream.write('\u001B[?7l');
45
+ };
46
+ const exitAlternateBuffer = (stream, lastFrame) => {
47
+ stream.write('\u001B[?7h');
48
+ stream.write(ansiEscapes.exitAlternativeScreen);
49
+ // The last frame was rendered to the alternate buffer.
50
+ // We need to render it again to the main buffer. If apps do not
51
+ // want this behavior, they can make sure the last frame is empty
52
+ // before unmounting.
53
+ stream.write(lastFrame);
54
+ };
55
+ const clearAlternateBuffer = (stream) => {
56
+ const eraseOperation = process.env['TERM_PROGRAM'] === 'iTerm.app'
57
+ ? ansiEscapes.clearTerminal
58
+ : ansiEscapes.eraseScreen;
59
+ stream.write(eraseOperation);
60
+ };
61
+ const ensureCursorHidden = (showCursor, hasHiddenCursor, stream) => {
62
+ if (!showCursor && !hasHiddenCursor) {
63
+ cliCursor.hide(stream);
64
+ return true;
65
+ }
66
+ return hasHiddenCursor;
67
+ };
68
+ const ensureCursorShown = (showCursor, stream) => {
69
+ if (!showCursor) {
70
+ cliCursor.show(stream);
71
+ }
72
+ };
73
+ const isCursorPositionEqual = (a, b) => {
74
+ const posA = a ?? { row: 0, col: 0 };
75
+ const posB = b ?? { row: 0, col: 0 };
76
+ return posA.row === posB.row && posA.col === posB.col;
77
+ };
78
+ /**
79
+ * Get cursor position sequence for Alternate Buffer.
80
+ * Alternate Buffer has no scroll, so we can use absolute coordinates directly.
81
+ */
82
+ const getAlternateBufferCursorSequence = (cursorPosition) => {
83
+ if (!cursorPosition) {
84
+ return '';
85
+ }
86
+ return ansiEscapes.cursorTo(cursorPosition.col, cursorPosition.row);
87
+ };
88
+ const moveCursorDown = (buffer, skippedLines) => {
89
+ if (skippedLines > 0) {
90
+ if (skippedLines === 1) {
91
+ buffer.push(ansiEscapes.cursorNextLine);
92
+ }
93
+ else {
94
+ buffer.push(ansiEscapes.cursorDown(skippedLines));
95
+ }
96
+ }
97
+ return 0;
98
+ };
99
+ const getLineLength = (styledChars) => {
100
+ if (styledChars === undefined) {
101
+ return 0;
102
+ }
103
+ for (let j = styledChars.length - 1; j >= 0; j--) {
104
+ const char = styledChars.getValue(j);
105
+ if (!char) {
106
+ continue;
107
+ }
108
+ if ((char !== ' ' && char !== '') || styledChars.hasStyles(j)) {
109
+ return j + (styledChars.getFullWidth(j) ? 2 : 1);
110
+ }
111
+ }
112
+ return 0;
113
+ };
114
+ const createStandard = (stream, { showCursor = false, alternateBuffer = false, alternateBufferAlreadyActive = false, getRows = () => 0, getColumns = () => 0, } = {}) => {
115
+ let previousLineCount = 0;
116
+ let previousOutput = '';
117
+ // Keep track of the actual previous output rendered to the alternate buffer
118
+ // which may be truncated to the terminal height.
119
+ let previousOutputAlternateBuffer = '';
120
+ let previousRows = 0;
121
+ let previousColumns = 0;
122
+ let hasHiddenCursor = false;
123
+ let isFirstRender = true;
124
+ let previousCursorPosition;
125
+ if (alternateBuffer) {
126
+ enterAlternateBuffer(stream, alternateBufferAlreadyActive);
127
+ }
128
+ const render = (str, _styledOutput, debugRainbowColor, cursorPosition) => {
129
+ if (!showCursor) {
130
+ hasHiddenCursor = ensureCursorHidden(showCursor, hasHiddenCursor, stream);
131
+ }
132
+ const output = str + '\n';
133
+ if (alternateBuffer) {
134
+ let alternateBufferOutput = output;
135
+ const rows = getRows() ?? 0;
136
+ const columns = getColumns() ?? 0;
137
+ if (rows > 0) {
138
+ const lines = str.split('\n');
139
+ const lineCount = lines.length;
140
+ // Only write the first `rows` lines as the alternate buffer
141
+ // will not scroll so all we accomplish by writing more
142
+ // content is risking flicker and confusing the terminal about
143
+ // the cursor position.
144
+ if (lineCount > rows) {
145
+ alternateBufferOutput = lines.slice(0, rows).join('\n');
146
+ }
147
+ }
148
+ // In alternate buffer mode we need to re-render based on whether content
149
+ // visible within the clipped alternate output buffer has changed even
150
+ // if the entire output string has not changed.
151
+ if (alternateBufferOutput !== previousOutputAlternateBuffer ||
152
+ rows !== previousRows ||
153
+ columns !== previousColumns ||
154
+ !isCursorPositionEqual(cursorPosition, previousCursorPosition)) {
155
+ // Unfortunately, eraseScreen does not work correctly in iTerm2 so we
156
+ // have to use clearTerminal instead.
157
+ const eraseOperation = process.env['TERM_PROGRAM'] === 'iTerm.app'
158
+ ? ansiEscapes.clearTerminal
159
+ : ansiEscapes.eraseScreen;
160
+ let outputToWrite = alternateBufferOutput;
161
+ outputToWrite = debugRainbowColor
162
+ ? colorize(outputToWrite, debugRainbowColor, 'background')
163
+ : outputToWrite;
164
+ const cursorSequence = getAlternateBufferCursorSequence(cursorPosition);
165
+ stream.write((enableSynchronizedOutput ? enterSynchronizedOutput : '') +
166
+ ansiEscapes.cursorTo(0, 0) +
167
+ eraseOperation +
168
+ outputToWrite +
169
+ cursorSequence +
170
+ (enableSynchronizedOutput ? exitSynchronizedOutput : ''));
171
+ previousOutputAlternateBuffer = alternateBufferOutput;
172
+ previousRows = rows;
173
+ previousColumns = columns;
174
+ previousCursorPosition = cursorPosition ?? { row: 0, col: 0 };
175
+ }
176
+ previousOutput = output;
177
+ return;
178
+ }
179
+ const cursorChanged = !isCursorPositionEqual(cursorPosition, previousCursorPosition);
180
+ if (output === previousOutput) {
181
+ // Output is the same, but cursor position may have changed
182
+ if (cursorChanged && cursorPosition && previousCursorPosition) {
183
+ const buffer = buildCursorMovement(previousCursorPosition.row, cursorPosition.row, cursorPosition.col);
184
+ previousCursorPosition = cursorPosition;
185
+ stream.write(buffer);
186
+ }
187
+ return;
188
+ }
189
+ const lineCount = output.split('\n').length;
190
+ let buffer = '';
191
+ // Move cursor to end of previous output before erasing (only if we have previous cursor position)
192
+ if (!isFirstRender && previousCursorPosition) {
193
+ const moveDown = previousLineCount - 1 - previousCursorPosition.row;
194
+ if (moveDown > 0) {
195
+ buffer += ansiEscapes.cursorDown(moveDown);
196
+ }
197
+ }
198
+ // Always erase previous lines
199
+ buffer += ansiEscapes.eraseLines(previousLineCount);
200
+ buffer += output;
201
+ isFirstRender = false;
202
+ if (cursorPosition) {
203
+ buffer += positionImeCursor(lineCount, cursorPosition);
204
+ }
205
+ previousCursorPosition = cursorPosition;
206
+ previousOutput = output;
207
+ previousLineCount = lineCount;
208
+ let outputToWrite = buffer;
209
+ if (debugRainbowColor) {
210
+ outputToWrite =
211
+ ansiEscapes.eraseLines(previousLineCount) +
212
+ colorize(output, debugRainbowColor, 'background');
213
+ }
214
+ stream.write(outputToWrite);
215
+ };
216
+ render.clear = () => {
217
+ hasHiddenCursor = false;
218
+ if (alternateBuffer) {
219
+ clearAlternateBuffer(stream);
220
+ previousOutput = '';
221
+ previousOutputAlternateBuffer = '';
222
+ return;
223
+ }
224
+ let buffer = '';
225
+ if (previousCursorPosition) {
226
+ const moveDown = previousLineCount - 1 - previousCursorPosition.row;
227
+ if (moveDown > 0) {
228
+ buffer += ansiEscapes.cursorDown(moveDown);
229
+ }
230
+ }
231
+ stream.write(buffer + ansiEscapes.eraseLines(previousLineCount));
232
+ previousOutput = '';
233
+ previousLineCount = 0;
234
+ };
235
+ render.done = () => {
236
+ const lastFrame = previousOutput;
237
+ previousOutput = '';
238
+ previousLineCount = 0;
239
+ if (!showCursor) {
240
+ ensureCursorShown(showCursor, stream);
241
+ hasHiddenCursor = false;
242
+ }
243
+ if (alternateBuffer) {
244
+ exitAlternateBuffer(stream, lastFrame);
245
+ }
246
+ };
247
+ render.sync = (str, _cursorPosition) => {
248
+ if (alternateBuffer) {
249
+ previousOutput = str;
250
+ return;
251
+ }
252
+ const output = str + '\n';
253
+ previousOutput = output;
254
+ previousLineCount = output.split('\n').length;
255
+ };
256
+ return render;
257
+ };
258
+ const createIncremental = (stream, { showCursor = false, alternateBuffer = false, alternateBufferAlreadyActive = false, getRows = () => 0, getColumns = () => 0, } = {}) => {
259
+ let previousLines = [];
260
+ let previousOutput = '';
261
+ let previousOutputAlternateBuffer = '';
262
+ let previousRows = 0;
263
+ let previousColumns = 0;
264
+ let hasHiddenCursor = false;
265
+ let alternateBufferStyledOutput = [];
266
+ let previousCursorPosition;
267
+ if (alternateBuffer) {
268
+ enterAlternateBuffer(stream, alternateBufferAlreadyActive);
269
+ }
270
+ const render = (str, styledOutput, debugRainbowColor, cursorPosition) => {
271
+ if (!showCursor) {
272
+ hasHiddenCursor = ensureCursorHidden(showCursor, hasHiddenCursor, stream);
273
+ }
274
+ const output = str + '\n';
275
+ if (alternateBuffer) {
276
+ let alternateBufferOutput = output;
277
+ const rows = getRows() ?? 0;
278
+ const columns = getColumns() ?? 0;
279
+ if (rows > 0) {
280
+ const lines = str.split('\n');
281
+ const lineCount = lines.length;
282
+ // Only write the first `rows` lines as the alternate buffer
283
+ // will not scroll so all we accomplish by writing more
284
+ // content is risking flicker and confusion about the terminal about
285
+ // the cursor position.
286
+ if (lineCount > rows) {
287
+ alternateBufferOutput = lines.slice(0, rows).join('\n');
288
+ alternateBufferStyledOutput = styledOutput.slice(0, rows);
289
+ }
290
+ else {
291
+ alternateBufferOutput = lines.join('\n');
292
+ alternateBufferStyledOutput = styledOutput;
293
+ }
294
+ }
295
+ // In alternate buffer mode we need to re-render based on whether content
296
+ // visible within the clipped alternate output buffer has changed even
297
+ // if the entire output string has not changed.
298
+ if (alternateBufferOutput !== previousOutputAlternateBuffer ||
299
+ rows !== previousRows ||
300
+ columns !== previousColumns ||
301
+ !isCursorPositionEqual(cursorPosition, previousCursorPosition)) {
302
+ const nextLines = alternateBufferOutput.split('\n');
303
+ const cursorSequence = getAlternateBufferCursorSequence(cursorPosition);
304
+ if (rows === previousRows && columns === previousColumns) {
305
+ const buffer = [];
306
+ if (enableSynchronizedOutput) {
307
+ buffer.push(enterSynchronizedOutput);
308
+ }
309
+ buffer.push(ansiEscapes.cursorTo(0, 0));
310
+ let skippedLines = 0;
311
+ for (let i = 0; i < nextLines.length; i++) {
312
+ if (nextLines[i] === previousLines[i]) {
313
+ skippedLines++;
314
+ continue;
315
+ }
316
+ skippedLines = moveCursorDown(buffer, skippedLines);
317
+ let lineToWrite = nextLines[i] ?? '';
318
+ const lineLength = getLineLength(alternateBufferStyledOutput[i]);
319
+ lineToWrite = debugRainbowColor
320
+ ? colorize(lineToWrite, debugRainbowColor, 'background')
321
+ : lineToWrite;
322
+ buffer.push(lineToWrite);
323
+ if (columns > lineLength) {
324
+ // Clear the rest of the line without introducing flicker.
325
+ // We could optimize this further by only writing spaces up to the last line length
326
+ // but this is safer.
327
+ // The one failure mode for this is that if we add too many spaces and there was a
328
+ // non space character at the very end of the line
329
+ buffer.push(' '.repeat(columns - lineLength));
330
+ }
331
+ if (i < nextLines.length - 1) {
332
+ buffer.push('\n');
333
+ }
334
+ }
335
+ skippedLines = moveCursorDown(buffer, skippedLines);
336
+ if (previousLines.length > nextLines.length) {
337
+ const linesToClear = previousLines.length - nextLines.length;
338
+ for (let i = 0; i < linesToClear; i++) {
339
+ buffer.push(ansiEscapes.eraseLine + ansiEscapes.cursorNextLine);
340
+ }
341
+ }
342
+ buffer.push(cursorSequence);
343
+ if (enableSynchronizedOutput) {
344
+ buffer.push(exitSynchronizedOutput);
345
+ }
346
+ stream.write(buffer.join(''));
347
+ }
348
+ else {
349
+ // Unfortunately, eraseScreen does not work correctly in iTerm2 so we
350
+ // have to use clearTerminal instead.
351
+ const eraseOperation = process.env['TERM_PROGRAM'] === 'iTerm.app'
352
+ ? ansiEscapes.clearTerminal
353
+ : ansiEscapes.eraseScreen;
354
+ let outputToWrite = alternateBufferOutput;
355
+ outputToWrite = debugRainbowColor
356
+ ? colorize(outputToWrite, debugRainbowColor, 'background')
357
+ : outputToWrite;
358
+ stream.write((enableSynchronizedOutput ? enterSynchronizedOutput : '') +
359
+ ansiEscapes.cursorTo(0, 0) +
360
+ eraseOperation +
361
+ outputToWrite +
362
+ cursorSequence +
363
+ (enableSynchronizedOutput ? exitSynchronizedOutput : ''));
364
+ previousRows = rows;
365
+ previousColumns = columns;
366
+ }
367
+ previousOutputAlternateBuffer = alternateBufferOutput;
368
+ previousLines = nextLines;
369
+ previousCursorPosition = cursorPosition ?? { row: 0, col: 0 };
370
+ }
371
+ previousOutput = output;
372
+ return;
373
+ }
374
+ if (output === previousOutput) {
375
+ if (!isCursorPositionEqual(cursorPosition, previousCursorPosition) &&
376
+ cursorPosition &&
377
+ previousCursorPosition) {
378
+ const buffer = buildCursorMovement(previousCursorPosition.row, cursorPosition.row, cursorPosition.col);
379
+ previousCursorPosition = cursorPosition;
380
+ stream.write(buffer);
381
+ }
382
+ return;
383
+ }
384
+ const previousCount = previousLines.length;
385
+ const nextLines = output.split('\n');
386
+ const nextCount = nextLines.length;
387
+ const visibleCount = nextCount - 1;
388
+ if (cursorPosition !== undefined || previousCursorPosition !== undefined) {
389
+ let buffer = '';
390
+ if (output === '\n' || previousOutput.length === 0) {
391
+ // First rendering
392
+ buffer += output;
393
+ buffer += ansiEscapes.cursorSavePosition;
394
+ }
395
+ else {
396
+ // Incremental rendering after cursor restore
397
+ buffer += ansiEscapes.cursorRestorePosition;
398
+ if (nextCount < previousCount) {
399
+ buffer += ansiEscapes.eraseLines(previousCount - nextCount + 1);
400
+ buffer += ansiEscapes.cursorUp(visibleCount);
401
+ }
402
+ else {
403
+ buffer += ansiEscapes.cursorUp(previousCount - 1);
404
+ }
405
+ for (let i = 0; i < visibleCount; i++) {
406
+ if (nextLines[i] === previousLines[i]) {
407
+ buffer += ansiEscapes.cursorNextLine;
408
+ continue;
409
+ }
410
+ buffer += ansiEscapes.eraseLine + nextLines[i] + '\n';
411
+ }
412
+ buffer += ansiEscapes.cursorSavePosition;
413
+ }
414
+ if (cursorPosition) {
415
+ // Move cursor to specified position
416
+ buffer += buildCursorMovement(visibleCount, cursorPosition.row, cursorPosition.col);
417
+ }
418
+ stream.write(buffer);
419
+ previousOutput = output;
420
+ previousLines = nextLines;
421
+ previousCursorPosition = cursorPosition;
422
+ return;
423
+ }
424
+ if (output === '\n' || previousOutput.length === 0) {
425
+ let outputToWrite = output;
426
+ outputToWrite = debugRainbowColor
427
+ ? colorize(outputToWrite, debugRainbowColor, 'background')
428
+ : outputToWrite;
429
+ stream.write(ansiEscapes.eraseLines(previousCount) + outputToWrite);
430
+ previousOutput = output;
431
+ previousLines = nextLines;
432
+ return;
433
+ }
434
+ // We aggregate all chunks for incremental rendering into a buffer, and then write them to stdout at the end.
435
+ const buffer = [];
436
+ // Clear extra lines if the current content's line count is lower than the previous.
437
+ if (nextCount < previousCount) {
438
+ buffer.push(
439
+ // Erases the trailing lines and the final newline slot.
440
+ ansiEscapes.eraseLines(previousCount - nextCount + 1),
441
+ // Positions cursor to the top of the rendered output.
442
+ ansiEscapes.cursorUp(visibleCount));
443
+ }
444
+ else {
445
+ buffer.push(ansiEscapes.cursorUp(previousCount - 1));
446
+ }
447
+ let skippedLines = 0;
448
+ for (let i = 0; i < visibleCount; i++) {
449
+ // We do not write lines if the contents are the same. This prevents flickering during renders.
450
+ if (nextLines[i] === previousLines[i]) {
451
+ skippedLines++;
452
+ continue;
453
+ }
454
+ skippedLines = moveCursorDown(buffer, skippedLines);
455
+ let lineToWrite = nextLines[i] ?? '';
456
+ lineToWrite = debugRainbowColor
457
+ ? colorize(lineToWrite, debugRainbowColor, 'background')
458
+ : lineToWrite;
459
+ buffer.push(ansiEscapes.eraseLine + lineToWrite + '\n');
460
+ }
461
+ skippedLines = moveCursorDown(buffer, skippedLines);
462
+ stream.write(buffer.join(''));
463
+ previousOutput = output;
464
+ previousLines = nextLines;
465
+ };
466
+ render.clear = () => {
467
+ hasHiddenCursor = false;
468
+ if (alternateBuffer) {
469
+ clearAlternateBuffer(stream);
470
+ previousOutput = '';
471
+ previousOutputAlternateBuffer = '';
472
+ previousLines = [];
473
+ return;
474
+ }
475
+ let buffer = '';
476
+ if (previousCursorPosition) {
477
+ const moveDown = previousLines.length - 1 - previousCursorPosition.row;
478
+ if (moveDown > 0) {
479
+ buffer += ansiEscapes.cursorDown(moveDown);
480
+ }
481
+ }
482
+ stream.write(buffer + ansiEscapes.eraseLines(previousLines.length));
483
+ previousOutput = '';
484
+ previousLines = [];
485
+ };
486
+ render.done = () => {
487
+ const lastFrame = previousOutput;
488
+ previousOutput = '';
489
+ previousLines = [];
490
+ if (!showCursor) {
491
+ ensureCursorShown(showCursor, stream);
492
+ hasHiddenCursor = false;
493
+ }
494
+ if (alternateBuffer) {
495
+ exitAlternateBuffer(stream, lastFrame);
496
+ }
497
+ };
498
+ render.sync = (str, _cursorPosition) => {
499
+ if (alternateBuffer) {
500
+ previousOutput = str;
501
+ return;
502
+ }
503
+ const output = str + '\n';
504
+ previousOutput = output;
505
+ previousLines = output.split('\n');
506
+ };
507
+ return render;
508
+ };
509
+ const create = (stream, { showCursor = false, alternateBuffer = false, alternateBufferAlreadyActive = false, incremental = false, getRows, getColumns, } = {}) => {
510
+ if (incremental) {
511
+ return createIncremental(stream, {
512
+ showCursor,
513
+ alternateBuffer,
514
+ alternateBufferAlreadyActive,
515
+ getRows,
516
+ getColumns,
517
+ });
518
+ }
519
+ return createStandard(stream, {
520
+ showCursor,
521
+ alternateBuffer,
522
+ alternateBufferAlreadyActive,
523
+ getRows,
524
+ getColumns,
525
+ });
526
+ };
527
+ const logUpdate = { create };
528
+ export default logUpdate;
529
+ //# sourceMappingURL=log-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-update.js","sourceRoot":"","sources":["../src/log-update.ts"],"names":[],"mappings":"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"}