@flyingrobots/bijou 1.6.0 → 1.8.0
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/dist/adapters/test/index.d.ts +2 -0
- package/dist/adapters/test/index.d.ts.map +1 -1
- package/dist/adapters/test/index.js +2 -0
- package/dist/adapters/test/index.js.map +1 -1
- package/dist/core/ansi.d.ts +15 -0
- package/dist/core/ansi.d.ts.map +1 -0
- package/dist/core/ansi.js +15 -0
- package/dist/core/ansi.js.map +1 -0
- package/dist/core/components/box.d.ts +6 -0
- package/dist/core/components/box.d.ts.map +1 -1
- package/dist/core/components/box.js +20 -5
- package/dist/core/components/box.js.map +1 -1
- package/dist/core/components/constrain.d.ts +28 -0
- package/dist/core/components/constrain.d.ts.map +1 -0
- package/dist/core/components/constrain.js +66 -0
- package/dist/core/components/constrain.js.map +1 -0
- package/dist/core/components/cursor-guard.d.ts +46 -0
- package/dist/core/components/cursor-guard.d.ts.map +1 -0
- package/dist/core/components/cursor-guard.js +88 -0
- package/dist/core/components/cursor-guard.js.map +1 -0
- package/dist/core/components/dag-render.js +2 -2
- package/dist/core/components/dag-render.js.map +1 -1
- package/dist/core/components/index.d.ts +6 -0
- package/dist/core/components/index.d.ts.map +1 -1
- package/dist/core/components/index.js +3 -0
- package/dist/core/components/index.js.map +1 -1
- package/dist/core/components/progress.d.ts.map +1 -1
- package/dist/core/components/progress.js +20 -8
- package/dist/core/components/progress.js.map +1 -1
- package/dist/core/components/spinner.d.ts.map +1 -1
- package/dist/core/components/spinner.js +11 -4
- package/dist/core/components/spinner.js.map +1 -1
- package/dist/core/components/table.d.ts.map +1 -1
- package/dist/core/components/table.js +1 -10
- package/dist/core/components/table.js.map +1 -1
- package/dist/core/components/timer.d.ts +74 -0
- package/dist/core/components/timer.d.ts.map +1 -0
- package/dist/core/components/timer.js +219 -0
- package/dist/core/components/timer.js.map +1 -0
- package/dist/core/detect/tty.d.ts +10 -0
- package/dist/core/detect/tty.d.ts.map +1 -1
- package/dist/core/detect/tty.js +14 -12
- package/dist/core/detect/tty.js.map +1 -1
- package/dist/core/forms/form-utils.d.ts +22 -0
- package/dist/core/forms/form-utils.d.ts.map +1 -1
- package/dist/core/forms/form-utils.js +50 -3
- package/dist/core/forms/form-utils.js.map +1 -1
- package/dist/core/forms/index.d.ts +2 -0
- package/dist/core/forms/index.d.ts.map +1 -1
- package/dist/core/forms/index.js +1 -0
- package/dist/core/forms/index.js.map +1 -1
- package/dist/core/forms/multiselect.d.ts +2 -0
- package/dist/core/forms/multiselect.d.ts.map +1 -1
- package/dist/core/forms/multiselect.js +12 -18
- package/dist/core/forms/multiselect.js.map +1 -1
- package/dist/core/forms/note.d.ts +27 -0
- package/dist/core/forms/note.d.ts.map +1 -0
- package/dist/core/forms/note.js +55 -0
- package/dist/core/forms/note.js.map +1 -0
- package/dist/core/forms/select.js +5 -20
- package/dist/core/forms/select.js.map +1 -1
- package/dist/core/forms/wizard.d.ts +11 -0
- package/dist/core/forms/wizard.d.ts.map +1 -1
- package/dist/core/forms/wizard.js +30 -2
- package/dist/core/forms/wizard.js.map +1 -1
- package/dist/core/text/clip.d.ts.map +1 -1
- package/dist/core/text/clip.js +2 -8
- package/dist/core/text/clip.js.map +1 -1
- package/dist/core/text/grapheme.d.ts +14 -0
- package/dist/core/text/grapheme.d.ts.map +1 -1
- package/dist/core/text/grapheme.js +21 -1
- package/dist/core/text/grapheme.js.map +1 -1
- package/dist/core/text/index.d.ts +1 -1
- package/dist/core/text/index.d.ts.map +1 -1
- package/dist/core/text/index.js +1 -1
- package/dist/core/text/index.js.map +1 -1
- package/dist/core/theme/resolve.d.ts +16 -0
- package/dist/core/theme/resolve.d.ts.map +1 -1
- package/dist/core/theme/resolve.js +21 -7
- package/dist/core/theme/resolve.js.map +1 -1
- package/dist/core/theme/styled.d.ts +9 -0
- package/dist/core/theme/styled.d.ts.map +1 -1
- package/dist/core/theme/styled.js +9 -0
- package/dist/core/theme/styled.js.map +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/ports/env.d.ts +31 -0
- package/dist/ports/env.d.ts.map +1 -0
- package/dist/ports/env.js +36 -0
- package/dist/ports/env.js.map +1 -0
- package/dist/ports/index.d.ts +1 -0
- package/dist/ports/index.d.ts.map +1 -1
- package/dist/ports/index.js +1 -1
- package/dist/ports/index.js.map +1 -1
- package/dist/ports/io.d.ts +1 -1
- package/dist/ports/io.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { lerp3 } from '../theme/gradient.js';
|
|
2
2
|
import { resolveCtx } from '../resolve-ctx.js';
|
|
3
3
|
import { renderByMode } from '../mode-render.js';
|
|
4
|
+
import { cursorGuard } from './cursor-guard.js';
|
|
5
|
+
import { CLEAR_LINE_RETURN } from '../ansi.js';
|
|
4
6
|
/**
|
|
5
7
|
* Render a progress bar string for the given percentage.
|
|
6
8
|
*
|
|
@@ -60,13 +62,15 @@ export function progressBar(percent, options = {}) {
|
|
|
60
62
|
export function createProgressBar(options = {}) {
|
|
61
63
|
const ctx = resolveCtx(options.ctx);
|
|
62
64
|
const mode = ctx.mode;
|
|
65
|
+
let cursorHandle = null;
|
|
63
66
|
return {
|
|
64
67
|
start() {
|
|
65
68
|
if (mode !== 'interactive') {
|
|
66
69
|
ctx.io.write(progressBar(0, { ...options, ctx }) + '\n');
|
|
67
70
|
return;
|
|
68
71
|
}
|
|
69
|
-
|
|
72
|
+
cursorHandle?.dispose();
|
|
73
|
+
cursorHandle = cursorGuard(ctx.io).hide();
|
|
70
74
|
ctx.io.write(progressBar(0, { ...options, ctx }));
|
|
71
75
|
},
|
|
72
76
|
update(pct) {
|
|
@@ -74,7 +78,7 @@ export function createProgressBar(options = {}) {
|
|
|
74
78
|
ctx.io.write(progressBar(pct, { ...options, ctx }) + '\n');
|
|
75
79
|
return;
|
|
76
80
|
}
|
|
77
|
-
ctx.io.write(
|
|
81
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${progressBar(pct, { ...options, ctx })}`);
|
|
78
82
|
},
|
|
79
83
|
stop(finalMessage) {
|
|
80
84
|
if (mode !== 'interactive') {
|
|
@@ -83,8 +87,11 @@ export function createProgressBar(options = {}) {
|
|
|
83
87
|
}
|
|
84
88
|
return;
|
|
85
89
|
}
|
|
86
|
-
ctx.io.write(
|
|
87
|
-
|
|
90
|
+
ctx.io.write(CLEAR_LINE_RETURN);
|
|
91
|
+
if (cursorHandle !== null) {
|
|
92
|
+
cursorHandle.dispose();
|
|
93
|
+
cursorHandle = null;
|
|
94
|
+
}
|
|
88
95
|
if (finalMessage !== undefined) {
|
|
89
96
|
ctx.io.write(finalMessage + '\n');
|
|
90
97
|
}
|
|
@@ -109,11 +116,12 @@ export function createAnimatedProgressBar(options = {}) {
|
|
|
109
116
|
let currentPct = 0;
|
|
110
117
|
let targetPct = 0;
|
|
111
118
|
let timer = null;
|
|
119
|
+
let cursorHandle = null;
|
|
112
120
|
const frameMs = Math.round(1000 / fps);
|
|
113
121
|
const stepPerFrame = 100 / (duration / frameMs); // max pct change per frame
|
|
114
122
|
/** Write the current percentage bar to the terminal, overwriting the current line. */
|
|
115
123
|
function render() {
|
|
116
|
-
ctx.io.write(
|
|
124
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${progressBar(currentPct, { ...options, ctx })}`);
|
|
117
125
|
}
|
|
118
126
|
/** Start the interpolation timer if it is not already running. */
|
|
119
127
|
function startAnimation() {
|
|
@@ -140,7 +148,8 @@ export function createAnimatedProgressBar(options = {}) {
|
|
|
140
148
|
ctx.io.write(progressBar(0, { ...options, ctx }) + '\n');
|
|
141
149
|
return;
|
|
142
150
|
}
|
|
143
|
-
|
|
151
|
+
cursorHandle?.dispose();
|
|
152
|
+
cursorHandle = cursorGuard(ctx.io).hide();
|
|
144
153
|
render();
|
|
145
154
|
},
|
|
146
155
|
update(pct) {
|
|
@@ -165,8 +174,11 @@ export function createAnimatedProgressBar(options = {}) {
|
|
|
165
174
|
return;
|
|
166
175
|
}
|
|
167
176
|
render();
|
|
168
|
-
ctx.io.write(
|
|
169
|
-
|
|
177
|
+
ctx.io.write(CLEAR_LINE_RETURN);
|
|
178
|
+
if (cursorHandle !== null) {
|
|
179
|
+
cursorHandle.dispose();
|
|
180
|
+
cursorHandle = null;
|
|
181
|
+
}
|
|
170
182
|
if (finalMessage !== undefined) {
|
|
171
183
|
ctx.io.write(finalMessage + '\n');
|
|
172
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/core/components/progress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../../../src/core/components/progress.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/core/components/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../src/core/components/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAQ3D,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAc/E;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,2FAA2F;IAC3F,KAAK,IAAI,IAAI,CAAC;IACd;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;OAGG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB,GAAG,iBAAiB,CAmD7E"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
2
|
import { renderByMode } from '../mode-render.js';
|
|
3
|
+
import { cursorGuard } from './cursor-guard.js';
|
|
4
|
+
import { CLEAR_LINE_RETURN } from '../ansi.js';
|
|
3
5
|
/** Default braille dot spinner frames. */
|
|
4
6
|
const DOTS = ['\u280b', '\u2819', '\u2839', '\u2838', '\u283c', '\u2834', '\u2826', '\u2827', '\u2807', '\u280f'];
|
|
5
7
|
/**
|
|
@@ -45,12 +47,13 @@ export function createSpinner(options = {}) {
|
|
|
45
47
|
const interval = options.interval ?? 80;
|
|
46
48
|
let label = options.label ?? 'Loading';
|
|
47
49
|
let timer = null;
|
|
50
|
+
let cursorHandle = null;
|
|
48
51
|
let tick = 0;
|
|
49
52
|
const mode = ctx.mode;
|
|
50
53
|
/** Write the current frame to the terminal, overwriting the previous line. */
|
|
51
54
|
function render() {
|
|
52
55
|
const line = spinnerFrame(tick, { frames, label, ctx });
|
|
53
|
-
ctx.io.write(
|
|
56
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${line}`);
|
|
54
57
|
tick++;
|
|
55
58
|
}
|
|
56
59
|
return {
|
|
@@ -59,7 +62,8 @@ export function createSpinner(options = {}) {
|
|
|
59
62
|
ctx.io.write(spinnerFrame(0, { frames, label, ctx }) + '\n');
|
|
60
63
|
return;
|
|
61
64
|
}
|
|
62
|
-
|
|
65
|
+
cursorHandle?.dispose();
|
|
66
|
+
cursorHandle = cursorGuard(ctx.io).hide();
|
|
63
67
|
render();
|
|
64
68
|
timer = ctx.io.setInterval(render, interval);
|
|
65
69
|
},
|
|
@@ -72,8 +76,11 @@ export function createSpinner(options = {}) {
|
|
|
72
76
|
timer = null;
|
|
73
77
|
}
|
|
74
78
|
if (mode === 'interactive') {
|
|
75
|
-
ctx.io.write(
|
|
76
|
-
|
|
79
|
+
ctx.io.write(CLEAR_LINE_RETURN);
|
|
80
|
+
if (cursorHandle !== null) {
|
|
81
|
+
cursorHandle.dispose();
|
|
82
|
+
cursorHandle = null;
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
85
|
if (finalMessage !== undefined) {
|
|
79
86
|
ctx.io.write(finalMessage + '\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/core/components/spinner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../../src/core/components/spinner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/core/components/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/core/components/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMrD,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,sEAAsE;IACtE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,gDAAgD;IAChD,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,0DAA0D;IAC1D,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAwBD;;;;;;;;;;GAUG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA+DnD"}
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
2
|
import { renderByMode } from '../mode-render.js';
|
|
3
3
|
import { makeBgFill } from '../bg-fill.js';
|
|
4
|
-
|
|
5
|
-
* Strip ANSI escape sequences from a string.
|
|
6
|
-
*
|
|
7
|
-
* @param str - Input string potentially containing ANSI codes.
|
|
8
|
-
* @returns The string with all ANSI SGR sequences removed.
|
|
9
|
-
*/
|
|
10
|
-
function stripAnsi(str) {
|
|
11
|
-
// eslint-disable-next-line no-control-regex
|
|
12
|
-
return str.replace(/\x1b\[[0-9;]*m/g, '');
|
|
13
|
-
}
|
|
4
|
+
import { stripAnsi } from '../text/grapheme.js';
|
|
14
5
|
/**
|
|
15
6
|
* Calculate the visible (non-ANSI) character length of a string.
|
|
16
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/core/components/table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/core/components/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { BijouContext } from '../../ports/context.js';
|
|
2
|
+
/** Configuration for timer rendering. */
|
|
3
|
+
export interface TimerOptions {
|
|
4
|
+
/** Show hours segment even when 0 (e.g. `00:02:30`). Default: false. */
|
|
5
|
+
showHours?: boolean;
|
|
6
|
+
/** Show milliseconds (e.g. `02:30.123`). Default: false. */
|
|
7
|
+
showMs?: boolean;
|
|
8
|
+
/** Optional label prepended to the timer display. */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** Bijou context for I/O, styling, and mode detection. */
|
|
11
|
+
ctx?: BijouContext;
|
|
12
|
+
}
|
|
13
|
+
/** Controller for a live timer or stopwatch. */
|
|
14
|
+
export interface TimerController {
|
|
15
|
+
/** Begin the timer. */
|
|
16
|
+
start(): void;
|
|
17
|
+
/** Pause the timer (preserves elapsed time). */
|
|
18
|
+
pause(): void;
|
|
19
|
+
/** Resume a paused timer. */
|
|
20
|
+
resume(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Stop the timer and optionally print a final message.
|
|
23
|
+
* @param finalMessage - Text written after stopping (followed by a newline).
|
|
24
|
+
*/
|
|
25
|
+
stop(finalMessage?: string): void;
|
|
26
|
+
/** Return elapsed milliseconds. */
|
|
27
|
+
elapsed(): number;
|
|
28
|
+
}
|
|
29
|
+
/** Options for {@link createTimer}. */
|
|
30
|
+
export interface CreateTimerOptions extends TimerOptions {
|
|
31
|
+
/** Total duration in milliseconds for countdown. Timer completes when elapsed reaches this. */
|
|
32
|
+
duration: number;
|
|
33
|
+
/** Callback invoked when the countdown completes. */
|
|
34
|
+
onComplete?: () => void;
|
|
35
|
+
/** Tick interval in milliseconds. Default: 1000 (or 100 if showMs). */
|
|
36
|
+
interval?: number;
|
|
37
|
+
}
|
|
38
|
+
/** Options for {@link createStopwatch}. */
|
|
39
|
+
export interface CreateStopwatchOptions extends TimerOptions {
|
|
40
|
+
/** Tick interval in milliseconds. Default: 1000 (or 100 if showMs). */
|
|
41
|
+
interval?: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render a static timer string from a millisecond value.
|
|
45
|
+
*
|
|
46
|
+
* Output adapts to the current output mode:
|
|
47
|
+
* - `interactive` / `static` — formatted time with primary styling.
|
|
48
|
+
* - `pipe` — plain text like `"02:30"`.
|
|
49
|
+
* - `accessible` — human-readable like `"2 minutes, 30 seconds"`.
|
|
50
|
+
*
|
|
51
|
+
* @param ms - Elapsed or remaining time in milliseconds.
|
|
52
|
+
* @param options - Timer rendering options.
|
|
53
|
+
* @returns The rendered timer string.
|
|
54
|
+
*/
|
|
55
|
+
export declare function timer(ms: number, options?: TimerOptions): string;
|
|
56
|
+
/**
|
|
57
|
+
* Create a live countdown timer.
|
|
58
|
+
*
|
|
59
|
+
* Follows the same controller pattern as `createSpinner` and `createProgressBar`.
|
|
60
|
+
* In interactive mode, uses `setInterval` for ticking with `CLEAR_LINE_RETURN` for line overwrite.
|
|
61
|
+
* Non-interactive modes emit a single line on start and final line on stop.
|
|
62
|
+
*
|
|
63
|
+
* @param options - Timer configuration including duration and optional onComplete callback.
|
|
64
|
+
* @returns A {@link TimerController} for managing the timer.
|
|
65
|
+
*/
|
|
66
|
+
export declare function createTimer(options: CreateTimerOptions): TimerController;
|
|
67
|
+
/**
|
|
68
|
+
* Create a live stopwatch (counts up from zero).
|
|
69
|
+
*
|
|
70
|
+
* @param options - Stopwatch configuration.
|
|
71
|
+
* @returns A {@link TimerController} for managing the stopwatch.
|
|
72
|
+
*/
|
|
73
|
+
export declare function createStopwatch(options?: CreateStopwatchOptions): TimerController;
|
|
74
|
+
//# sourceMappingURL=timer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../../../src/core/components/timer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAO3D,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,gDAAgD;IAChD,KAAK,IAAI,IAAI,CAAC;IACd,6BAA6B;IAC7B,MAAM,IAAI,IAAI,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,mCAAmC;IACnC,OAAO,IAAI,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,+FAA+F;IAC/F,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,WAAW,sBAAuB,SAAQ,YAAY;IAC1D,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAmBpE;AAmID;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,eAAe,CAsBxE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAUrF"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { resolveCtx } from '../resolve-ctx.js';
|
|
2
|
+
import { renderByMode } from '../mode-render.js';
|
|
3
|
+
import { cursorGuard } from './cursor-guard.js';
|
|
4
|
+
import { CLEAR_LINE_RETURN } from '../ansi.js';
|
|
5
|
+
/**
|
|
6
|
+
* Render a static timer string from a millisecond value.
|
|
7
|
+
*
|
|
8
|
+
* Output adapts to the current output mode:
|
|
9
|
+
* - `interactive` / `static` — formatted time with primary styling.
|
|
10
|
+
* - `pipe` — plain text like `"02:30"`.
|
|
11
|
+
* - `accessible` — human-readable like `"2 minutes, 30 seconds"`.
|
|
12
|
+
*
|
|
13
|
+
* @param ms - Elapsed or remaining time in milliseconds.
|
|
14
|
+
* @param options - Timer rendering options.
|
|
15
|
+
* @returns The rendered timer string.
|
|
16
|
+
*/
|
|
17
|
+
export function timer(ms, options = {}) {
|
|
18
|
+
const ctx = resolveCtx(options.ctx);
|
|
19
|
+
const label = options.label;
|
|
20
|
+
return renderByMode(ctx.mode, {
|
|
21
|
+
pipe: () => {
|
|
22
|
+
const formatted = formatTime(ms, options);
|
|
23
|
+
return label ? `${label} ${formatted}` : formatted;
|
|
24
|
+
},
|
|
25
|
+
accessible: () => {
|
|
26
|
+
const spoken = formatSpoken(ms);
|
|
27
|
+
return label ? `${label} ${spoken}` : spoken;
|
|
28
|
+
},
|
|
29
|
+
interactive: () => {
|
|
30
|
+
const formatted = formatTime(ms, options);
|
|
31
|
+
const timeStr = ctx.style.styled(ctx.semantic('primary'), formatted);
|
|
32
|
+
return label ? `${label} ${timeStr}` : timeStr;
|
|
33
|
+
},
|
|
34
|
+
}, options);
|
|
35
|
+
}
|
|
36
|
+
function computeElapsed(s) {
|
|
37
|
+
switch (s.kind) {
|
|
38
|
+
case 'idle': return 0;
|
|
39
|
+
case 'running': return s.pausedElapsed + (Date.now() - s.startTime);
|
|
40
|
+
case 'paused': return s.pausedElapsed;
|
|
41
|
+
case 'stopped': return s.elapsedMs;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** Shared controller logic for createTimer and createStopwatch. */
|
|
45
|
+
function createLiveController(config) {
|
|
46
|
+
const { ctx, interval, timerOpts, displayMs, initialDisplayMs, onTick, onComplete } = config;
|
|
47
|
+
const mode = ctx.mode;
|
|
48
|
+
let state = { kind: 'idle' };
|
|
49
|
+
function tick() {
|
|
50
|
+
if (state.kind !== 'running')
|
|
51
|
+
return;
|
|
52
|
+
const elapsed = state.pausedElapsed + (Date.now() - state.startTime);
|
|
53
|
+
if (onTick?.(elapsed)) {
|
|
54
|
+
state.handle.dispose();
|
|
55
|
+
if (mode === 'interactive') {
|
|
56
|
+
ctx.io.write('\n');
|
|
57
|
+
if (state.cursor !== null) {
|
|
58
|
+
state.cursor.dispose();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
state = { kind: 'stopped', elapsedMs: elapsed };
|
|
62
|
+
onComplete?.();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const line = timer(displayMs(elapsed), { ...timerOpts, ctx });
|
|
66
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${line}`);
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
start() {
|
|
70
|
+
if (state.kind === 'running' || state.kind === 'paused') {
|
|
71
|
+
state.handle.dispose();
|
|
72
|
+
if (state.cursor !== null) {
|
|
73
|
+
state.cursor.dispose();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (mode !== 'interactive') {
|
|
77
|
+
ctx.io.write(timer(initialDisplayMs, { ...timerOpts, ctx }) + '\n');
|
|
78
|
+
if (onTick?.(0)) {
|
|
79
|
+
onComplete?.();
|
|
80
|
+
}
|
|
81
|
+
state = { kind: 'idle' };
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const cursor = cursorGuard(ctx.io).hide();
|
|
85
|
+
if (onTick?.(0)) {
|
|
86
|
+
cursor.dispose();
|
|
87
|
+
state = { kind: 'stopped', elapsedMs: 0 };
|
|
88
|
+
onComplete?.();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const now = Date.now();
|
|
92
|
+
const line = timer(displayMs(0), { ...timerOpts, ctx });
|
|
93
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${line}`);
|
|
94
|
+
const handle = ctx.io.setInterval(tick, interval);
|
|
95
|
+
state = { kind: 'running', startTime: now, pausedElapsed: 0, handle, cursor };
|
|
96
|
+
},
|
|
97
|
+
pause() {
|
|
98
|
+
if (state.kind !== 'running')
|
|
99
|
+
return;
|
|
100
|
+
const elapsed = state.pausedElapsed + (Date.now() - state.startTime);
|
|
101
|
+
state = { kind: 'paused', pausedElapsed: elapsed, handle: state.handle, cursor: state.cursor };
|
|
102
|
+
},
|
|
103
|
+
resume() {
|
|
104
|
+
if (state.kind !== 'paused')
|
|
105
|
+
return;
|
|
106
|
+
state = { kind: 'running', startTime: Date.now(), pausedElapsed: state.pausedElapsed,
|
|
107
|
+
handle: state.handle, cursor: state.cursor };
|
|
108
|
+
},
|
|
109
|
+
stop(finalMessage) {
|
|
110
|
+
const elapsed = computeElapsed(state);
|
|
111
|
+
if (state.kind === 'running' || state.kind === 'paused') {
|
|
112
|
+
state.handle.dispose();
|
|
113
|
+
if (mode === 'interactive') {
|
|
114
|
+
ctx.io.write(CLEAR_LINE_RETURN);
|
|
115
|
+
if (state.cursor !== null) {
|
|
116
|
+
state.cursor.dispose();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
state = { kind: 'stopped', elapsedMs: elapsed };
|
|
121
|
+
if (finalMessage !== undefined) {
|
|
122
|
+
ctx.io.write(finalMessage + '\n');
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
elapsed() {
|
|
126
|
+
return computeElapsed(state);
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a live countdown timer.
|
|
132
|
+
*
|
|
133
|
+
* Follows the same controller pattern as `createSpinner` and `createProgressBar`.
|
|
134
|
+
* In interactive mode, uses `setInterval` for ticking with `CLEAR_LINE_RETURN` for line overwrite.
|
|
135
|
+
* Non-interactive modes emit a single line on start and final line on stop.
|
|
136
|
+
*
|
|
137
|
+
* @param options - Timer configuration including duration and optional onComplete callback.
|
|
138
|
+
* @returns A {@link TimerController} for managing the timer.
|
|
139
|
+
*/
|
|
140
|
+
export function createTimer(options) {
|
|
141
|
+
const ctx = resolveCtx(options.ctx);
|
|
142
|
+
const duration = Math.max(0, options.duration);
|
|
143
|
+
const onComplete = options.onComplete;
|
|
144
|
+
return createLiveController({
|
|
145
|
+
ctx,
|
|
146
|
+
interval: options.interval ?? (options.showMs ? 100 : 1000),
|
|
147
|
+
timerOpts: options,
|
|
148
|
+
displayMs: (elapsed) => Math.max(0, duration - elapsed),
|
|
149
|
+
initialDisplayMs: duration,
|
|
150
|
+
onTick: (elapsed) => {
|
|
151
|
+
if (elapsed >= duration) {
|
|
152
|
+
// Render final frame before completing
|
|
153
|
+
const line = timer(0, { ...options, ctx });
|
|
154
|
+
ctx.io.write(`${CLEAR_LINE_RETURN}${line}`);
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
return false;
|
|
158
|
+
},
|
|
159
|
+
onComplete,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Create a live stopwatch (counts up from zero).
|
|
164
|
+
*
|
|
165
|
+
* @param options - Stopwatch configuration.
|
|
166
|
+
* @returns A {@link TimerController} for managing the stopwatch.
|
|
167
|
+
*/
|
|
168
|
+
export function createStopwatch(options = {}) {
|
|
169
|
+
const ctx = resolveCtx(options.ctx);
|
|
170
|
+
return createLiveController({
|
|
171
|
+
ctx,
|
|
172
|
+
interval: options.interval ?? (options.showMs ? 100 : 1000),
|
|
173
|
+
timerOpts: options,
|
|
174
|
+
displayMs: (elapsed) => elapsed,
|
|
175
|
+
initialDisplayMs: 0,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Formatting helpers
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/** Format milliseconds as `MM:SS`, `HH:MM:SS`, or `MM:SS.mmm`. */
|
|
182
|
+
function formatTime(ms, options) {
|
|
183
|
+
const safeMs = Math.max(0, ms);
|
|
184
|
+
const totalSeconds = Math.floor(safeMs / 1000);
|
|
185
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
186
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
187
|
+
const seconds = totalSeconds % 60;
|
|
188
|
+
const millis = Math.floor(safeMs % 1000);
|
|
189
|
+
const mm = String(minutes).padStart(2, '0');
|
|
190
|
+
const ss = String(seconds).padStart(2, '0');
|
|
191
|
+
let result;
|
|
192
|
+
if (options.showHours || hours > 0) {
|
|
193
|
+
const hh = String(hours).padStart(2, '0');
|
|
194
|
+
result = `${hh}:${mm}:${ss}`;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
result = `${mm}:${ss}`;
|
|
198
|
+
}
|
|
199
|
+
if (options.showMs) {
|
|
200
|
+
result += `.${String(millis).padStart(3, '0')}`;
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
/** Format milliseconds as a human-readable spoken string. */
|
|
205
|
+
function formatSpoken(ms) {
|
|
206
|
+
const totalSeconds = Math.floor(Math.max(0, ms) / 1000);
|
|
207
|
+
const hours = Math.floor(totalSeconds / 3600);
|
|
208
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
209
|
+
const seconds = totalSeconds % 60;
|
|
210
|
+
const parts = [];
|
|
211
|
+
if (hours > 0)
|
|
212
|
+
parts.push(`${hours} ${hours === 1 ? 'hour' : 'hours'}`);
|
|
213
|
+
if (minutes > 0)
|
|
214
|
+
parts.push(`${minutes} ${minutes === 1 ? 'minute' : 'minutes'}`);
|
|
215
|
+
if (seconds > 0 || parts.length === 0)
|
|
216
|
+
parts.push(`${seconds} ${seconds === 1 ? 'second' : 'seconds'}`);
|
|
217
|
+
return parts.join(', ');
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=timer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timer.js","sourceRoot":"","sources":["../../../src/core/components/timer.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,11 @@ export type OutputMode = 'interactive' | 'static' | 'pipe' | 'accessible';
|
|
|
24
24
|
* Inspects environment variables and TTY status via the optional
|
|
25
25
|
* {@link RuntimePort} abstraction.
|
|
26
26
|
*
|
|
27
|
+
* @deprecated The zero-argument form (`detectOutputMode()`) falls back to
|
|
28
|
+
* `process.env` / `process.stdout`, bypassing hexagonal ports. Prefer
|
|
29
|
+
* `detectOutputMode(runtime)` with an explicit {@link RuntimePort}, or
|
|
30
|
+
* use `createBijou()` which handles detection internally.
|
|
31
|
+
*
|
|
27
32
|
* @param runtime - Optional runtime port for environment access.
|
|
28
33
|
* @returns The detected {@link OutputMode}.
|
|
29
34
|
*/
|
|
@@ -42,6 +47,11 @@ export type ColorScheme = 'light' | 'dark';
|
|
|
42
47
|
* `"default;fg;bg"`). The last segment is treated as the background
|
|
43
48
|
* color index: 0–6 → dark, 7+ → light.
|
|
44
49
|
*
|
|
50
|
+
* @deprecated The zero-argument form (`detectColorScheme()`) falls back to
|
|
51
|
+
* `process.env`, bypassing hexagonal ports. Prefer
|
|
52
|
+
* `detectColorScheme(runtime)` with an explicit {@link RuntimePort}, or
|
|
53
|
+
* use `createBijou()` which handles detection internally.
|
|
54
|
+
*
|
|
45
55
|
* @param runtime - Optional runtime port for environment access. Falls back to `process`.
|
|
46
56
|
* @returns The detected {@link ColorScheme}. Defaults to `'dark'`.
|
|
47
57
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tty.d.ts","sourceRoot":"","sources":["../../../src/core/detect/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"tty.d.ts","sourceRoot":"","sources":["../../../src/core/detect/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAE1E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAclE;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,WAAW,CAcpE"}
|
package/dist/core/detect/tty.js
CHANGED
|
@@ -8,27 +8,24 @@
|
|
|
8
8
|
* CI=true -> 'static' (single-frame rendering)
|
|
9
9
|
* stdout.isTTY -> 'interactive' (full experience)
|
|
10
10
|
*/
|
|
11
|
-
|
|
12
|
-
* Build an environment variable accessor from a runtime port.
|
|
13
|
-
* Falls back to `process.env` when no runtime is provided.
|
|
14
|
-
*/
|
|
15
|
-
function envAccessor(runtime) {
|
|
16
|
-
return runtime
|
|
17
|
-
? (key) => runtime.env(key)
|
|
18
|
-
: (key) => process.env[key];
|
|
19
|
-
}
|
|
11
|
+
import { createEnvAccessor, createTTYAccessor } from '../../ports/env.js';
|
|
20
12
|
/**
|
|
21
13
|
* Detect the appropriate output mode for the current environment.
|
|
22
14
|
*
|
|
23
15
|
* Inspects environment variables and TTY status via the optional
|
|
24
16
|
* {@link RuntimePort} abstraction.
|
|
25
17
|
*
|
|
18
|
+
* @deprecated The zero-argument form (`detectOutputMode()`) falls back to
|
|
19
|
+
* `process.env` / `process.stdout`, bypassing hexagonal ports. Prefer
|
|
20
|
+
* `detectOutputMode(runtime)` with an explicit {@link RuntimePort}, or
|
|
21
|
+
* use `createBijou()` which handles detection internally.
|
|
22
|
+
*
|
|
26
23
|
* @param runtime - Optional runtime port for environment access.
|
|
27
24
|
* @returns The detected {@link OutputMode}.
|
|
28
25
|
*/
|
|
29
26
|
export function detectOutputMode(runtime) {
|
|
30
|
-
const env =
|
|
31
|
-
const stdoutIsTTY = runtime
|
|
27
|
+
const env = createEnvAccessor(runtime);
|
|
28
|
+
const stdoutIsTTY = createTTYAccessor(runtime);
|
|
32
29
|
if (env('BIJOU_ACCESSIBLE') === '1')
|
|
33
30
|
return 'accessible';
|
|
34
31
|
if (env('NO_COLOR') !== undefined)
|
|
@@ -48,11 +45,16 @@ export function detectOutputMode(runtime) {
|
|
|
48
45
|
* `"default;fg;bg"`). The last segment is treated as the background
|
|
49
46
|
* color index: 0–6 → dark, 7+ → light.
|
|
50
47
|
*
|
|
48
|
+
* @deprecated The zero-argument form (`detectColorScheme()`) falls back to
|
|
49
|
+
* `process.env`, bypassing hexagonal ports. Prefer
|
|
50
|
+
* `detectColorScheme(runtime)` with an explicit {@link RuntimePort}, or
|
|
51
|
+
* use `createBijou()` which handles detection internally.
|
|
52
|
+
*
|
|
51
53
|
* @param runtime - Optional runtime port for environment access. Falls back to `process`.
|
|
52
54
|
* @returns The detected {@link ColorScheme}. Defaults to `'dark'`.
|
|
53
55
|
*/
|
|
54
56
|
export function detectColorScheme(runtime) {
|
|
55
|
-
const env =
|
|
57
|
+
const env = createEnvAccessor(runtime);
|
|
56
58
|
const raw = env('COLORFGBG');
|
|
57
59
|
if (raw === undefined)
|
|
58
60
|
return 'dark';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tty.js","sourceRoot":"","sources":["../../../src/core/detect/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"tty.js","sourceRoot":"","sources":["../../../src/core/detect/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAY1E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAE/C,IAAI,GAAG,CAAC,kBAAkB,CAAC,KAAK,GAAG;QAAE,OAAO,YAAY,CAAC;IAEzD,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1C,IAAI,CAAC,WAAW;QAAE,OAAO,MAAM,CAAC;IAEhC,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE7C,OAAO,aAAa,CAAC;AACvB,CAAC;AAUD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAqB;IACrD,MAAM,GAAG,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IAE7B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAErC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,kEAAkE;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAEtC,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7B,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACpC,CAAC"}
|