silvery 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UPNG-AVSMjiFE.mjs +5076 -0
- package/dist/UPNG-AVSMjiFE.mjs.map +1 -0
- package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs +6 -0
- package/dist/__vite-browser-external-2447137e-D3GdsvS_.mjs.map +1 -0
- package/dist/animation-C_PTO0uH.mjs +304 -0
- package/dist/animation-C_PTO0uH.mjs.map +1 -0
- package/dist/ansi-CXLE_pt1.mjs +71 -0
- package/dist/ansi-CXLE_pt1.mjs.map +1 -0
- package/dist/ansi-zmNzgkPB.d.mts +49 -0
- package/dist/ansi-zmNzgkPB.d.mts.map +1 -0
- package/dist/apng-DCWY913R.mjs +3 -0
- package/dist/apng-ENBAJk-H.mjs +70 -0
- package/dist/apng-ENBAJk-H.mjs.map +1 -0
- package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
- package/dist/backend-CkIkIHR-.mjs +13396 -0
- package/dist/backend-CkIkIHR-.mjs.map +1 -0
- package/dist/backends-CkvbG3js.mjs +1181 -0
- package/dist/backends-CkvbG3js.mjs.map +1 -0
- package/dist/backends-CyJqNLeK.mjs +3 -0
- package/dist/chunk-BSw8zbkd.mjs +37 -0
- package/dist/cli-B-k7Bm56.mjs +4 -0
- package/dist/context-QreF3UHr.mjs +64 -0
- package/dist/context-QreF3UHr.mjs.map +1 -0
- package/dist/derive-D7bFJdfU.d.mts +28 -0
- package/dist/derive-D7bFJdfU.d.mts.map +1 -0
- package/dist/devtools-CscuKaDK.mjs +89 -0
- package/dist/devtools-CscuKaDK.mjs.map +1 -0
- package/dist/devtools-D4oGc6LY.mjs +2 -0
- package/dist/eta-DLiVPaSD.mjs +110 -0
- package/dist/eta-DLiVPaSD.mjs.map +1 -0
- package/dist/flexily-zero-adapter-DmG4Ge8t.mjs +3376 -0
- package/dist/flexily-zero-adapter-DmG4Ge8t.mjs.map +1 -0
- package/dist/flexily-zero-adapter-GHwEW11s.mjs +2 -0
- package/dist/gif-BaJNREpP.mjs +3 -0
- package/dist/gif-Bp6fIyN3.mjs +73 -0
- package/dist/gif-Bp6fIyN3.mjs.map +1 -0
- package/dist/gifenc-GiVCZ9-3.mjs +730 -0
- package/dist/gifenc-GiVCZ9-3.mjs.map +1 -0
- package/dist/image-Dx7gYjkq.mjs +346 -0
- package/dist/image-Dx7gYjkq.mjs.map +1 -0
- package/dist/index-CBcSpGSM.d.mts +3416 -0
- package/dist/index-CBcSpGSM.d.mts.map +1 -0
- package/dist/index-DCVL3jHo.d.mts +634 -0
- package/dist/index-DCVL3jHo.d.mts.map +1 -0
- package/dist/index-p-wBs_wH.d.mts +175 -0
- package/dist/index-p-wBs_wH.d.mts.map +1 -0
- package/dist/index.d.mts +7296 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +9399 -0
- package/dist/index.mjs.map +1 -0
- package/dist/key-mapping-BsUHe_nk.mjs +3 -0
- package/dist/key-mapping-DsyfLEdC.mjs +132 -0
- package/dist/key-mapping-DsyfLEdC.mjs.map +1 -0
- package/dist/layout-engine-B3dsnVLU.mjs +50 -0
- package/dist/layout-engine-B3dsnVLU.mjs.map +1 -0
- package/dist/layout-engine-D_lSR4i9.mjs +2 -0
- package/dist/multi-progress-C0-rkn86.d.mts +180 -0
- package/dist/multi-progress-C0-rkn86.d.mts.map +1 -0
- package/dist/multi-progress-CQVB9lES.mjs +219 -0
- package/dist/multi-progress-CQVB9lES.mjs.map +1 -0
- package/dist/node-Dedx-6xF.mjs +1085 -0
- package/dist/node-Dedx-6xF.mjs.map +1 -0
- package/dist/pipeline-DDOPrjuY.mjs +4387 -0
- package/dist/pipeline-DDOPrjuY.mjs.map +1 -0
- package/dist/progress-bar-COPSBlT9.mjs +155 -0
- package/dist/progress-bar-COPSBlT9.mjs.map +1 -0
- package/dist/reconciler-2lp5VXK7.mjs +16506 -0
- package/dist/reconciler-2lp5VXK7.mjs.map +1 -0
- package/dist/render-string-BXvxTg5P.mjs +201 -0
- package/dist/render-string-BXvxTg5P.mjs.map +1 -0
- package/dist/render-string-hvfpVtoP.mjs +2 -0
- package/dist/resvg-js-V6oMi8CY.mjs +203 -0
- package/dist/resvg-js-V6oMi8CY.mjs.map +1 -0
- package/dist/runtime-BjDHNTxJ.mjs +8723 -0
- package/dist/runtime-BjDHNTxJ.mjs.map +1 -0
- package/dist/runtime.d.mts +2 -0
- package/dist/runtime.mjs +3 -0
- package/dist/spinner-Cgej6Vnb.d.mts +127 -0
- package/dist/spinner-Cgej6Vnb.d.mts.map +1 -0
- package/dist/spinner-DSByknyx.mjs +298 -0
- package/dist/spinner-DSByknyx.mjs.map +1 -0
- package/dist/src-9B5k0JmY.mjs +1629 -0
- package/dist/src-9B5k0JmY.mjs.map +1 -0
- package/dist/src-C9f3hiVG.mjs +3620 -0
- package/dist/src-C9f3hiVG.mjs.map +1 -0
- package/dist/src-fJVbhdn-.mjs +816 -0
- package/dist/src-fJVbhdn-.mjs.map +1 -0
- package/dist/theme.d.mts +115 -0
- package/dist/theme.d.mts.map +1 -0
- package/dist/theme.mjs +8 -0
- package/dist/theme.mjs.map +1 -0
- package/dist/types-Bhj5QkIQ.mjs +13 -0
- package/dist/types-Bhj5QkIQ.mjs.map +1 -0
- package/dist/types-CDgkE-Rw.d.mts +241 -0
- package/dist/types-CDgkE-Rw.d.mts.map +1 -0
- package/dist/ui/animation.d.mts +2 -0
- package/dist/ui/animation.mjs +2 -0
- package/dist/ui/ansi.d.mts +2 -0
- package/dist/ui/ansi.mjs +2 -0
- package/dist/ui/cli.d.mts +5 -0
- package/dist/ui/cli.mjs +7 -0
- package/dist/ui/display.d.mts +35 -0
- package/dist/ui/display.d.mts.map +1 -0
- package/dist/ui/display.mjs +123 -0
- package/dist/ui/display.mjs.map +1 -0
- package/dist/ui/image.d.mts +2 -0
- package/dist/ui/image.mjs +2 -0
- package/dist/ui/input.d.mts +184 -0
- package/dist/ui/input.d.mts.map +1 -0
- package/dist/ui/input.mjs +285 -0
- package/dist/ui/input.mjs.map +1 -0
- package/dist/ui/progress.d.mts +249 -0
- package/dist/ui/progress.d.mts.map +1 -0
- package/dist/ui/progress.mjs +858 -0
- package/dist/ui/progress.mjs.map +1 -0
- package/dist/ui/react.d.mts +280 -0
- package/dist/ui/react.d.mts.map +1 -0
- package/dist/ui/react.mjs +413 -0
- package/dist/ui/react.mjs.map +1 -0
- package/dist/ui/utils.d.mts +86 -0
- package/dist/ui/utils.d.mts.map +1 -0
- package/dist/ui/utils.mjs +2 -0
- package/dist/ui/wrappers.d.mts +3 -0
- package/dist/ui/wrappers.mjs +2 -0
- package/dist/ui.d.mts +6 -0
- package/dist/ui.mjs +7 -0
- package/dist/useLatest-BMIYXd6e.d.mts +154 -0
- package/dist/useLatest-BMIYXd6e.d.mts.map +1 -0
- package/dist/useLayout-BG2cGl15.mjs +139 -0
- package/dist/useLayout-BG2cGl15.mjs.map +1 -0
- package/dist/with-text-input-CmHf_9d6.d.mts +284 -0
- package/dist/with-text-input-CmHf_9d6.d.mts.map +1 -0
- package/dist/wrapper-Dqh0zi2W.mjs +3527 -0
- package/dist/wrapper-Dqh0zi2W.mjs.map +1 -0
- package/dist/wrappers-hhL8EQ_n.mjs +810 -0
- package/dist/wrappers-hhL8EQ_n.mjs.map +1 -0
- package/dist/yoga-adapter-BJ9SOhTY.mjs +245 -0
- package/dist/yoga-adapter-BJ9SOhTY.mjs.map +1 -0
- package/dist/yoga-adapter-Daq6-dw1.mjs +2 -0
- package/package.json +48 -75
- package/CHANGELOG.md +0 -319
- package/dist/chalk.js +0 -4
- package/dist/index.js +0 -270
- package/dist/ink.js +0 -142
- package/dist/runtime.js +0 -135
- package/dist/theme.js +0 -7
- package/dist/ui/animation.js +0 -3
- package/dist/ui/ansi.js +0 -3
- package/dist/ui/cli.js +0 -9
- package/dist/ui/display.js +0 -4
- package/dist/ui/image.js +0 -4
- package/dist/ui/input.js +0 -3
- package/dist/ui/progress.js +0 -9
- package/dist/ui/react.js +0 -4
- package/dist/ui/utils.js +0 -3
- package/dist/ui/wrappers.js +0 -15
- package/dist/ui.js +0 -18
- package/src/index.ts +0 -73
- package/src/runtime.ts +0 -4
- package/src/theme.ts +0 -4
- package/src/ui/animation.ts +0 -2
- package/src/ui/ansi.ts +0 -2
- package/src/ui/cli.ts +0 -3
- package/src/ui/display.ts +0 -2
- package/src/ui/image.ts +0 -2
- package/src/ui/input.ts +0 -2
- package/src/ui/progress.ts +0 -2
- package/src/ui/react.ts +0 -2
- package/src/ui/utils.ts +0 -2
- package/src/ui/wrappers.ts +0 -2
- package/src/ui.ts +0 -4
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { $ as defaultInit, $t as RuntimeOptions, A as DiffMode, B as filter, C as resumeTerminalState, D as usePasteCallback, E as PasteCallback, Et as useInput, F as layout, Ft as TermEvents, G as merge, Gt as Event, H as fromArray, Hn as parseKey, I as layoutSync, It as TermProvider, J as throttle, Jt as Provider, K as take, Kt as EventData, L as batch, Ln as emptyKey, Lt as TermProviderOptions, M as render, N as LayoutOptions, Nn as InputHandler, O as createRuntime, P as ensureLayoutEngine, Pn as Key, Q as createStore, Qt as Runtime, R as concat, Rt as TermState, S as restoreTerminalState, T as run, Tt as UseInputOptions, U as fromArrayWithDelay, Ut as Buffer, V as filterMap, W as map, Wt as Dims, X as StoreApi, Xt as ProviderEventKey, Y as zip, Yt as ProviderEvent, Z as StoreConfig, Zt as RenderTarget, _ as CTRL_Z, a as AppDefinition, b as captureTerminalState, c as AppRunner, d as EventHandlers, et as silveryUpdate, f as StoreContext, g as CTRL_C, h as useAppShallow, i as createTick, j as diff, k as createBuffer, l as EventHandler, m as useApp, n as createFrameTick, o as AppHandle, p as createApp, q as takeUntil, qt as NamespacedEvent, r as createSecondTick, s as AppRunOptions, t as createAdaptiveTick, tt as withFocusManagement, u as EventHandlerContext, v as TerminalLifecycleOptions, w as RunOptions, wt as useExit, x as performSuspend, y as TerminalState, z as debounce, zt as createTermProvider } from "./index-CBcSpGSM.mjs";
|
|
2
|
+
export { AppDefinition, AppHandle, AppRunOptions, AppRunner, Buffer, CTRL_C, CTRL_Z, DiffMode, Dims, Event, EventData, EventHandler, EventHandlerContext, EventHandlers, InputHandler, Key, LayoutOptions, NamespacedEvent, PasteCallback as PasteHandler, Provider, ProviderEvent, ProviderEventKey, RenderTarget, RunOptions, Runtime, RuntimeOptions, StoreApi, StoreConfig, StoreContext, TermEvents, TermProvider, TermProviderOptions, TermState, TerminalLifecycleOptions, TerminalState, UseInputOptions, batch, captureTerminalState, concat, createAdaptiveTick, createApp, createBuffer, createFrameTick, createRuntime, createSecondTick, createStore, createTermProvider, createTick, debounce, defaultInit, diff, emptyKey, ensureLayoutEngine, filter, filterMap, fromArray, fromArrayWithDelay, layout, layoutSync, map, merge, parseKey, performSuspend, render, restoreTerminalState, resumeTerminalState, run, silveryUpdate, take, takeUntil, throttle, useApp, useAppShallow, useExit, useInput, usePasteCallback as usePaste, withFocusManagement, zip };
|
package/dist/runtime.mjs
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { A as fromArrayWithDelay, B as withFocusManagement, C as layoutSync, D as filter, E as debounce, F as throttle, I as zip, L as createStore, M as merge, N as take, O as filterMap, P as takeUntil, R as defaultInit, S as layout, T as concat, Yn as useInput, _ as createRuntime, a as run, b as render, c as createApp, d as CTRL_C, f as CTRL_Z, fn as useExit, g as resumeTerminalState, h as restoreTerminalState, i as createTick, j as map, k as fromArray, l as useApp, m as performSuspend, n as createFrameTick, o as usePasteCallback, p as captureTerminalState, r as createSecondTick, s as StoreContext, t as createAdaptiveTick, u as useAppShallow, v as createBuffer, w as batch, x as ensureLayoutEngine, y as diff, z as silveryUpdate } from "./runtime-BjDHNTxJ.mjs";
|
|
2
|
+
import { C as createTermProvider, Kt as parseKey, Rt as emptyKey } from "./reconciler-2lp5VXK7.mjs";
|
|
3
|
+
export { CTRL_C, CTRL_Z, StoreContext, batch, captureTerminalState, concat, createAdaptiveTick, createApp, createBuffer, createFrameTick, createRuntime, createSecondTick, createStore, createTermProvider, createTick, debounce, defaultInit, diff, emptyKey, ensureLayoutEngine, filter, filterMap, fromArray, fromArrayWithDelay, layout, layoutSync, map, merge, parseKey, performSuspend, render, restoreTerminalState, resumeTerminalState, run, silveryUpdate, take, takeUntil, throttle, useApp, useAppShallow, useExit, useInput, usePasteCallback as usePaste, withFocusManagement, zip };
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { c as SpinnerOptions, u as SpinnerStyle } from "./types-CDgkE-Rw.mjs";
|
|
2
|
+
|
|
3
|
+
//#region packages/ag-react/src/ui/cli/spinner.d.ts
|
|
4
|
+
/** Spinner animation frames by style */
|
|
5
|
+
declare const SPINNER_FRAMES: Record<SpinnerStyle, string[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Spinner class for CLI progress indication
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const spinner = new Spinner("Loading...");
|
|
12
|
+
* spinner.start();
|
|
13
|
+
* await doWork();
|
|
14
|
+
* spinner.succeed("Done!");
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
declare class Spinner {
|
|
18
|
+
private text;
|
|
19
|
+
private style;
|
|
20
|
+
private color;
|
|
21
|
+
private stream;
|
|
22
|
+
private hideCursor;
|
|
23
|
+
private interval;
|
|
24
|
+
private frameIndex;
|
|
25
|
+
private timer;
|
|
26
|
+
private isSpinning;
|
|
27
|
+
constructor(textOrOptions?: string | SpinnerOptions);
|
|
28
|
+
/** Get current spinner text */
|
|
29
|
+
get currentText(): string;
|
|
30
|
+
/** Set spinner text (updates immediately if spinning) */
|
|
31
|
+
set currentText(value: string);
|
|
32
|
+
/** Check if spinner is currently active */
|
|
33
|
+
get spinning(): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Start the spinner animation
|
|
36
|
+
*/
|
|
37
|
+
start(text?: string): this;
|
|
38
|
+
/**
|
|
39
|
+
* Stop the spinner
|
|
40
|
+
*/
|
|
41
|
+
stop(): this;
|
|
42
|
+
/**
|
|
43
|
+
* Stop with success message (green checkmark)
|
|
44
|
+
*/
|
|
45
|
+
succeed(text?: string): this;
|
|
46
|
+
/**
|
|
47
|
+
* Stop with failure message (red X)
|
|
48
|
+
*/
|
|
49
|
+
fail(text?: string): this;
|
|
50
|
+
/**
|
|
51
|
+
* Stop with warning message (yellow warning)
|
|
52
|
+
*/
|
|
53
|
+
warn(text?: string): this;
|
|
54
|
+
/**
|
|
55
|
+
* Stop with info message (blue info)
|
|
56
|
+
*/
|
|
57
|
+
info(text?: string): this;
|
|
58
|
+
/**
|
|
59
|
+
* Clear the spinner line
|
|
60
|
+
*/
|
|
61
|
+
clear(): this;
|
|
62
|
+
private render;
|
|
63
|
+
private stopWithSymbol;
|
|
64
|
+
/**
|
|
65
|
+
* Dispose the spinner (calls stop)
|
|
66
|
+
*/
|
|
67
|
+
[Symbol.dispose](): void;
|
|
68
|
+
/**
|
|
69
|
+
* Static helper to quickly start a spinner
|
|
70
|
+
* Returns a stop function
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* const stop = Spinner.start("Loading...");
|
|
75
|
+
* await doWork();
|
|
76
|
+
* stop();
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
static start(textOrOptions?: string | SpinnerOptions): () => void;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Callable spinner interface - call with text to show/update
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* {
|
|
87
|
+
* using spinner = createSpinner({ style: "dots" });
|
|
88
|
+
* spinner("Loading..."); // Shows spinner with text
|
|
89
|
+
* spinner("Still loading..."); // Updates text
|
|
90
|
+
* } // Auto-stops via Symbol.dispose
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
interface CallableSpinner extends Disposable {
|
|
94
|
+
/** Call with text to show/update the spinner */
|
|
95
|
+
(text: string): void;
|
|
96
|
+
/** Stop the spinner */
|
|
97
|
+
stop(): void;
|
|
98
|
+
/** Stop with success message (green checkmark) */
|
|
99
|
+
succeed(text?: string): void;
|
|
100
|
+
/** Stop with failure message (red X) */
|
|
101
|
+
fail(text?: string): void;
|
|
102
|
+
/** Stop with warning message (yellow warning) */
|
|
103
|
+
warn(text?: string): void;
|
|
104
|
+
/** Stop with info message (blue info) */
|
|
105
|
+
info(text?: string): void;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Create a callable, disposable spinner
|
|
109
|
+
*
|
|
110
|
+
* The spinner is lazy - it won't show anything until you call it with text.
|
|
111
|
+
* Use with `using` for automatic cleanup:
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* {
|
|
116
|
+
* using spinner = createSpinner({ style: "dots" });
|
|
117
|
+
* // Nothing visible yet
|
|
118
|
+
*
|
|
119
|
+
* spinner("Loading repo..."); // Now shows spinner
|
|
120
|
+
* spinner("Applying events..."); // Updates text
|
|
121
|
+
* } // Auto-stops via Symbol.dispose
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
declare function createSpinner(options?: SpinnerOptions): CallableSpinner;
|
|
125
|
+
//#endregion
|
|
126
|
+
export { createSpinner as i, SPINNER_FRAMES as n, Spinner as r, CallableSpinner as t };
|
|
127
|
+
//# sourceMappingURL=spinner-Cgej6Vnb.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner-Cgej6Vnb.d.mts","names":[],"sources":["../packages/ag-react/src/ui/cli/spinner.ts"],"mappings":";;;;cASa,cAAA,EAAgB,MAAA,CAAO,YAAA;AA4BpC;;;;;;;;;;;AAAA,cAAa,OAAA;EAAA,QACH,IAAA;EAAA,QACA,KAAA;EAAA,QACA,KAAA;EAAA,QACA,MAAA;EAAA,QACA,UAAA;EAAA,QACA,QAAA;EAAA,QAEA,UAAA;EAAA,QACA,KAAA;EAAA,QACA,UAAA;cAEI,aAAA,YAAyB,cAAA;EAiBrB;EAAA,IALZ,WAAA,CAAA;EAoBJ;EAAA,IAfI,WAAA,CAAY,KAAA;EA2ChB;EAAA,IAnCI,QAAA,CAAA;EA2DI;;;EApDR,KAAA,CAAM,IAAA;EAkED;;;EAtCL,IAAA,CAAA;EA2DQ;;;EAnCR,OAAA,CAAQ,IAAA;EAsED;;;EA/DP,IAAA,CAAK,IAAA;EA+D+C;AAmBtD;;EA3EE,IAAA,CAAK,IAAA;EA2E4C;;;EApEjD,IAAA,CAAK,IAAA;EA0EL;;;EAnEA,KAAA,CAAA;EAAA,QAOQ,MAAA;EAAA,QAWA,cAAA;EAuDR;;;EAAA,CA9CC,MAAA,CAAO,OAAA;EAkEM;;;;;;;;;;;EAAA,OAnDP,KAAA,CAAM,aAAA,YAAyB,cAAA;AAAA;;;;;;;;;;;;;UAmBvB,eAAA,SAAwB,UAAA;;GAEtC,IAAA;;EAED,IAAA;;EAEA,OAAA,CAAQ,IAAA;;EAER,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;;EAEL,IAAA,CAAK,IAAA;AAAA;;;;;;;;;;;;;;;;;;iBAoBS,aAAA,CAAc,OAAA,GAAU,cAAA,GAAiB,eAAA"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { G as detectColor, S as createStyle, t as init_src } from "./src-9B5k0JmY.mjs";
|
|
2
|
+
import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW } from "./ansi-CXLE_pt1.mjs";
|
|
3
|
+
//#region packages/ink/src/chalk.ts
|
|
4
|
+
init_src();
|
|
5
|
+
function toChalkLevel(cl) {
|
|
6
|
+
if (cl === null) return 0;
|
|
7
|
+
if (cl === "basic") return 1;
|
|
8
|
+
if (cl === "256") return 2;
|
|
9
|
+
return 3;
|
|
10
|
+
}
|
|
11
|
+
const detectedColor = typeof process !== "undefined" && process.stdout ? detectColor(process.stdout) : null;
|
|
12
|
+
/**
|
|
13
|
+
* Default chalk instance — drop-in replacement for `import chalk from 'chalk'`.
|
|
14
|
+
*
|
|
15
|
+
* Supports the full chainable API: `chalk.bold.red('error')`, `chalk.hex('#ff0')('hi')`, etc.
|
|
16
|
+
* Also supports mutable `chalk.level` for chalk compat (0=none, 1=basic, 2=256, 3=truecolor).
|
|
17
|
+
*/
|
|
18
|
+
const chalk = createStyle({ level: detectedColor });
|
|
19
|
+
toChalkLevel(detectedColor);
|
|
20
|
+
(() => {
|
|
21
|
+
if (!process?.stderr) return false;
|
|
22
|
+
const level = toChalkLevel(detectColor(process.stderr));
|
|
23
|
+
return level === 0 ? false : { level };
|
|
24
|
+
})();
|
|
25
|
+
const foregroundColorNames = [
|
|
26
|
+
"black",
|
|
27
|
+
"red",
|
|
28
|
+
"green",
|
|
29
|
+
"yellow",
|
|
30
|
+
"blue",
|
|
31
|
+
"magenta",
|
|
32
|
+
"cyan",
|
|
33
|
+
"white",
|
|
34
|
+
"gray",
|
|
35
|
+
"grey",
|
|
36
|
+
"blackBright",
|
|
37
|
+
"redBright",
|
|
38
|
+
"greenBright",
|
|
39
|
+
"yellowBright",
|
|
40
|
+
"blueBright",
|
|
41
|
+
"magentaBright",
|
|
42
|
+
"cyanBright",
|
|
43
|
+
"whiteBright"
|
|
44
|
+
];
|
|
45
|
+
const backgroundColorNames = [
|
|
46
|
+
"bgBlack",
|
|
47
|
+
"bgRed",
|
|
48
|
+
"bgGreen",
|
|
49
|
+
"bgYellow",
|
|
50
|
+
"bgBlue",
|
|
51
|
+
"bgMagenta",
|
|
52
|
+
"bgCyan",
|
|
53
|
+
"bgWhite",
|
|
54
|
+
"bgGray",
|
|
55
|
+
"bgGrey",
|
|
56
|
+
"bgBlackBright",
|
|
57
|
+
"bgRedBright",
|
|
58
|
+
"bgGreenBright",
|
|
59
|
+
"bgYellowBright",
|
|
60
|
+
"bgBlueBright",
|
|
61
|
+
"bgMagentaBright",
|
|
62
|
+
"bgCyanBright",
|
|
63
|
+
"bgWhiteBright"
|
|
64
|
+
];
|
|
65
|
+
[...foregroundColorNames, ...backgroundColorNames];
|
|
66
|
+
//#endregion
|
|
67
|
+
//#region packages/ag-react/src/ui/cli/spinner.ts
|
|
68
|
+
/**
|
|
69
|
+
* CLI Spinner - Animated indeterminate progress indicator
|
|
70
|
+
*/
|
|
71
|
+
/** Spinner animation frames by style */
|
|
72
|
+
const SPINNER_FRAMES = {
|
|
73
|
+
dots: [
|
|
74
|
+
"⠋",
|
|
75
|
+
"⠙",
|
|
76
|
+
"⠹",
|
|
77
|
+
"⠸",
|
|
78
|
+
"⠼",
|
|
79
|
+
"⠴",
|
|
80
|
+
"⠦",
|
|
81
|
+
"⠧",
|
|
82
|
+
"⠇",
|
|
83
|
+
"⠏"
|
|
84
|
+
],
|
|
85
|
+
line: [
|
|
86
|
+
"-",
|
|
87
|
+
"\\",
|
|
88
|
+
"|",
|
|
89
|
+
"/"
|
|
90
|
+
],
|
|
91
|
+
arc: [
|
|
92
|
+
"◜",
|
|
93
|
+
"◠",
|
|
94
|
+
"◝",
|
|
95
|
+
"◞",
|
|
96
|
+
"◡",
|
|
97
|
+
"◟"
|
|
98
|
+
],
|
|
99
|
+
bounce: [
|
|
100
|
+
"⠁",
|
|
101
|
+
"⠂",
|
|
102
|
+
"⠄",
|
|
103
|
+
"⠂"
|
|
104
|
+
],
|
|
105
|
+
pulse: [
|
|
106
|
+
"█",
|
|
107
|
+
"▓",
|
|
108
|
+
"▒",
|
|
109
|
+
"░",
|
|
110
|
+
"▒",
|
|
111
|
+
"▓"
|
|
112
|
+
]
|
|
113
|
+
};
|
|
114
|
+
/** Default intervals for each style (ms) */
|
|
115
|
+
const SPINNER_INTERVALS = {
|
|
116
|
+
dots: 80,
|
|
117
|
+
line: 120,
|
|
118
|
+
arc: 100,
|
|
119
|
+
bounce: 120,
|
|
120
|
+
pulse: 100
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Spinner class for CLI progress indication
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* const spinner = new Spinner("Loading...");
|
|
128
|
+
* spinner.start();
|
|
129
|
+
* await doWork();
|
|
130
|
+
* spinner.succeed("Done!");
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
var Spinner = class Spinner {
|
|
134
|
+
text;
|
|
135
|
+
style;
|
|
136
|
+
color;
|
|
137
|
+
stream;
|
|
138
|
+
hideCursor;
|
|
139
|
+
interval;
|
|
140
|
+
frameIndex = 0;
|
|
141
|
+
timer = null;
|
|
142
|
+
isSpinning = false;
|
|
143
|
+
constructor(textOrOptions) {
|
|
144
|
+
const options = typeof textOrOptions === "string" ? { text: textOrOptions } : textOrOptions ?? {};
|
|
145
|
+
this.text = options.text ?? "";
|
|
146
|
+
this.style = options.style ?? "dots";
|
|
147
|
+
this.color = options.color ?? "cyan";
|
|
148
|
+
this.stream = options.stream ?? process.stdout;
|
|
149
|
+
this.hideCursor = options.hideCursor ?? true;
|
|
150
|
+
this.interval = options.interval ?? SPINNER_INTERVALS[this.style];
|
|
151
|
+
}
|
|
152
|
+
/** Get current spinner text */
|
|
153
|
+
get currentText() {
|
|
154
|
+
return this.text;
|
|
155
|
+
}
|
|
156
|
+
/** Set spinner text (updates immediately if spinning) */
|
|
157
|
+
set currentText(value) {
|
|
158
|
+
this.text = value;
|
|
159
|
+
if (this.isSpinning) this.render();
|
|
160
|
+
}
|
|
161
|
+
/** Check if spinner is currently active */
|
|
162
|
+
get spinning() {
|
|
163
|
+
return this.isSpinning;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Start the spinner animation
|
|
167
|
+
*/
|
|
168
|
+
start(text) {
|
|
169
|
+
if (text !== void 0) this.text = text;
|
|
170
|
+
if (this.isSpinning) return this;
|
|
171
|
+
this.isSpinning = true;
|
|
172
|
+
this.frameIndex = 0;
|
|
173
|
+
if (this.hideCursor && isTTY(this.stream)) write(CURSOR_HIDE, this.stream);
|
|
174
|
+
this.render();
|
|
175
|
+
this.timer = setInterval(() => {
|
|
176
|
+
this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES[this.style].length;
|
|
177
|
+
this.render();
|
|
178
|
+
}, this.interval);
|
|
179
|
+
return this;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Stop the spinner
|
|
183
|
+
*/
|
|
184
|
+
stop() {
|
|
185
|
+
if (!this.isSpinning) return this;
|
|
186
|
+
this.isSpinning = false;
|
|
187
|
+
if (this.timer) {
|
|
188
|
+
clearInterval(this.timer);
|
|
189
|
+
this.timer = null;
|
|
190
|
+
}
|
|
191
|
+
this.clear();
|
|
192
|
+
if (this.hideCursor && isTTY(this.stream)) write(CURSOR_SHOW, this.stream);
|
|
193
|
+
return this;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Stop with success message (green checkmark)
|
|
197
|
+
*/
|
|
198
|
+
succeed(text) {
|
|
199
|
+
return this.stopWithSymbol(chalk.green("✔"), text ?? this.text);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Stop with failure message (red X)
|
|
203
|
+
*/
|
|
204
|
+
fail(text) {
|
|
205
|
+
return this.stopWithSymbol(chalk.red("✖"), text ?? this.text);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Stop with warning message (yellow warning)
|
|
209
|
+
*/
|
|
210
|
+
warn(text) {
|
|
211
|
+
return this.stopWithSymbol(chalk.yellow("⚠"), text ?? this.text);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Stop with info message (blue info)
|
|
215
|
+
*/
|
|
216
|
+
info(text) {
|
|
217
|
+
return this.stopWithSymbol(chalk.blue("ℹ"), text ?? this.text);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Clear the spinner line
|
|
221
|
+
*/
|
|
222
|
+
clear() {
|
|
223
|
+
if (isTTY(this.stream)) write(`
|
|
224
|
+
return this;
|
|
225
|
+
}
|
|
226
|
+
render() {
|
|
227
|
+
const frame = SPINNER_FRAMES[this.style][this.frameIndex];
|
|
228
|
+
const colorFn = chalk[this.color];
|
|
229
|
+
const coloredFrame = colorFn ? colorFn(frame) : frame;
|
|
230
|
+
const output = this.text ? `${coloredFrame} ${this.text}` : coloredFrame;
|
|
231
|
+
if (isTTY(this.stream)) write(`
|
|
232
|
+
}
|
|
233
|
+
stopWithSymbol(symbol, text) {
|
|
234
|
+
this.stop();
|
|
235
|
+
write(`${symbol} ${text}\n`, this.stream);
|
|
236
|
+
return this;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Dispose the spinner (calls stop)
|
|
240
|
+
*/
|
|
241
|
+
[Symbol.dispose]() {
|
|
242
|
+
this.stop();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Static helper to quickly start a spinner
|
|
246
|
+
* Returns a stop function
|
|
247
|
+
*
|
|
248
|
+
* @example
|
|
249
|
+
* ```ts
|
|
250
|
+
* const stop = Spinner.start("Loading...");
|
|
251
|
+
* await doWork();
|
|
252
|
+
* stop();
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
static start(textOrOptions) {
|
|
256
|
+
const spinner = new Spinner(textOrOptions);
|
|
257
|
+
spinner.start();
|
|
258
|
+
return () => spinner.stop();
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
/**
|
|
262
|
+
* Create a callable, disposable spinner
|
|
263
|
+
*
|
|
264
|
+
* The spinner is lazy - it won't show anything until you call it with text.
|
|
265
|
+
* Use with `using` for automatic cleanup:
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```ts
|
|
269
|
+
* {
|
|
270
|
+
* using spinner = createSpinner({ style: "dots" });
|
|
271
|
+
* // Nothing visible yet
|
|
272
|
+
*
|
|
273
|
+
* spinner("Loading repo..."); // Now shows spinner
|
|
274
|
+
* spinner("Applying events..."); // Updates text
|
|
275
|
+
* } // Auto-stops via Symbol.dispose
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
function createSpinner(options) {
|
|
279
|
+
const spinner = new Spinner({
|
|
280
|
+
...options,
|
|
281
|
+
text: ""
|
|
282
|
+
});
|
|
283
|
+
const callable = ((text) => {
|
|
284
|
+
if (!spinner.spinning) spinner.start(text);
|
|
285
|
+
else spinner.currentText = text;
|
|
286
|
+
});
|
|
287
|
+
callable.stop = () => spinner.stop();
|
|
288
|
+
callable.succeed = (text) => spinner.succeed(text);
|
|
289
|
+
callable.fail = (text) => spinner.fail(text);
|
|
290
|
+
callable.warn = (text) => spinner.warn(text);
|
|
291
|
+
callable.info = (text) => spinner.info(text);
|
|
292
|
+
callable[Symbol.dispose] = () => spinner.stop();
|
|
293
|
+
return callable;
|
|
294
|
+
}
|
|
295
|
+
//#endregion
|
|
296
|
+
export { chalk as a, createSpinner as i, SPINNER_INTERVALS as n, Spinner as r, SPINNER_FRAMES as t };
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=spinner-DSByknyx.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner-DSByknyx.mjs","names":[],"sources":["../packages/ink/src/chalk.ts","../packages/ag-react/src/ui/cli/spinner.ts"],"sourcesContent":["/**\n * silvery/chalk — Drop-in chalk replacement powered by @silvery/ansi.\n *\n * ```ts\n * // Before:\n * import chalk from 'chalk'\n *\n * // After:\n * import chalk from 'silvery/chalk'\n * ```\n *\n * The default export is a chainable styling function with chalk-compatible API.\n * Under the hood it uses @silvery/ansi — no chalk dependency.\n *\n * @packageDocumentation\n */\n\nimport { createStyle, detectColor, type Style, type ColorLevel } from \"@silvery/ansi\"\n\n// =============================================================================\n// Color level conversion (chalk uses 0-3, silvery uses string|null)\n// =============================================================================\n\ntype ChalkLevel = 0 | 1 | 2 | 3\n\nfunction toChalkLevel(cl: ColorLevel | null): ChalkLevel {\n if (cl === null) return 0\n if (cl === \"basic\") return 1\n if (cl === \"256\") return 2\n return 3 // truecolor\n}\n\nfunction fromChalkLevel(level: ChalkLevel): ColorLevel | null {\n if (level === 0) return null\n if (level === 1) return \"basic\"\n if (level === 2) return \"256\"\n return \"truecolor\"\n}\n\n// =============================================================================\n// Default instance (auto-detected)\n// =============================================================================\n\nconst detectedColor = typeof process !== \"undefined\" && process.stdout ? detectColor(process.stdout) : null\n\n/**\n * Default chalk instance — drop-in replacement for `import chalk from 'chalk'`.\n *\n * Supports the full chainable API: `chalk.bold.red('error')`, `chalk.hex('#ff0')('hi')`, etc.\n * Also supports mutable `chalk.level` for chalk compat (0=none, 1=basic, 2=256, 3=truecolor).\n */\nconst chalk: Style = createStyle({ level: detectedColor })\nexport default chalk\n\n// =============================================================================\n// Named exports (chalk 5.x compatibility)\n// =============================================================================\n\n/**\n * Chalk constructor — creates a new style instance with a specific level.\n * Returns a callable Style (the constructor return overrides `this`).\n *\n * ```ts\n * const instance = new Chalk({ level: 3 })\n * console.log(instance.red('error'))\n * instance.level = 0 // disable colors\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Chalk extends Style {}\nexport class Chalk {\n constructor(options?: { level?: ChalkLevel }) {\n // chalk compat: validate level is 0-3\n if (options?.level !== undefined) {\n const lvl = options.level\n if (typeof lvl !== \"number\" || !Number.isInteger(lvl) || lvl < 0 || lvl > 3) {\n throw new Error(\"The `level` option should be an integer from 0 to 3\")\n }\n }\n // Returning an object from a constructor overrides `this` — chalk compat pattern\n return createStyle({\n level: fromChalkLevel(options?.level ?? toChalkLevel(detectedColor)),\n }) as any\n }\n}\n\nexport type ChalkInstance = Style\n\n/**\n * Color support detection for stdout.\n * Returns false if no color, or an object with the chalk level.\n */\nconst detectedLevel = toChalkLevel(detectedColor)\nexport const supportsColor: false | { level: ChalkLevel } = detectedLevel === 0 ? false : { level: detectedLevel }\n\n/**\n * Color support detection for stderr.\n */\nexport const supportsColorStderr: false | { level: ChalkLevel } = (() => {\n if (!process?.stderr) return false\n const level = toChalkLevel(detectColor(process.stderr))\n return level === 0 ? false : { level }\n})()\n\n// =============================================================================\n// Chalk name lists (for programmatic access)\n// =============================================================================\n\nexport const modifierNames = [\n \"reset\",\n \"bold\",\n \"dim\",\n \"italic\",\n \"underline\",\n \"overline\",\n \"inverse\",\n \"hidden\",\n \"strikethrough\",\n \"visible\",\n] as const\n\nexport const foregroundColorNames = [\n \"black\",\n \"red\",\n \"green\",\n \"yellow\",\n \"blue\",\n \"magenta\",\n \"cyan\",\n \"white\",\n \"gray\",\n \"grey\",\n \"blackBright\",\n \"redBright\",\n \"greenBright\",\n \"yellowBright\",\n \"blueBright\",\n \"magentaBright\",\n \"cyanBright\",\n \"whiteBright\",\n] as const\n\nexport const backgroundColorNames = [\n \"bgBlack\",\n \"bgRed\",\n \"bgGreen\",\n \"bgYellow\",\n \"bgBlue\",\n \"bgMagenta\",\n \"bgCyan\",\n \"bgWhite\",\n \"bgGray\",\n \"bgGrey\",\n \"bgBlackBright\",\n \"bgRedBright\",\n \"bgGreenBright\",\n \"bgYellowBright\",\n \"bgBlueBright\",\n \"bgMagentaBright\",\n \"bgCyanBright\",\n \"bgWhiteBright\",\n] as const\n\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames] as const\n\n// Re-export detection utilities that chalk users often need\nexport { detectColor, toChalkLevel, fromChalkLevel }\nexport type { ColorLevel, ChalkLevel }\n","/**\n * CLI Spinner - Animated indeterminate progress indicator\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { SpinnerOptions, SpinnerStyle } from \"../types.js\"\nimport { CURSOR_HIDE, CURSOR_SHOW, CURSOR_TO_START, CLEAR_LINE_END, write, isTTY } from \"./ansi\"\n\n/** Spinner animation frames by style */\nexport const SPINNER_FRAMES: Record<SpinnerStyle, string[]> = {\n dots: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n line: [\"-\", \"\\\\\", \"|\", \"/\"],\n arc: [\"◜\", \"◠\", \"◝\", \"◞\", \"◡\", \"◟\"],\n bounce: [\"⠁\", \"⠂\", \"⠄\", \"⠂\"],\n pulse: [\"█\", \"▓\", \"▒\", \"░\", \"▒\", \"▓\"],\n}\n\n/** Default intervals for each style (ms) */\nexport const SPINNER_INTERVALS: Record<SpinnerStyle, number> = {\n dots: 80,\n line: 120,\n arc: 100,\n bounce: 120,\n pulse: 100,\n}\n\n/**\n * Spinner class for CLI progress indication\n *\n * @example\n * ```ts\n * const spinner = new Spinner(\"Loading...\");\n * spinner.start();\n * await doWork();\n * spinner.succeed(\"Done!\");\n * ```\n */\nexport class Spinner {\n private text: string\n private style: SpinnerStyle\n private color: string\n private stream: NodeJS.WriteStream\n private hideCursor: boolean\n private interval: number\n\n private frameIndex = 0\n private timer: ReturnType<typeof setInterval> | null = null\n private isSpinning = false\n\n constructor(textOrOptions?: string | SpinnerOptions) {\n const options: SpinnerOptions = typeof textOrOptions === \"string\" ? { text: textOrOptions } : (textOrOptions ?? {})\n\n this.text = options.text ?? \"\"\n this.style = options.style ?? \"dots\"\n this.color = options.color ?? \"cyan\"\n this.stream = options.stream ?? process.stdout\n this.hideCursor = options.hideCursor ?? true\n this.interval = options.interval ?? SPINNER_INTERVALS[this.style]\n }\n\n /** Get current spinner text */\n get currentText(): string {\n return this.text\n }\n\n /** Set spinner text (updates immediately if spinning) */\n set currentText(value: string) {\n this.text = value\n if (this.isSpinning) {\n this.render()\n }\n }\n\n /** Check if spinner is currently active */\n get spinning(): boolean {\n return this.isSpinning\n }\n\n /**\n * Start the spinner animation\n */\n start(text?: string): this {\n if (text !== undefined) {\n this.text = text\n }\n\n if (this.isSpinning) {\n return this\n }\n\n this.isSpinning = true\n this.frameIndex = 0\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n this.timer = setInterval(() => {\n this.frameIndex = (this.frameIndex + 1) % SPINNER_FRAMES[this.style].length\n this.render()\n }, this.interval)\n\n return this\n }\n\n /**\n * Stop the spinner\n */\n stop(): this {\n if (!this.isSpinning) {\n return this\n }\n\n this.isSpinning = false\n\n if (this.timer) {\n clearInterval(this.timer)\n this.timer = null\n }\n\n this.clear()\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /**\n * Stop with success message (green checkmark)\n */\n succeed(text?: string): this {\n return this.stopWithSymbol(chalk.green(\"✔\"), text ?? this.text)\n }\n\n /**\n * Stop with failure message (red X)\n */\n fail(text?: string): this {\n return this.stopWithSymbol(chalk.red(\"✖\"), text ?? this.text)\n }\n\n /**\n * Stop with warning message (yellow warning)\n */\n warn(text?: string): this {\n return this.stopWithSymbol(chalk.yellow(\"⚠\"), text ?? this.text)\n }\n\n /**\n * Stop with info message (blue info)\n */\n info(text?: string): this {\n return this.stopWithSymbol(chalk.blue(\"ℹ\"), text ?? this.text)\n }\n\n /**\n * Clear the spinner line\n */\n clear(): this {\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${CLEAR_LINE_END}`, this.stream)\n }\n return this\n }\n\n private render(): void {\n const frame = SPINNER_FRAMES[this.style][this.frameIndex]\n const colorFn = (chalk as unknown as Record<string, (s: string) => string>)[this.color]\n const coloredFrame = colorFn ? colorFn(frame!) : frame!\n const output = this.text ? `${coloredFrame} ${this.text}` : coloredFrame\n\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${output}${CLEAR_LINE_END}`, this.stream)\n }\n }\n\n private stopWithSymbol(symbol: string, text: string): this {\n this.stop()\n write(`${symbol} ${text}\\n`, this.stream)\n return this\n }\n\n /**\n * Dispose the spinner (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n\n /**\n * Static helper to quickly start a spinner\n * Returns a stop function\n *\n * @example\n * ```ts\n * const stop = Spinner.start(\"Loading...\");\n * await doWork();\n * stop();\n * ```\n */\n static start(textOrOptions?: string | SpinnerOptions): () => void {\n const spinner = new Spinner(textOrOptions)\n spinner.start()\n return () => spinner.stop()\n }\n}\n\n/**\n * Callable spinner interface - call with text to show/update\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * spinner(\"Loading...\"); // Shows spinner with text\n * spinner(\"Still loading...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport interface CallableSpinner extends Disposable {\n /** Call with text to show/update the spinner */\n (text: string): void\n /** Stop the spinner */\n stop(): void\n /** Stop with success message (green checkmark) */\n succeed(text?: string): void\n /** Stop with failure message (red X) */\n fail(text?: string): void\n /** Stop with warning message (yellow warning) */\n warn(text?: string): void\n /** Stop with info message (blue info) */\n info(text?: string): void\n}\n\n/**\n * Create a callable, disposable spinner\n *\n * The spinner is lazy - it won't show anything until you call it with text.\n * Use with `using` for automatic cleanup:\n *\n * @example\n * ```ts\n * {\n * using spinner = createSpinner({ style: \"dots\" });\n * // Nothing visible yet\n *\n * spinner(\"Loading repo...\"); // Now shows spinner\n * spinner(\"Applying events...\"); // Updates text\n * } // Auto-stops via Symbol.dispose\n * ```\n */\nexport function createSpinner(options?: SpinnerOptions): CallableSpinner {\n const spinner = new Spinner({ ...options, text: \"\" })\n\n const callable = ((text: string) => {\n // Always restart if not spinning (handles initial call and after succeed/fail/etc)\n if (!spinner.spinning) {\n spinner.start(text)\n } else {\n spinner.currentText = text\n }\n }) as CallableSpinner\n\n callable.stop = () => spinner.stop()\n callable.succeed = (text) => spinner.succeed(text)\n callable.fail = (text) => spinner.fail(text)\n callable.warn = (text) => spinner.warn(text)\n callable.info = (text) => spinner.info(text)\n callable[Symbol.dispose] = () => spinner.stop()\n\n return callable\n}\n"],"mappings":"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"}
|