@elench/testkit 0.1.114 → 0.1.115
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.
- package/lib/cli/assistant/app.mjs +4 -2
- package/lib/cli/assistant/session.mjs +5 -1
- package/lib/cli/assistant/state.mjs +1 -2
- package/lib/cli/components/blocks/run-tree.mjs +7 -2
- package/lib/cli/components/hooks/use-element-layout.mjs +63 -0
- package/lib/cli/components/hooks/use-spinner-frame.mjs +26 -0
- package/node_modules/@alcalzone/ansi-tokenize/README.md +0 -5
- package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.d.ts +8 -0
- package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js +10 -8
- package/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js.map +1 -1
- package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.d.ts +1 -5
- package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js +9 -45
- package/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js.map +1 -1
- package/node_modules/@alcalzone/ansi-tokenize/package.json +1 -1
- package/node_modules/@elench/next-analysis/package.json +1 -1
- package/node_modules/@elench/testkit-bridge/package.json +2 -2
- package/node_modules/@elench/testkit-protocol/package.json +1 -1
- package/node_modules/@elench/ts-analysis/package.json +1 -1
- package/node_modules/cli-boxes/index.d.ts +95 -90
- package/node_modules/cli-boxes/index.js +5 -2
- package/node_modules/cli-boxes/package.json +6 -13
- package/node_modules/cli-boxes/readme.md +15 -3
- package/node_modules/cli-truncate/index.d.ts +1 -1
- package/node_modules/cli-truncate/package.json +4 -4
- package/node_modules/cli-truncate/readme.md +1 -0
- package/node_modules/ink/build/apply-styles.js +175 -0
- package/node_modules/ink/build/build-layout.js +77 -0
- package/node_modules/ink/build/calculate-wrapped-text.js +53 -0
- package/node_modules/ink/build/components/App.d.ts +1 -4
- package/node_modules/ink/build/components/App.js +22 -142
- package/node_modules/ink/build/components/App.js.map +1 -1
- package/node_modules/ink/build/components/AppContext.d.ts +3 -23
- package/node_modules/ink/build/components/AppContext.js +4 -7
- package/node_modules/ink/build/components/AppContext.js.map +1 -1
- package/node_modules/ink/build/components/Box.d.ts +3 -16
- package/node_modules/ink/build/components/Color.js +62 -0
- package/node_modules/ink/build/components/Cursor.d.ts +83 -0
- package/node_modules/ink/build/components/Cursor.js +53 -0
- package/node_modules/ink/build/components/Cursor.js.map +1 -0
- package/node_modules/ink/build/components/ErrorBoundary.d.ts +2 -2
- package/node_modules/ink/build/components/ErrorOverview.js +6 -6
- package/node_modules/ink/build/components/ErrorOverview.js.map +1 -1
- package/node_modules/ink/build/components/Static.js.map +1 -1
- package/node_modules/ink/build/components/StdinContext.d.ts +1 -7
- package/node_modules/ink/build/components/StdinContext.js +0 -1
- package/node_modules/ink/build/components/StdinContext.js.map +1 -1
- package/node_modules/ink/build/components/Text.d.ts +1 -1
- package/node_modules/ink/build/components/Text.js +1 -1
- package/node_modules/ink/build/components/Text.js.map +1 -1
- package/node_modules/ink/build/components/Transform.d.ts +1 -1
- package/node_modules/ink/build/devtools-window-polyfill.js +4 -7
- package/node_modules/ink/build/devtools-window-polyfill.js.map +1 -1
- package/node_modules/ink/build/devtools.js +6 -31
- package/node_modules/ink/build/devtools.js.map +1 -1
- package/node_modules/ink/build/dom.d.ts +1 -5
- package/node_modules/ink/build/dom.js +1 -20
- package/node_modules/ink/build/dom.js.map +1 -1
- package/node_modules/ink/build/experimental/apply-style.js +140 -0
- package/node_modules/ink/build/experimental/dom.js +123 -0
- package/node_modules/ink/build/experimental/output.js +91 -0
- package/node_modules/ink/build/experimental/reconciler.js +141 -0
- package/node_modules/ink/build/experimental/renderer.js +81 -0
- package/node_modules/ink/build/hooks/use-app.d.ts +1 -1
- package/node_modules/ink/build/hooks/use-app.js +1 -1
- package/node_modules/ink/build/hooks/use-cursor.d.ts +1 -1
- package/node_modules/ink/build/hooks/use-cursor.js +1 -1
- package/node_modules/ink/build/hooks/use-focus-manager.d.ts +2 -17
- package/node_modules/ink/build/hooks/use-focus-manager.js +1 -2
- package/node_modules/ink/build/hooks/use-focus-manager.js.map +1 -1
- package/node_modules/ink/build/hooks/use-focus.d.ts +1 -2
- package/node_modules/ink/build/hooks/use-focus.js +4 -5
- package/node_modules/ink/build/hooks/use-focus.js.map +1 -1
- package/node_modules/ink/build/hooks/use-input.d.ts +1 -2
- package/node_modules/ink/build/hooks/use-input.js +80 -82
- package/node_modules/ink/build/hooks/use-input.js.map +1 -1
- package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.d.ts +1 -2
- package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.js +1 -2
- package/node_modules/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -1
- package/node_modules/ink/build/hooks/use-stderr.d.ts +1 -1
- package/node_modules/ink/build/hooks/use-stderr.js +1 -1
- package/node_modules/ink/build/hooks/use-stdin.d.ts +2 -4
- package/node_modules/ink/build/hooks/use-stdin.js +1 -2
- package/node_modules/ink/build/hooks/use-stdin.js.map +1 -1
- package/node_modules/ink/build/hooks/use-stdout.d.ts +1 -1
- package/node_modules/ink/build/hooks/use-stdout.js +1 -1
- package/node_modules/ink/build/hooks/useInput.js +38 -0
- package/node_modules/ink/build/index.d.ts +1 -8
- package/node_modules/ink/build/index.js +0 -4
- package/node_modules/ink/build/index.js.map +1 -1
- package/node_modules/ink/build/ink.d.ts +3 -48
- package/node_modules/ink/build/ink.js +155 -325
- package/node_modules/ink/build/ink.js.map +1 -1
- package/node_modules/ink/build/input-parser.d.ts +1 -4
- package/node_modules/ink/build/input-parser.js +30 -70
- package/node_modules/ink/build/input-parser.js.map +1 -1
- package/node_modules/ink/build/instance.js +205 -0
- package/node_modules/ink/build/layout.d.ts +7 -0
- package/node_modules/ink/build/layout.js +33 -0
- package/node_modules/ink/build/layout.js.map +1 -0
- package/node_modules/ink/build/log-update.d.ts +0 -1
- package/node_modules/ink/build/log-update.js +1 -13
- package/node_modules/ink/build/log-update.js.map +1 -1
- package/node_modules/ink/build/measure-element.d.ts +0 -4
- package/node_modules/ink/build/measure-element.js +0 -4
- package/node_modules/ink/build/measure-element.js.map +1 -1
- package/node_modules/ink/build/options.d.ts +52 -0
- package/node_modules/ink/build/options.js +2 -0
- package/node_modules/ink/build/options.js.map +1 -0
- package/node_modules/ink/build/output.js +0 -25
- package/node_modules/ink/build/output.js.map +1 -1
- package/node_modules/ink/build/parse-keypress.d.ts +3 -1
- package/node_modules/ink/build/parse-keypress.js +17 -19
- package/node_modules/ink/build/parse-keypress.js.map +1 -1
- package/node_modules/ink/build/reconciler.js +27 -46
- package/node_modules/ink/build/reconciler.js.map +1 -1
- package/node_modules/ink/build/render-border.js +18 -29
- package/node_modules/ink/build/render-border.js.map +1 -1
- package/node_modules/ink/build/render-to-string.js +1 -2
- package/node_modules/ink/build/render-to-string.js.map +1 -1
- package/node_modules/ink/build/render.d.ts +2 -57
- package/node_modules/ink/build/render.js +11 -18
- package/node_modules/ink/build/render.js.map +1 -1
- package/node_modules/ink/build/screen-reader-update.d.ts +13 -0
- package/node_modules/ink/build/screen-reader-update.js +38 -0
- package/node_modules/ink/build/screen-reader-update.js.map +1 -0
- package/node_modules/ink/build/styles.d.ts +16 -78
- package/node_modules/ink/build/styles.js +31 -102
- package/node_modules/ink/build/styles.js.map +1 -1
- package/node_modules/ink/build/utils.d.ts +2 -9
- package/node_modules/ink/build/utils.js +3 -18
- package/node_modules/ink/build/utils.js.map +1 -1
- package/node_modules/ink/build/wrap-text.js +0 -7
- package/node_modules/ink/build/wrap-text.js.map +1 -1
- package/node_modules/ink/build/write-synchronized.d.ts +1 -1
- package/node_modules/ink/build/write-synchronized.js +2 -4
- package/node_modules/ink/build/write-synchronized.js.map +1 -1
- package/node_modules/ink/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- package/node_modules/ink/node_modules/emoji-regex/README.md +107 -0
- package/node_modules/ink/node_modules/emoji-regex/index.d.ts +3 -0
- package/node_modules/ink/node_modules/emoji-regex/index.js +4 -0
- package/node_modules/ink/node_modules/emoji-regex/index.mjs +4 -0
- package/node_modules/ink/node_modules/emoji-regex/package.json +45 -0
- package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/index.d.ts +1 -1
- package/node_modules/ink/node_modules/wrap-ansi/index.js +222 -0
- package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/index.d.ts +39 -0
- package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/index.js +82 -0
- package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/license +9 -0
- package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/package.json +64 -0
- package/node_modules/ink/node_modules/wrap-ansi/node_modules/string-width/readme.md +66 -0
- package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/package.json +11 -11
- package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/readme.md +0 -2
- package/node_modules/ink/package.json +98 -34
- package/node_modules/ink/readme.md +48 -554
- package/node_modules/slice-ansi/index.d.ts +1 -1
- package/node_modules/slice-ansi/index.js +89 -146
- package/node_modules/slice-ansi/package.json +5 -5
- package/node_modules/slice-ansi/readme.md +0 -1
- package/node_modules/slice-ansi/tokenize-ansi.js +1 -1
- package/package.json +11 -10
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts +188 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts.map +1 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js +293 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js.map +1 -0
- package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/package.json +25 -0
- package/node_modules/@alcalzone/ansi-tokenize/build/consts.d.ts +0 -17
- package/node_modules/@alcalzone/ansi-tokenize/build/consts.js +0 -28
- package/node_modules/@alcalzone/ansi-tokenize/build/consts.js.map +0 -1
- package/node_modules/ink/build/components/AnimationContext.d.ts +0 -9
- package/node_modules/ink/build/components/AnimationContext.js +0 -13
- package/node_modules/ink/build/components/AnimationContext.js.map +0 -1
- package/node_modules/ink/build/hooks/use-animation.d.ts +0 -49
- package/node_modules/ink/build/hooks/use-animation.js +0 -87
- package/node_modules/ink/build/hooks/use-animation.js.map +0 -1
- package/node_modules/ink/build/hooks/use-box-metrics.d.ts +0 -59
- package/node_modules/ink/build/hooks/use-box-metrics.js +0 -88
- package/node_modules/ink/build/hooks/use-box-metrics.js.map +0 -1
- package/node_modules/ink/build/hooks/use-paste.d.ts +0 -35
- package/node_modules/ink/build/hooks/use-paste.js +0 -62
- package/node_modules/ink/build/hooks/use-paste.js.map +0 -1
- package/node_modules/ink/build/hooks/use-window-size.d.ts +0 -18
- package/node_modules/ink/build/hooks/use-window-size.js +0 -22
- package/node_modules/ink/build/hooks/use-window-size.js.map +0 -1
- package/node_modules/wrap-ansi/index.js +0 -468
- /package/node_modules/{wrap-ansi → ink/node_modules/wrap-ansi}/license +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React, { createElement, useEffect, useMemo, useRef, useState } from "react";
|
|
2
|
-
import { Box, Text, useApp,
|
|
2
|
+
import { Box, Text, useApp, useCursor, useInput, useStdout } from "ink";
|
|
3
3
|
import { bold, cyan, dim, green, red, yellow } from "../terminal/colors.mjs";
|
|
4
4
|
import { RunTreeView } from "../components/blocks/run-tree.mjs";
|
|
5
|
+
import { useElementLayout } from "../components/hooks/use-element-layout.mjs";
|
|
5
6
|
import { colorCodeLine } from "./code-block.mjs";
|
|
6
7
|
import { getComposerDisplayModel } from "./composer.mjs";
|
|
7
8
|
import { MarkdownBlock } from "./markdown-block.mjs";
|
|
@@ -370,7 +371,8 @@ function colorCommandStatus(block, status) {
|
|
|
370
371
|
|
|
371
372
|
function ComposerBar({ view, busy }) {
|
|
372
373
|
const ref = useRef(null);
|
|
373
|
-
const
|
|
374
|
+
const { stdout } = useStdout();
|
|
375
|
+
const metrics = useElementLayout(ref, { stdout });
|
|
374
376
|
const { setCursorPosition } = useCursor();
|
|
375
377
|
const display = getComposerDisplayModel(
|
|
376
378
|
{
|
|
@@ -81,7 +81,11 @@ export async function runAssistantConversationTurn({
|
|
|
81
81
|
onEvent(event) {
|
|
82
82
|
appendProviderTrace(tracePath, event);
|
|
83
83
|
onProviderEvent?.(event);
|
|
84
|
-
if (
|
|
84
|
+
if (
|
|
85
|
+
event.display !== false &&
|
|
86
|
+
!event.transient &&
|
|
87
|
+
(event.type === "status" || event.type === "tool-start" || event.type === "tool-update" || event.type === "tool-end")
|
|
88
|
+
) {
|
|
85
89
|
onStatus?.(formatProviderEvent(event));
|
|
86
90
|
}
|
|
87
91
|
},
|
|
@@ -757,14 +757,13 @@ function createProviderTurnState() {
|
|
|
757
757
|
assistantMessageId: null,
|
|
758
758
|
assistantMessageIdsByProviderItem: new Map(),
|
|
759
759
|
providerToolMessageIdsByProviderItem: new Map(),
|
|
760
|
-
|
|
760
|
+
lastActivityText: null,
|
|
761
761
|
};
|
|
762
762
|
}
|
|
763
763
|
|
|
764
764
|
function handleProviderEvent(turn, event, { appendMessage, updateMessage, setStatus } = {}) {
|
|
765
765
|
if (!event) return;
|
|
766
766
|
if (event.transient || event.display === false) {
|
|
767
|
-
if (event.type === "status" && event.text) setStatus?.(event.text);
|
|
768
767
|
return;
|
|
769
768
|
}
|
|
770
769
|
if (event.type === "assistant-delta") {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { createElement, useEffect, useMemo, useState } from "react";
|
|
2
|
-
import { Box, Text,
|
|
2
|
+
import { Box, Text, useApp, useInput } from "ink";
|
|
3
3
|
import figures from "figures";
|
|
4
4
|
import { formatDuration } from "../../../runner/formatting.mjs";
|
|
5
5
|
import {
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { renderSummaryBox } from "../primitives/summary-box.mjs";
|
|
15
15
|
import { getTerminalWidth } from "../../terminal/layout.mjs";
|
|
16
16
|
import { renderFailureDetail, renderPassedDetail } from "../../renderers/run/inline-detail.mjs";
|
|
17
|
+
import { useSpinnerFrame } from "../hooks/use-spinner-frame.mjs";
|
|
17
18
|
|
|
18
19
|
const SPINNER_FRAMES = ["|", "/", "-", "\\"];
|
|
19
20
|
|
|
@@ -27,7 +28,11 @@ export function RunTreeView({
|
|
|
27
28
|
const { exit } = useApp();
|
|
28
29
|
const controlledSnapshot = Boolean(snapshotOverride);
|
|
29
30
|
const [snapshot, setSnapshot] = useState(() => snapshotOverride || runState.getSnapshot());
|
|
30
|
-
const
|
|
31
|
+
const frame = useSpinnerFrame({
|
|
32
|
+
frameCount: SPINNER_FRAMES.length,
|
|
33
|
+
intervalMs: 80,
|
|
34
|
+
isActive: !controlledSnapshot && !snapshot.finished,
|
|
35
|
+
});
|
|
31
36
|
const spinnerFrame = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];
|
|
32
37
|
|
|
33
38
|
useEffect(() => {
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
|
+
|
|
3
|
+
const EMPTY_LAYOUT = Object.freeze({
|
|
4
|
+
width: 0,
|
|
5
|
+
height: 0,
|
|
6
|
+
left: 0,
|
|
7
|
+
top: 0,
|
|
8
|
+
hasMeasured: false,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export function readElementLayout(ref) {
|
|
12
|
+
const node = ref?.current || null;
|
|
13
|
+
const rawLayout = node?.yogaNode?.getComputedLayout?.() || null;
|
|
14
|
+
if (!node || !rawLayout) return EMPTY_LAYOUT;
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
width: normalizeLayoutNumber(rawLayout.width),
|
|
18
|
+
height: normalizeLayoutNumber(rawLayout.height),
|
|
19
|
+
left: normalizeLayoutNumber(rawLayout.left),
|
|
20
|
+
top: normalizeLayoutNumber(rawLayout.top),
|
|
21
|
+
hasMeasured: true,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function layoutsEqual(left, right) {
|
|
26
|
+
return (
|
|
27
|
+
left.width === right.width &&
|
|
28
|
+
left.height === right.height &&
|
|
29
|
+
left.left === right.left &&
|
|
30
|
+
left.top === right.top &&
|
|
31
|
+
left.hasMeasured === right.hasMeasured
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function useElementLayout(ref, { stdout } = {}) {
|
|
36
|
+
const [layout, setLayout] = useState(EMPTY_LAYOUT);
|
|
37
|
+
|
|
38
|
+
const updateLayout = useCallback(() => {
|
|
39
|
+
const nextLayout = readElementLayout(ref);
|
|
40
|
+
setLayout((currentLayout) => layoutsEqual(currentLayout, nextLayout) ? currentLayout : nextLayout);
|
|
41
|
+
}, [ref]);
|
|
42
|
+
|
|
43
|
+
useEffect(updateLayout);
|
|
44
|
+
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!stdout?.on) return undefined;
|
|
47
|
+
|
|
48
|
+
stdout.on("resize", updateLayout);
|
|
49
|
+
return () => {
|
|
50
|
+
if (stdout.off) {
|
|
51
|
+
stdout.off("resize", updateLayout);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
stdout.removeListener?.("resize", updateLayout);
|
|
55
|
+
};
|
|
56
|
+
}, [stdout, updateLayout]);
|
|
57
|
+
|
|
58
|
+
return useMemo(() => layout, [layout]);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function normalizeLayoutNumber(value) {
|
|
62
|
+
return Number.isFinite(value) ? value : 0;
|
|
63
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
|
|
3
|
+
export function nextSpinnerFrame(frame, frameCount) {
|
|
4
|
+
const normalizedFrameCount = Number.isInteger(frameCount) && frameCount > 0 ? frameCount : 1;
|
|
5
|
+
return (frame + 1) % normalizedFrameCount;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function useSpinnerFrame({
|
|
9
|
+
frameCount,
|
|
10
|
+
intervalMs = 80,
|
|
11
|
+
isActive = true,
|
|
12
|
+
} = {}) {
|
|
13
|
+
const [frame, setFrame] = useState(0);
|
|
14
|
+
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (!isActive) return undefined;
|
|
17
|
+
|
|
18
|
+
const timer = setInterval(() => {
|
|
19
|
+
setFrame((currentFrame) => nextSpinnerFrame(currentFrame, frameCount));
|
|
20
|
+
}, intervalMs);
|
|
21
|
+
|
|
22
|
+
return () => clearInterval(timer);
|
|
23
|
+
}, [frameCount, intervalMs, isActive]);
|
|
24
|
+
|
|
25
|
+
return frame;
|
|
26
|
+
}
|
|
@@ -231,11 +231,6 @@ This automatically figures out the least amount of escape codes necessary to ach
|
|
|
231
231
|
Placeholder for next release:
|
|
232
232
|
### __WORK IN PROGRESS__
|
|
233
233
|
-->
|
|
234
|
-
### 0.3.0 (2026-02-20)
|
|
235
|
-
|
|
236
|
-
- Fix: preserve non-hyperlink OSC sequences when tokenizing (#54)
|
|
237
|
-
- Fix: support ST-terminated OSC hyperlinks (#53)
|
|
238
|
-
|
|
239
234
|
### 0.2.5 (2026-02-11)
|
|
240
235
|
|
|
241
236
|
- Fix: preserve grapheme clusters when tokenizing (#51)
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { AnsiCode } from "./tokenize.js";
|
|
2
|
+
export declare const ESCAPES: Set<number>;
|
|
3
|
+
export declare const CSI: number;
|
|
4
|
+
export declare const OSC: number;
|
|
2
5
|
export declare const endCodesSet: Set<string>;
|
|
6
|
+
export declare const linkCodePrefix = "\u001B]8;";
|
|
7
|
+
export declare const linkCodePrefixCharCodes: number[];
|
|
8
|
+
export declare const linkCodeSuffix = "\u0007";
|
|
9
|
+
export declare const linkCodeSuffixCharCode: number;
|
|
10
|
+
export declare const linkEndCode: string;
|
|
3
11
|
export declare function getLinkStartCode(url: string, params?: Record<string, string>): string;
|
|
4
12
|
export declare function getEndCode(code: string): string;
|
|
5
13
|
export declare function ansiCodesToString(codes: AnsiCode[]): string;
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
import ansiStyles from "ansi-styles";
|
|
2
|
-
|
|
2
|
+
export const ESCAPES = new Set([27, 155]); // \x1b and \x9b
|
|
3
|
+
export const CSI = "[".codePointAt(0);
|
|
4
|
+
export const OSC = "]".codePointAt(0);
|
|
3
5
|
export const endCodesSet = new Set();
|
|
4
6
|
const endCodesMap = new Map();
|
|
5
7
|
for (const [start, end] of ansiStyles.codes) {
|
|
6
8
|
endCodesSet.add(ansiStyles.color.ansi(end));
|
|
7
9
|
endCodesMap.set(ansiStyles.color.ansi(start), ansiStyles.color.ansi(end));
|
|
8
10
|
}
|
|
11
|
+
export const linkCodePrefix = "\x1B]8;"; // OSC 8 link prefix (params and URL follow)
|
|
12
|
+
export const linkCodePrefixCharCodes = linkCodePrefix.split("").map((char) => char.charCodeAt(0));
|
|
13
|
+
export const linkCodeSuffix = "\x07";
|
|
14
|
+
export const linkCodeSuffixCharCode = linkCodeSuffix.charCodeAt(0);
|
|
15
|
+
export const linkEndCode = `\x1B]8;;${linkCodeSuffix}`;
|
|
9
16
|
export function getLinkStartCode(url, params) {
|
|
10
17
|
const paramsStr = params
|
|
11
18
|
? Object.entries(params)
|
|
@@ -21,13 +28,8 @@ export function getEndCode(code) {
|
|
|
21
28
|
return endCodesMap.get(code);
|
|
22
29
|
// We have a few special cases to handle here:
|
|
23
30
|
// Links:
|
|
24
|
-
if (code.startsWith(linkCodePrefix))
|
|
25
|
-
|
|
26
|
-
return linkEndCodeST;
|
|
27
|
-
if (code.endsWith("\x9C"))
|
|
28
|
-
return linkEndCodeC1ST;
|
|
29
|
-
return linkEndCode; // BEL (\x07)
|
|
30
|
-
}
|
|
31
|
+
if (code.startsWith(linkCodePrefix))
|
|
32
|
+
return linkEndCode;
|
|
31
33
|
code = code.slice(2);
|
|
32
34
|
// 8-bit/24-bit colors:
|
|
33
35
|
if (code.startsWith("38")) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ansiCodes.js","sourceRoot":"","sources":["../src/ansiCodes.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ansiCodes.js","sourceRoot":"","sources":["../src/ansiCodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,14 +3,10 @@ export interface AnsiCode {
|
|
|
3
3
|
code: string;
|
|
4
4
|
endCode: string;
|
|
5
5
|
}
|
|
6
|
-
export interface ControlCode {
|
|
7
|
-
type: "control";
|
|
8
|
-
code: string;
|
|
9
|
-
}
|
|
10
6
|
export interface Char {
|
|
11
7
|
type: "char";
|
|
12
8
|
value: string;
|
|
13
9
|
fullWidth: boolean;
|
|
14
10
|
}
|
|
15
|
-
export type Token = AnsiCode |
|
|
11
|
+
export type Token = AnsiCode | Char;
|
|
16
12
|
export declare function tokenize(str: string, endChar?: number): Token[];
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import isFullwidthCodePoint from "is-fullwidth-code-point";
|
|
2
|
-
import { getEndCode } from "./ansiCodes.js";
|
|
3
|
-
import { CC_0, CC_9, CC_BEL, CC_BACKSLASH, CC_C1_ST, CC_ESC, CC_M, CC_CSI, CC_OSC, CC_SEMI, ESCAPES, linkCodePrefix, linkCodePrefixCharCodes, } from "./consts.js";
|
|
2
|
+
import { CSI, ESCAPES, getEndCode, linkCodePrefix, linkCodePrefixCharCodes, OSC, } from "./ansiCodes.js";
|
|
4
3
|
const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
5
4
|
function isFullwidthGrapheme(grapheme, baseCodePoint) {
|
|
6
5
|
if (isFullwidthCodePoint(baseCodePoint))
|
|
@@ -26,38 +25,15 @@ function parseLinkCode(string, offset) {
|
|
|
26
25
|
if (paramsEndIndex === -1)
|
|
27
26
|
return undefined;
|
|
28
27
|
// This is a link code (with or without the URL part). Find the end of it.
|
|
29
|
-
const endIndex =
|
|
30
|
-
if (endIndex === -1)
|
|
31
|
-
return undefined;
|
|
32
|
-
return string.slice(0, endIndex + 1);
|
|
33
|
-
}
|
|
34
|
-
// HOT PATH: Generic fallback for non-link OSC sequences (window title, notifications, etc.)
|
|
35
|
-
function parseOSCSequence(string, offset) {
|
|
36
|
-
string = string.slice(offset);
|
|
37
|
-
// Find the OSC terminator (starting after "ESC ]")
|
|
38
|
-
const endIndex = findOSCTerminatorIndex(string, 2);
|
|
28
|
+
const endIndex = string.indexOf("\x07", paramsEndIndex + 1);
|
|
39
29
|
if (endIndex === -1)
|
|
40
30
|
return undefined;
|
|
41
31
|
return string.slice(0, endIndex + 1);
|
|
42
32
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
*/
|
|
48
|
-
function findOSCTerminatorIndex(string, startIndex) {
|
|
49
|
-
for (let i = startIndex; i < string.length; i++) {
|
|
50
|
-
const ch = string.charCodeAt(i);
|
|
51
|
-
if (ch === CC_BEL)
|
|
52
|
-
return i;
|
|
53
|
-
if (ch === CC_C1_ST)
|
|
54
|
-
return i;
|
|
55
|
-
if (ch === CC_ESC && i + 1 < string.length && string.charCodeAt(i + 1) === CC_BACKSLASH) {
|
|
56
|
-
return i + 1;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return -1;
|
|
60
|
-
}
|
|
33
|
+
const CC_0 = "0".charCodeAt(0);
|
|
34
|
+
const CC_9 = "9".charCodeAt(0);
|
|
35
|
+
const CC_SEMI = ";".charCodeAt(0);
|
|
36
|
+
const CC_M = "m".charCodeAt(0);
|
|
61
37
|
/**
|
|
62
38
|
* Scans through the given string and finds the index of the last character of an SGR sequence
|
|
63
39
|
* like `\x1B[38;2;123;123;123m`. This assumes that the string has been checked to start with `\x1B[`.
|
|
@@ -135,30 +111,18 @@ export function tokenize(str, endChar = Number.POSITIVE_INFINITY) {
|
|
|
135
111
|
let code;
|
|
136
112
|
// Peek the next code point to determine the type of ANSI sequence
|
|
137
113
|
const nextCodePoint = str.codePointAt(index + 1);
|
|
138
|
-
if (nextCodePoint ===
|
|
139
|
-
// ] = operating system commands
|
|
114
|
+
if (nextCodePoint === OSC) {
|
|
115
|
+
// ] = operating system commands, like links
|
|
140
116
|
code = parseLinkCode(str, index);
|
|
141
117
|
if (code) {
|
|
142
|
-
// OSC 8 hyperlinks are paired codes with an endCode
|
|
143
118
|
ret.push({
|
|
144
119
|
type: "ansi",
|
|
145
120
|
code: code,
|
|
146
121
|
endCode: getEndCode(code),
|
|
147
122
|
});
|
|
148
123
|
}
|
|
149
|
-
else {
|
|
150
|
-
// Other OSC sequences (window title, etc.) are self-contained
|
|
151
|
-
// control codes with no endCode.
|
|
152
|
-
code = parseOSCSequence(str, index);
|
|
153
|
-
if (code) {
|
|
154
|
-
ret.push({
|
|
155
|
-
type: "control",
|
|
156
|
-
code: code,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
124
|
}
|
|
161
|
-
else if (nextCodePoint ===
|
|
125
|
+
else if (nextCodePoint === CSI) {
|
|
162
126
|
// [ = control sequence introducer, like SGR sequences [...m
|
|
163
127
|
code = parseSGRSequence(str, index);
|
|
164
128
|
if (code) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elench/testkit-bridge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.115",
|
|
4
4
|
"description": "Browser bridge helpers for testkit",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@elench/testkit-protocol": "0.1.
|
|
25
|
+
"@elench/testkit-protocol": "0.1.115"
|
|
26
26
|
},
|
|
27
27
|
"private": false
|
|
28
28
|
}
|
|
@@ -1,108 +1,110 @@
|
|
|
1
|
-
|
|
2
|
-
Style of the box border.
|
|
3
|
-
*/
|
|
4
|
-
export type BoxStyle = {
|
|
5
|
-
readonly topLeft: string;
|
|
6
|
-
readonly top: string;
|
|
7
|
-
readonly topRight: string;
|
|
8
|
-
readonly right: string;
|
|
9
|
-
readonly bottomRight: string;
|
|
10
|
-
readonly bottom: string;
|
|
11
|
-
readonly bottomLeft: string;
|
|
12
|
-
readonly left: string;
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
All box styles.
|
|
17
|
-
*/
|
|
18
|
-
export type Boxes = {
|
|
1
|
+
declare namespace cliBoxes {
|
|
19
2
|
/**
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
┌────┐
|
|
23
|
-
│ │
|
|
24
|
-
└────┘
|
|
25
|
-
```
|
|
3
|
+
Style of the box border.
|
|
26
4
|
*/
|
|
27
|
-
|
|
5
|
+
interface BoxStyle {
|
|
6
|
+
readonly topLeft: string;
|
|
7
|
+
readonly top: string;
|
|
8
|
+
readonly topRight: string;
|
|
9
|
+
readonly right: string;
|
|
10
|
+
readonly bottomRight: string;
|
|
11
|
+
readonly bottom: string;
|
|
12
|
+
readonly bottomLeft: string;
|
|
13
|
+
readonly left: string;
|
|
14
|
+
}
|
|
28
15
|
|
|
29
16
|
/**
|
|
30
|
-
|
|
31
|
-
```
|
|
32
|
-
╔════╗
|
|
33
|
-
║ ║
|
|
34
|
-
╚════╝
|
|
35
|
-
```
|
|
17
|
+
All box styles.
|
|
36
18
|
*/
|
|
37
|
-
|
|
19
|
+
interface Boxes {
|
|
20
|
+
/**
|
|
21
|
+
@example
|
|
22
|
+
```
|
|
23
|
+
┌────┐
|
|
24
|
+
│ │
|
|
25
|
+
└────┘
|
|
26
|
+
```
|
|
27
|
+
*/
|
|
28
|
+
readonly single: BoxStyle;
|
|
38
29
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
30
|
+
/**
|
|
31
|
+
@example
|
|
32
|
+
```
|
|
33
|
+
╔════╗
|
|
34
|
+
║ ║
|
|
35
|
+
╚════╝
|
|
36
|
+
```
|
|
37
|
+
*/
|
|
38
|
+
readonly double: BoxStyle;
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
40
|
+
/**
|
|
41
|
+
@example
|
|
42
|
+
```
|
|
43
|
+
╭────╮
|
|
44
|
+
│ │
|
|
45
|
+
╰────╯
|
|
46
|
+
```
|
|
47
|
+
*/
|
|
48
|
+
readonly round: BoxStyle;
|
|
58
49
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
50
|
+
/**
|
|
51
|
+
@example
|
|
52
|
+
```
|
|
53
|
+
┏━━━━┓
|
|
54
|
+
┃ ┃
|
|
55
|
+
┗━━━━┛
|
|
56
|
+
```
|
|
57
|
+
*/
|
|
58
|
+
readonly bold: BoxStyle;
|
|
68
59
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
60
|
+
/**
|
|
61
|
+
@example
|
|
62
|
+
```
|
|
63
|
+
╓────╖
|
|
64
|
+
║ ║
|
|
65
|
+
╙────╜
|
|
66
|
+
```
|
|
67
|
+
*/
|
|
68
|
+
readonly singleDouble: BoxStyle;
|
|
78
69
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
70
|
+
/**
|
|
71
|
+
@example
|
|
72
|
+
```
|
|
73
|
+
╒════╕
|
|
74
|
+
│ │
|
|
75
|
+
╘════╛
|
|
76
|
+
```
|
|
77
|
+
*/
|
|
78
|
+
readonly doubleSingle: BoxStyle;
|
|
88
79
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
80
|
+
/**
|
|
81
|
+
@example
|
|
82
|
+
```
|
|
83
|
+
+----+
|
|
84
|
+
| |
|
|
85
|
+
+----+
|
|
86
|
+
```
|
|
87
|
+
*/
|
|
88
|
+
readonly classic: BoxStyle;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
@example
|
|
92
|
+
```
|
|
93
|
+
↘↓↓↓↓↙
|
|
94
|
+
→ ←
|
|
95
|
+
↗↑↑↑↑↖
|
|
96
|
+
```
|
|
97
|
+
*/
|
|
98
|
+
readonly arrow: BoxStyle;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
99
101
|
|
|
100
102
|
/**
|
|
101
103
|
Boxes for use in the terminal.
|
|
102
104
|
|
|
103
105
|
@example
|
|
104
106
|
```
|
|
105
|
-
import cliBoxes
|
|
107
|
+
import cliBoxes = require('cli-boxes');
|
|
106
108
|
|
|
107
109
|
console.log(cliBoxes.single);
|
|
108
110
|
// {
|
|
@@ -117,6 +119,9 @@ console.log(cliBoxes.single);
|
|
|
117
119
|
// }
|
|
118
120
|
```
|
|
119
121
|
*/
|
|
120
|
-
declare const cliBoxes: Boxes
|
|
122
|
+
declare const cliBoxes: cliBoxes.Boxes & {
|
|
123
|
+
// TODO: Remove this for the next major release
|
|
124
|
+
default: typeof cliBoxes;
|
|
125
|
+
};
|
|
121
126
|
|
|
122
|
-
export
|
|
127
|
+
export = cliBoxes;
|