@mudah-cli/animation 0.8.0 → 0.9.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/LICENSE +21 -0
- package/README.md +36 -0
- package/dist/clock.d.ts +27 -0
- package/dist/clock.js +48 -0
- package/dist/clock.js.map +1 -0
- package/dist/easing.d.ts +30 -0
- package/dist/easing.js +34 -0
- package/dist/easing.js.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/progress.d.ts +30 -2
- package/dist/progress.js +74 -4
- package/dist/progress.js.map +1 -1
- package/dist/spinner.d.ts +9 -0
- package/dist/spinner.js +16 -6
- package/dist/spinner.js.map +1 -1
- package/dist/task-tree.d.ts +39 -0
- package/dist/task-tree.js +183 -0
- package/dist/task-tree.js.map +1 -0
- package/dist/tasks.js +13 -3
- package/dist/tasks.js.map +1 -1
- package/package.json +18 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mudah Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# @mudah-cli/animation
|
|
2
|
+
|
|
3
|
+
60fps terminal animation engine: ticker, spinners, progress bars, task trees, and transitions.
|
|
4
|
+
|
|
5
|
+
Part of [Mudah](https://github.com/thesimonharms/mudah) — an ergonomic, animation-rich CLI
|
|
6
|
+
framework. Depends only on `@mudah-cli/terminal`.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```sh
|
|
11
|
+
npm install @mudah-cli/animation
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { Spinner, ProgressBar } from '@mudah-cli/animation';
|
|
18
|
+
|
|
19
|
+
const spinner = new Spinner();
|
|
20
|
+
await spinner.with('Deploying…', async () => {
|
|
21
|
+
// run async work; the spinner stops even if it throws
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const bar = new ProgressBar({ total: files.length, stream: process.stderr });
|
|
25
|
+
files.forEach((_, i) => bar.set(i + 1));
|
|
26
|
+
bar.complete();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Spinners and animations degrade to static output when `MUDAH_REDUCED_MOTION=1`, the terminal is
|
|
30
|
+
non-TTY, or CI is set. `TaskRunner` and `TaskTree` compose multiple tasks with per-task lifecycle
|
|
31
|
+
hooks; easing presets and a delta-time `AnimationClock` are included.
|
|
32
|
+
|
|
33
|
+
## Links
|
|
34
|
+
|
|
35
|
+
- [Full documentation](https://github.com/thesimonharms/mudah#readme)
|
|
36
|
+
- [License: MIT](LICENSE)
|
package/dist/clock.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame-rate independent animation clock. Callers animate from `dtMs`
|
|
3
|
+
* rather than assuming a fixed interval. `now` is injectable so tests
|
|
4
|
+
* can drive time without fake timers.
|
|
5
|
+
*/
|
|
6
|
+
export interface AnimationClockOptions {
|
|
7
|
+
/** Clock source. Defaults to `performance.now`. */
|
|
8
|
+
now?: () => number;
|
|
9
|
+
/** Interval used by `start()` / `stop()`. Default 60. */
|
|
10
|
+
fps?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare class AnimationClock {
|
|
13
|
+
private readonly nowFn;
|
|
14
|
+
private readonly fps;
|
|
15
|
+
private readonly listeners;
|
|
16
|
+
private timer;
|
|
17
|
+
private lastTick;
|
|
18
|
+
constructor(options?: AnimationClockOptions);
|
|
19
|
+
/** Current time from the injected (or real) clock. */
|
|
20
|
+
now(): number;
|
|
21
|
+
onFrame(fn: (dtMs: number) => void): () => void;
|
|
22
|
+
get running(): boolean;
|
|
23
|
+
/** Deliver a delta-time frame. Safe to call from tests without `start()`. */
|
|
24
|
+
tick(dtMs: number): void;
|
|
25
|
+
start(): void;
|
|
26
|
+
stop(): void;
|
|
27
|
+
}
|
package/dist/clock.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export class AnimationClock {
|
|
2
|
+
nowFn;
|
|
3
|
+
fps;
|
|
4
|
+
listeners = new Set();
|
|
5
|
+
timer = null;
|
|
6
|
+
lastTick = 0;
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
this.nowFn = options.now ?? (() => performance.now());
|
|
9
|
+
this.fps = options.fps ?? 60;
|
|
10
|
+
}
|
|
11
|
+
/** Current time from the injected (or real) clock. */
|
|
12
|
+
now() {
|
|
13
|
+
return this.nowFn();
|
|
14
|
+
}
|
|
15
|
+
onFrame(fn) {
|
|
16
|
+
this.listeners.add(fn);
|
|
17
|
+
return () => {
|
|
18
|
+
this.listeners.delete(fn);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
get running() {
|
|
22
|
+
return this.timer !== null;
|
|
23
|
+
}
|
|
24
|
+
/** Deliver a delta-time frame. Safe to call from tests without `start()`. */
|
|
25
|
+
tick(dtMs) {
|
|
26
|
+
for (const listener of this.listeners) {
|
|
27
|
+
listener(dtMs);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
start() {
|
|
31
|
+
if (this.timer)
|
|
32
|
+
return;
|
|
33
|
+
this.lastTick = this.nowFn();
|
|
34
|
+
this.timer = setInterval(() => {
|
|
35
|
+
const current = this.nowFn();
|
|
36
|
+
const dt = current - this.lastTick;
|
|
37
|
+
this.lastTick = current;
|
|
38
|
+
this.tick(dt);
|
|
39
|
+
}, Math.round(1000 / this.fps));
|
|
40
|
+
}
|
|
41
|
+
stop() {
|
|
42
|
+
if (!this.timer)
|
|
43
|
+
return;
|
|
44
|
+
clearInterval(this.timer);
|
|
45
|
+
this.timer = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../src/clock.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAc;IACR,KAAK,CAAe;IACpB,GAAG,CAAS;IACZ,SAAS,GAAG,IAAI,GAAG,EAA0B,CAAC;IACvD,KAAK,GAA0C,IAAI,CAAC;IACpD,QAAQ,GAAG,CAAC,CAAC;IAErB,YAAY,OAAO,GAA0B,EAAE;QAC7C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,sDAAsD;IACtD,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED,OAAO,CAAC,EAA0B;QAChC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED,6EAA6E;IAC7E,IAAI,CAAC,IAAY;QACf,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,WAAW,CACtB,GAAG,EAAE;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,CAAC,EACD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAC5B,CAAC;IACJ,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF"}
|
package/dist/easing.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Easing functions for spinners, transitions, and animations.
|
|
3
|
+
* All return a value from 0..1 given `t` in 0..1.
|
|
4
|
+
*/
|
|
5
|
+
export type EasingFn = (t: number) => number;
|
|
6
|
+
/** Linear (no easing). */
|
|
7
|
+
export declare const linear: EasingFn;
|
|
8
|
+
/** Ease-in: slow start, fast end. */
|
|
9
|
+
export declare const easeIn: EasingFn;
|
|
10
|
+
/** Ease-out: fast start, slow end. */
|
|
11
|
+
export declare const easeOut: EasingFn;
|
|
12
|
+
/** Ease-in-out: slow start and end, fast middle. */
|
|
13
|
+
export declare const easeInOut: EasingFn;
|
|
14
|
+
/** Bounce: peaks with dampening. */
|
|
15
|
+
export declare const bounce: EasingFn;
|
|
16
|
+
/** Elastic: overshoots before settling. */
|
|
17
|
+
export declare const elastic: EasingFn;
|
|
18
|
+
/** Lookup easing functions by name. */
|
|
19
|
+
export declare const easings: {
|
|
20
|
+
readonly linear: EasingFn;
|
|
21
|
+
readonly easeIn: EasingFn;
|
|
22
|
+
readonly easeOut: EasingFn;
|
|
23
|
+
readonly easeInOut: EasingFn;
|
|
24
|
+
readonly bounce: EasingFn;
|
|
25
|
+
readonly elastic: EasingFn;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Interpolate between two values over time `t` (0..1) using an easing function.
|
|
29
|
+
*/
|
|
30
|
+
export declare function tween(from: number, to: number, t: number, ease?: EasingFn): number;
|
package/dist/easing.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Linear (no easing). */
|
|
2
|
+
export const linear = (t) => t;
|
|
3
|
+
/** Ease-in: slow start, fast end. */
|
|
4
|
+
export const easeIn = (t) => t * t;
|
|
5
|
+
/** Ease-out: fast start, slow end. */
|
|
6
|
+
export const easeOut = (t) => 1 - (1 - t) * (1 - t);
|
|
7
|
+
/** Ease-in-out: slow start and end, fast middle. */
|
|
8
|
+
export const easeInOut = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);
|
|
9
|
+
/** Bounce: peaks with dampening. */
|
|
10
|
+
export const bounce = (t) => {
|
|
11
|
+
const n1 = 7.5625;
|
|
12
|
+
const d1 = 2.75;
|
|
13
|
+
if (t < 1 / d1)
|
|
14
|
+
return n1 * t * t;
|
|
15
|
+
if (t < 2 / d1)
|
|
16
|
+
return n1 * (t -= 1.5 / d1) * t + 0.75;
|
|
17
|
+
if (t < 2.5 / d1)
|
|
18
|
+
return n1 * (t -= 2.25 / d1) * t + 0.9375;
|
|
19
|
+
return n1 * (t -= 2.625 / d1) * t + 0.984375;
|
|
20
|
+
};
|
|
21
|
+
/** Elastic: overshoots before settling. */
|
|
22
|
+
export const elastic = (t) => {
|
|
23
|
+
const c4 = (2 * Math.PI) / 3;
|
|
24
|
+
return t === 0 ? 0 : t === 1 ? 1 : 2 ** (-10 * t) * Math.sin((t * 10 - 0.75) * c4) + 1;
|
|
25
|
+
};
|
|
26
|
+
/** Lookup easing functions by name. */
|
|
27
|
+
export const easings = { linear, easeIn, easeOut, easeInOut, bounce, elastic };
|
|
28
|
+
/**
|
|
29
|
+
* Interpolate between two values over time `t` (0..1) using an easing function.
|
|
30
|
+
*/
|
|
31
|
+
export function tween(from, to, t, ease = linear) {
|
|
32
|
+
return from + (to - from) * ease(t);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=easing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"easing.js","sourceRoot":"","sources":["../src/easing.ts"],"names":[],"mappings":"AAMA,0BAA0B;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEzC,qCAAqC;AACrC,MAAM,CAAC,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AAE7C,sCAAsC;AACtC,MAAM,CAAC,MAAM,OAAO,GAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAE9D,oDAAoD;AACpD,MAAM,CAAC,MAAM,SAAS,GAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE5F,oCAAoC;AACpC,MAAM,CAAC,MAAM,MAAM,GAAa,CAAC,CAAC,EAAE,EAAE;IACpC,MAAM,EAAE,GAAG,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,IAAI,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACvD,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE;QAAE,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IAC5D,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;AAC/C,CAAC,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,OAAO,GAAa,CAAC,CAAC,EAAE,EAAE;IACrC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAW,CAAC;AAExF;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,EAAU,EAAE,CAAS,EAAE,IAAI,GAAa,MAAM;IAChF,OAAO,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { AnimationClock, type AnimationClockOptions } from './clock.js';
|
|
2
|
+
export { bounce, type EasingFn, easeIn, easeInOut, easeOut, easings, elastic, linear, tween, } from './easing.js';
|
|
3
|
+
export { defaultSpinner, type SpinnerStyle, spinnerStyles } from './frames.js';
|
|
4
|
+
export { ProgressBar, type ProgressBarMode, type ProgressBarOptions } from './progress.js';
|
|
3
5
|
export { Spinner, type SpinnerOptions } from './spinner.js';
|
|
6
|
+
export { type Task, TaskTree, type TaskTreeOptions } from './task-tree.js';
|
|
4
7
|
export { TaskRunner, type TaskRunnerOptions, type TaskSpec } from './tasks.js';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
export { AnimationClock } from './clock.js';
|
|
2
|
+
export { bounce, easeIn, easeInOut, easeOut, easings, elastic, linear, tween, } from './easing.js';
|
|
1
3
|
export { defaultSpinner, spinnerStyles } from './frames.js';
|
|
2
4
|
export { ProgressBar } from './progress.js';
|
|
3
5
|
export { Spinner } from './spinner.js';
|
|
6
|
+
export { TaskTree } from './task-tree.js';
|
|
4
7
|
export { TaskRunner } from './tasks.js';
|
|
5
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA8B,MAAM,YAAY,CAAC;AACxE,OAAO,EACL,MAAM,EAEN,MAAM,EACN,SAAS,EACT,OAAO,EACP,OAAO,EACP,OAAO,EACP,MAAM,EACN,KAAK,GACN,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAqB,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAiD,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAuB,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAa,QAAQ,EAAwB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAyC,MAAM,YAAY,CAAC"}
|
package/dist/progress.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
export type ProgressBarMode = 'determinate' | 'indeterminate';
|
|
1
2
|
export interface ProgressBarOptions {
|
|
2
|
-
|
|
3
|
+
/** Required for determinate bars. Ignored by the indeterminate renderer. */
|
|
4
|
+
total?: number;
|
|
5
|
+
/** Default `determinate`. Indeterminate draws a bouncing block, no %. */
|
|
6
|
+
mode?: ProgressBarMode;
|
|
3
7
|
/** Bar width in cells. Default 30. */
|
|
4
8
|
width?: number;
|
|
5
9
|
stream?: {
|
|
@@ -12,13 +16,23 @@ export interface ProgressBarOptions {
|
|
|
12
16
|
style?: (text: string) => string;
|
|
13
17
|
/** Master switch — pass false for silent operation. */
|
|
14
18
|
enabled?: boolean;
|
|
19
|
+
/** Fired once on the first `set` / `inc` / `tick`. */
|
|
20
|
+
onStart?: () => void;
|
|
21
|
+
/** Fired on every `set` / `inc` / `tick` (and on `complete`). */
|
|
22
|
+
onProgress?: (value: number, total: number) => void;
|
|
23
|
+
/** Fired once from `complete()`. */
|
|
24
|
+
onComplete?: () => void;
|
|
15
25
|
}
|
|
16
26
|
/**
|
|
17
27
|
* A single-line progress bar. `render()` is pure and stream-free so the UI
|
|
18
28
|
* layer (and tests) can compose it however they like.
|
|
29
|
+
*
|
|
30
|
+
* Determinate: filled fraction + percentage + `value/total`.
|
|
31
|
+
* Indeterminate: a bouncing block; call `tick()` to advance it.
|
|
19
32
|
*/
|
|
20
33
|
export declare class ProgressBar {
|
|
21
34
|
value: number;
|
|
35
|
+
readonly mode: ProgressBarMode;
|
|
22
36
|
private readonly total;
|
|
23
37
|
private readonly width;
|
|
24
38
|
private readonly stream?;
|
|
@@ -28,6 +42,12 @@ export declare class ProgressBar {
|
|
|
28
42
|
private readonly style?;
|
|
29
43
|
private readonly enabled;
|
|
30
44
|
private readonly eta;
|
|
45
|
+
private readonly onStartHook?;
|
|
46
|
+
private readonly onProgressHook?;
|
|
47
|
+
private readonly onCompleteHook?;
|
|
48
|
+
private started;
|
|
49
|
+
private finished;
|
|
50
|
+
private phase;
|
|
31
51
|
constructor(options: ProgressBarOptions);
|
|
32
52
|
/** Pure rendering of the current state. */
|
|
33
53
|
render(): string;
|
|
@@ -35,8 +55,16 @@ export declare class ProgressBar {
|
|
|
35
55
|
set(value: number): void;
|
|
36
56
|
/** Advance by a delta and repaint. */
|
|
37
57
|
inc(by?: number): void;
|
|
38
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Advance the indeterminate bounce (or repaint a determinate bar).
|
|
60
|
+
* First call fires `onStart`.
|
|
61
|
+
*/
|
|
62
|
+
tick(): void;
|
|
63
|
+
/** Finish: paint 100% (determinate) and move to a new line. */
|
|
39
64
|
complete(): void;
|
|
65
|
+
private renderIndeterminate;
|
|
66
|
+
private noteStart;
|
|
67
|
+
private noteProgress;
|
|
40
68
|
private paint;
|
|
41
69
|
private etaText;
|
|
42
70
|
}
|
package/dist/progress.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A single-line progress bar. `render()` is pure and stream-free so the UI
|
|
3
3
|
* layer (and tests) can compose it however they like.
|
|
4
|
+
*
|
|
5
|
+
* Determinate: filled fraction + percentage + `value/total`.
|
|
6
|
+
* Indeterminate: a bouncing block; call `tick()` to advance it.
|
|
4
7
|
*/
|
|
5
8
|
export class ProgressBar {
|
|
6
9
|
value = 0;
|
|
10
|
+
mode;
|
|
7
11
|
total;
|
|
8
12
|
width;
|
|
9
13
|
stream;
|
|
@@ -13,8 +17,15 @@ export class ProgressBar {
|
|
|
13
17
|
style;
|
|
14
18
|
enabled;
|
|
15
19
|
eta;
|
|
20
|
+
onStartHook;
|
|
21
|
+
onProgressHook;
|
|
22
|
+
onCompleteHook;
|
|
23
|
+
started = false;
|
|
24
|
+
finished = false;
|
|
25
|
+
phase = 0;
|
|
16
26
|
constructor(options) {
|
|
17
|
-
this.
|
|
27
|
+
this.mode = options.mode ?? 'determinate';
|
|
28
|
+
this.total = Math.max(1, options.total ?? 1);
|
|
18
29
|
this.width = options.width ?? 30;
|
|
19
30
|
this.stream = options.stream;
|
|
20
31
|
this.unicode = options.unicode ?? true;
|
|
@@ -23,15 +34,22 @@ export class ProgressBar {
|
|
|
23
34
|
this.style = options.style;
|
|
24
35
|
this.enabled = options.enabled ?? this.stream?.isTTY === true;
|
|
25
36
|
this.eta = { startedAt: performance.now() };
|
|
37
|
+
this.onStartHook = options.onStart;
|
|
38
|
+
this.onProgressHook = options.onProgress;
|
|
39
|
+
this.onCompleteHook = options.onComplete;
|
|
26
40
|
}
|
|
27
41
|
/** Pure rendering of the current state. */
|
|
28
42
|
render() {
|
|
43
|
+
if (this.mode === 'indeterminate')
|
|
44
|
+
return this.renderIndeterminate();
|
|
29
45
|
const clamped = Math.min(this.value, this.total);
|
|
30
46
|
const fraction = clamped / this.total;
|
|
31
47
|
const filled = Math.round(this.width * fraction);
|
|
32
48
|
const filledChar = this.unicode ? '█' : '#';
|
|
33
49
|
const emptyChar = this.unicode ? '░' : '-';
|
|
34
|
-
const bar = this.style
|
|
50
|
+
const bar = this.style
|
|
51
|
+
? this.style(filledChar.repeat(filled)) + emptyChar.repeat(this.width - filled)
|
|
52
|
+
: `${filledChar.repeat(filled)}${emptyChar.repeat(this.width - filled)}`;
|
|
35
53
|
const parts = [`[${bar}]`, `${Math.round(fraction * 100)}%`, `${clamped}/${this.total}`];
|
|
36
54
|
if (this.label)
|
|
37
55
|
parts.push(this.label);
|
|
@@ -44,20 +62,72 @@ export class ProgressBar {
|
|
|
44
62
|
}
|
|
45
63
|
/** Advance to an absolute value and repaint. */
|
|
46
64
|
set(value) {
|
|
65
|
+
this.noteStart();
|
|
47
66
|
this.value = Math.max(0, Math.min(value, this.total));
|
|
67
|
+
this.noteProgress();
|
|
48
68
|
this.paint();
|
|
49
69
|
}
|
|
50
70
|
/** Advance by a delta and repaint. */
|
|
51
71
|
inc(by = 1) {
|
|
52
72
|
this.set(this.value + by);
|
|
53
73
|
}
|
|
54
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Advance the indeterminate bounce (or repaint a determinate bar).
|
|
76
|
+
* First call fires `onStart`.
|
|
77
|
+
*/
|
|
78
|
+
tick() {
|
|
79
|
+
this.noteStart();
|
|
80
|
+
if (this.mode === 'indeterminate') {
|
|
81
|
+
this.phase += 1;
|
|
82
|
+
this.value = this.phase;
|
|
83
|
+
}
|
|
84
|
+
this.noteProgress();
|
|
85
|
+
this.paint();
|
|
86
|
+
}
|
|
87
|
+
/** Finish: paint 100% (determinate) and move to a new line. */
|
|
55
88
|
complete() {
|
|
56
|
-
this.
|
|
89
|
+
this.noteStart();
|
|
90
|
+
if (this.mode === 'determinate') {
|
|
91
|
+
this.value = this.total;
|
|
92
|
+
}
|
|
93
|
+
this.noteProgress();
|
|
94
|
+
this.paint();
|
|
95
|
+
if (!this.finished) {
|
|
96
|
+
this.finished = true;
|
|
97
|
+
this.onCompleteHook?.();
|
|
98
|
+
}
|
|
57
99
|
if (this.enabled && this.stream) {
|
|
58
100
|
this.stream.write('\n');
|
|
59
101
|
}
|
|
60
102
|
}
|
|
103
|
+
renderIndeterminate() {
|
|
104
|
+
const filledChar = this.unicode ? '█' : '#';
|
|
105
|
+
const emptyChar = this.unicode ? '░' : '-';
|
|
106
|
+
const block = Math.max(1, Math.round(this.width / 4));
|
|
107
|
+
const travel = Math.max(0, this.width - block);
|
|
108
|
+
const cycle = travel === 0 ? 1 : travel * 2;
|
|
109
|
+
const step = this.phase % cycle;
|
|
110
|
+
const pos = travel === 0 ? 0 : step <= travel ? step : cycle - step;
|
|
111
|
+
const left = emptyChar.repeat(pos);
|
|
112
|
+
const mid = filledChar.repeat(Math.min(block, this.width));
|
|
113
|
+
const right = emptyChar.repeat(Math.max(0, this.width - pos - block));
|
|
114
|
+
const raw = `${left}${mid}${right}`.slice(0, this.width);
|
|
115
|
+
const bar = this.style ? this.style(raw) : raw;
|
|
116
|
+
const parts = [`[${bar}]`];
|
|
117
|
+
if (this.label)
|
|
118
|
+
parts.push(this.label);
|
|
119
|
+
return parts.join(' ');
|
|
120
|
+
}
|
|
121
|
+
noteStart() {
|
|
122
|
+
if (this.started)
|
|
123
|
+
return;
|
|
124
|
+
this.started = true;
|
|
125
|
+
this.onStartHook?.();
|
|
126
|
+
}
|
|
127
|
+
noteProgress() {
|
|
128
|
+
const total = this.mode === 'indeterminate' ? 0 : this.total;
|
|
129
|
+
this.onProgressHook?.(this.value, total);
|
|
130
|
+
}
|
|
61
131
|
paint() {
|
|
62
132
|
if (this.enabled && this.stream) {
|
|
63
133
|
this.stream.write('\r\x1b[2K');
|
package/dist/progress.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/spinner.d.ts
CHANGED
|
@@ -14,6 +14,12 @@ export interface SpinnerOptions {
|
|
|
14
14
|
reducedMotion?: boolean;
|
|
15
15
|
/** Master switch — pass false to disable all output. */
|
|
16
16
|
enabled?: boolean;
|
|
17
|
+
/** Fired from `start()`. */
|
|
18
|
+
onStart?: () => void;
|
|
19
|
+
/** Fired on the initial frame and each subsequent tick. */
|
|
20
|
+
onProgress?: (frame: number, total: number) => void;
|
|
21
|
+
/** Fired from `stop()`. */
|
|
22
|
+
onComplete?: () => void;
|
|
17
23
|
}
|
|
18
24
|
/**
|
|
19
25
|
* An animated spinner bound to a stream.
|
|
@@ -33,6 +39,9 @@ export declare class Spinner {
|
|
|
33
39
|
private frame;
|
|
34
40
|
private timer;
|
|
35
41
|
private staticWritten;
|
|
42
|
+
private readonly onStartHook?;
|
|
43
|
+
private readonly onProgressHook?;
|
|
44
|
+
private readonly onCompleteHook?;
|
|
36
45
|
constructor(options?: SpinnerOptions);
|
|
37
46
|
start(label: string): void;
|
|
38
47
|
/** Update the label while running (re-renders immediately). */
|
package/dist/spinner.js
CHANGED
|
@@ -17,6 +17,9 @@ export class Spinner {
|
|
|
17
17
|
frame = 0;
|
|
18
18
|
timer = null;
|
|
19
19
|
staticWritten = false;
|
|
20
|
+
onStartHook;
|
|
21
|
+
onProgressHook;
|
|
22
|
+
onCompleteHook;
|
|
20
23
|
constructor(options = {}) {
|
|
21
24
|
const named = options.styleName ? spinnerStyles[options.styleName] : undefined;
|
|
22
25
|
this.stream = options.stream ?? process.stderr;
|
|
@@ -25,10 +28,15 @@ export class Spinner {
|
|
|
25
28
|
this.interval = options.interval ?? named?.interval ?? defaultSpinner.interval;
|
|
26
29
|
this.reducedMotion = options.reducedMotion ?? false;
|
|
27
30
|
this.enabled = options.enabled ?? this.stream.isTTY === true;
|
|
31
|
+
this.onStartHook = options.onStart;
|
|
32
|
+
this.onProgressHook = options.onProgress;
|
|
33
|
+
this.onCompleteHook = options.onComplete;
|
|
28
34
|
}
|
|
29
35
|
start(label) {
|
|
30
36
|
this.label = label;
|
|
31
37
|
this.frame = 0;
|
|
38
|
+
this.onStartHook?.();
|
|
39
|
+
this.onProgressHook?.(this.frame, this.frames.length);
|
|
32
40
|
if (!this.enabled)
|
|
33
41
|
return;
|
|
34
42
|
if (this.reducedMotion) {
|
|
@@ -39,6 +47,7 @@ export class Spinner {
|
|
|
39
47
|
this.writeLine(this.renderFrame());
|
|
40
48
|
this.timer = setInterval(() => {
|
|
41
49
|
this.frame = (this.frame + 1) % this.frames.length;
|
|
50
|
+
this.onProgressHook?.(this.frame, this.frames.length);
|
|
42
51
|
this.stream.write('\r\x1b[2K');
|
|
43
52
|
this.writeLine(this.renderFrame());
|
|
44
53
|
}, this.interval);
|
|
@@ -60,13 +69,14 @@ export class Spinner {
|
|
|
60
69
|
clearInterval(this.timer);
|
|
61
70
|
this.timer = null;
|
|
62
71
|
}
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
if (this.enabled) {
|
|
73
|
+
this.stream.write('\r\x1b[2K');
|
|
74
|
+
if (finalLabel) {
|
|
75
|
+
this.stream.write(`${finalLabel}\n`);
|
|
76
|
+
}
|
|
68
77
|
}
|
|
69
78
|
this.staticWritten = false;
|
|
79
|
+
this.onCompleteHook?.();
|
|
70
80
|
}
|
|
71
81
|
/** Run `fn` under a spinner; always stops, even on error. */
|
|
72
82
|
async with(label, fn) {
|
|
@@ -79,7 +89,7 @@ export class Spinner {
|
|
|
79
89
|
}
|
|
80
90
|
}
|
|
81
91
|
renderFrame() {
|
|
82
|
-
const glyph = this.reducedMotion ? '·' : this.frames[this.frame % this.frames.length] ?? '·';
|
|
92
|
+
const glyph = this.reducedMotion ? '·' : (this.frames[this.frame % this.frames.length] ?? '·');
|
|
83
93
|
const frame = this.style ? this.style(glyph) : glyph;
|
|
84
94
|
return `${frame} ${this.label}`;
|
|
85
95
|
}
|
package/dist/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwB5D;;;;;;GAMG;AACH,MAAM,OAAO,OAAO;IACD,MAAM,CAAmC;IACzC,KAAK,CAA4B;IACjC,MAAM,CAAoB;IAC1B,QAAQ,CAAS;IACjB,aAAa,CAAU;IACvB,OAAO,CAAU;IAE1B,KAAK,GAAG,EAAE,CAAC;IACX,KAAK,GAAG,CAAC,CAAC;IACV,KAAK,GAA0C,IAAI,CAAC;IACpD,aAAa,GAAG,KAAK,CAAC;IACb,WAAW,CAAc;IACzB,cAAc,CAA0C;IACxD,cAAc,CAAc;IAE7C,YAAY,OAAO,GAAmB,EAAE;QACtC,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,IAAI,cAAc,CAAC,MAAM,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,EAAE,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC;QAC/E,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QACpD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAK,IAAI,CAAC,MAA8B,CAAC,KAAK,KAAK,IAAI,CAAC;QACtF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACnD,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,+DAA+D;IAC/D,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAmB;QACtB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC/B,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,IAAI,CAAI,KAAa,EAAE,EAAwB;QACnD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface Task {
|
|
2
|
+
name: string;
|
|
3
|
+
fn: () => Promise<void> | void;
|
|
4
|
+
/** Names of tasks that must complete successfully before this one runs. */
|
|
5
|
+
dependsOn?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface TaskTreeOptions {
|
|
8
|
+
stream?: {
|
|
9
|
+
write(data: string): unknown;
|
|
10
|
+
isTTY?: boolean;
|
|
11
|
+
};
|
|
12
|
+
unicode?: boolean;
|
|
13
|
+
reducedMotion?: boolean;
|
|
14
|
+
/** Cap on concurrently running tasks. Default: run them all. */
|
|
15
|
+
concurrency?: number;
|
|
16
|
+
/** ANSI style applied to the state glyph. */
|
|
17
|
+
style?: (text: string) => string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Runs tasks respecting `dependsOn` edges (a DAG), concurrency-limited, with a
|
|
21
|
+
* live tree view where each task is indented by its dependency depth. Tasks
|
|
22
|
+
* whose dependency failed are skipped (and skipped transitively), so a single
|
|
23
|
+
* failing task never runs things that depend on it.
|
|
24
|
+
*/
|
|
25
|
+
export declare class TaskTree {
|
|
26
|
+
private readonly stream;
|
|
27
|
+
private readonly unicode;
|
|
28
|
+
private readonly style?;
|
|
29
|
+
private readonly live;
|
|
30
|
+
private readonly concurrency;
|
|
31
|
+
private rows;
|
|
32
|
+
private renderedRows;
|
|
33
|
+
constructor(options?: TaskTreeOptions);
|
|
34
|
+
run(tasks: Task[]): Promise<number>;
|
|
35
|
+
/** Validate a task's dependencies and compute its depth (longest dep chain). */
|
|
36
|
+
private computeDepth;
|
|
37
|
+
private renderLine;
|
|
38
|
+
private repaint;
|
|
39
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
function mark(state, unicode, style) {
|
|
2
|
+
let glyph;
|
|
3
|
+
if (state === 'ok')
|
|
4
|
+
glyph = unicode ? '✓' : 'v';
|
|
5
|
+
else if (state === 'failed')
|
|
6
|
+
glyph = unicode ? '✗' : 'x';
|
|
7
|
+
else if (state === 'skipped')
|
|
8
|
+
glyph = unicode ? '⊘' : 's';
|
|
9
|
+
else if (state === 'running')
|
|
10
|
+
glyph = unicode ? '•' : '*';
|
|
11
|
+
else
|
|
12
|
+
glyph = unicode ? '·' : '.';
|
|
13
|
+
return style ? style(glyph) : glyph;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Runs tasks respecting `dependsOn` edges (a DAG), concurrency-limited, with a
|
|
17
|
+
* live tree view where each task is indented by its dependency depth. Tasks
|
|
18
|
+
* whose dependency failed are skipped (and skipped transitively), so a single
|
|
19
|
+
* failing task never runs things that depend on it.
|
|
20
|
+
*/
|
|
21
|
+
export class TaskTree {
|
|
22
|
+
stream;
|
|
23
|
+
unicode;
|
|
24
|
+
style;
|
|
25
|
+
live;
|
|
26
|
+
concurrency;
|
|
27
|
+
rows = [];
|
|
28
|
+
renderedRows = 0;
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.stream = options.stream ?? process.stderr;
|
|
31
|
+
this.unicode = options.unicode ?? true;
|
|
32
|
+
this.style = options.style;
|
|
33
|
+
this.live = this.stream.isTTY === true && (options.reducedMotion ?? false) === false;
|
|
34
|
+
// A cap below 1 would leave every task pending forever.
|
|
35
|
+
this.concurrency = Math.max(1, options.concurrency ?? Number.POSITIVE_INFINITY);
|
|
36
|
+
}
|
|
37
|
+
async run(tasks) {
|
|
38
|
+
const byName = new Map();
|
|
39
|
+
this.rows = [];
|
|
40
|
+
this.renderedRows = 0;
|
|
41
|
+
for (const task of tasks) {
|
|
42
|
+
const rec = { task, state: 'pending', depth: -1 };
|
|
43
|
+
byName.set(task.name, rec);
|
|
44
|
+
this.rows.push(rec);
|
|
45
|
+
}
|
|
46
|
+
// Validate dependencies, detect cycles, and compute each task's depth.
|
|
47
|
+
for (const task of tasks)
|
|
48
|
+
this.computeDepth(task.name, byName, new Set());
|
|
49
|
+
let failures = 0;
|
|
50
|
+
const running = new Set();
|
|
51
|
+
let settled = false;
|
|
52
|
+
let resolveDone;
|
|
53
|
+
const done = new Promise((resolve) => {
|
|
54
|
+
resolveDone = resolve;
|
|
55
|
+
});
|
|
56
|
+
const depsOk = (rec) => (rec.task.dependsOn ?? []).every((d) => byName.get(d).state === 'ok');
|
|
57
|
+
const depsFailed = (rec) => (rec.task.dependsOn ?? []).some((d) => {
|
|
58
|
+
const s = byName.get(d).state;
|
|
59
|
+
return s === 'failed' || s === 'skipped';
|
|
60
|
+
});
|
|
61
|
+
const markSkipped = (name) => {
|
|
62
|
+
const rec = byName.get(name);
|
|
63
|
+
if (rec.state !== 'pending')
|
|
64
|
+
return;
|
|
65
|
+
rec.state = 'skipped';
|
|
66
|
+
rec.error = 'dependency failed';
|
|
67
|
+
this.repaint();
|
|
68
|
+
};
|
|
69
|
+
const start = (name) => {
|
|
70
|
+
const rec = byName.get(name);
|
|
71
|
+
if (rec.state !== 'pending')
|
|
72
|
+
return;
|
|
73
|
+
rec.state = 'running';
|
|
74
|
+
running.add(name);
|
|
75
|
+
this.repaint();
|
|
76
|
+
const startedAt = performance.now();
|
|
77
|
+
Promise.resolve()
|
|
78
|
+
.then(() => rec.task.fn())
|
|
79
|
+
.then(() => {
|
|
80
|
+
rec.state = 'ok';
|
|
81
|
+
rec.ms = Math.max(1, Math.round(performance.now() - startedAt));
|
|
82
|
+
})
|
|
83
|
+
.catch((error) => {
|
|
84
|
+
rec.state = 'failed';
|
|
85
|
+
rec.ms = Math.max(1, Math.round(performance.now() - startedAt));
|
|
86
|
+
rec.error = error instanceof Error ? error.message : String(error);
|
|
87
|
+
failures++;
|
|
88
|
+
})
|
|
89
|
+
.finally(() => {
|
|
90
|
+
running.delete(name);
|
|
91
|
+
this.repaint();
|
|
92
|
+
schedule();
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
const schedule = () => {
|
|
96
|
+
if (settled)
|
|
97
|
+
return;
|
|
98
|
+
// Skip tasks whose dependencies failed, repeating until nothing changes:
|
|
99
|
+
// a skip can unblock the skip of a task that was already visited earlier
|
|
100
|
+
// in this pass (a chain declared in reverse order). A single pass would
|
|
101
|
+
// leave such a task pending with nothing able to start it — and since
|
|
102
|
+
// schedule() is only re-entered from a task's completion, it would hang.
|
|
103
|
+
let skippedAny = true;
|
|
104
|
+
while (skippedAny) {
|
|
105
|
+
skippedAny = false;
|
|
106
|
+
for (const rec of this.rows) {
|
|
107
|
+
if (rec.state === 'pending' && depsFailed(rec)) {
|
|
108
|
+
markSkipped(rec.task.name);
|
|
109
|
+
skippedAny = true;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Start ready tasks up to the concurrency cap.
|
|
114
|
+
for (const rec of this.rows) {
|
|
115
|
+
if (running.size >= this.concurrency)
|
|
116
|
+
break;
|
|
117
|
+
if (rec.state === 'pending' && depsOk(rec))
|
|
118
|
+
start(rec.task.name);
|
|
119
|
+
}
|
|
120
|
+
// Done when nothing is pending or running.
|
|
121
|
+
const outstanding = this.rows.some((r) => r.state === 'pending' || r.state === 'running');
|
|
122
|
+
if (!outstanding) {
|
|
123
|
+
settled = true;
|
|
124
|
+
resolveDone();
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
this.repaint();
|
|
128
|
+
schedule();
|
|
129
|
+
await done;
|
|
130
|
+
return failures;
|
|
131
|
+
}
|
|
132
|
+
/** Validate a task's dependencies and compute its depth (longest dep chain). */
|
|
133
|
+
computeDepth(name, byName, stack) {
|
|
134
|
+
const rec = byName.get(name);
|
|
135
|
+
if (rec === undefined) {
|
|
136
|
+
throw new Error(`[animation] TaskTree "${name}" depends on an unknown task.`);
|
|
137
|
+
}
|
|
138
|
+
if (rec.depth > -1)
|
|
139
|
+
return rec.depth; // already computed.
|
|
140
|
+
if (stack.has(name)) {
|
|
141
|
+
throw new Error('[animation] TaskTree has a dependency cycle.');
|
|
142
|
+
}
|
|
143
|
+
stack.add(name);
|
|
144
|
+
let max = -1;
|
|
145
|
+
for (const dep of rec.task.dependsOn ?? []) {
|
|
146
|
+
max = Math.max(max, this.computeDepth(dep, byName, stack));
|
|
147
|
+
}
|
|
148
|
+
stack.delete(name);
|
|
149
|
+
rec.depth = max + 1;
|
|
150
|
+
return rec.depth;
|
|
151
|
+
}
|
|
152
|
+
renderLine(rec) {
|
|
153
|
+
const indent = ' '.repeat(Math.max(0, rec.depth));
|
|
154
|
+
const glyph = mark(rec.state, this.unicode, this.style);
|
|
155
|
+
const parts = [` ${indent}${glyph} ${rec.task.name}`];
|
|
156
|
+
if (rec.ms !== undefined)
|
|
157
|
+
parts.push(`${rec.ms}ms`);
|
|
158
|
+
if (rec.state === 'failed' && rec.error)
|
|
159
|
+
parts.push(`(${rec.error})`);
|
|
160
|
+
if (rec.state === 'skipped' && rec.error)
|
|
161
|
+
parts.push(`(${rec.error})`);
|
|
162
|
+
return parts.join(' ');
|
|
163
|
+
}
|
|
164
|
+
repaint() {
|
|
165
|
+
if (!this.live) {
|
|
166
|
+
for (const rec of this.rows) {
|
|
167
|
+
if (!rec.emitted && rec.state !== 'pending' && rec.state !== 'running') {
|
|
168
|
+
rec.emitted = true;
|
|
169
|
+
this.stream.write(`${this.renderLine(rec)}\n`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (this.renderedRows > 0) {
|
|
175
|
+
this.stream.write(`\x1b[${this.renderedRows}A\x1b[J`);
|
|
176
|
+
}
|
|
177
|
+
for (const rec of this.rows) {
|
|
178
|
+
this.stream.write(`${this.renderLine(rec)}\n`);
|
|
179
|
+
}
|
|
180
|
+
this.renderedRows = this.rows.length;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=task-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tree.js","sourceRoot":"","sources":["../src/task-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks.js
CHANGED
|
@@ -62,7 +62,7 @@ export class TaskRunner {
|
|
|
62
62
|
for (const line of this.lines) {
|
|
63
63
|
if (!line.emitted && line.state !== 'running') {
|
|
64
64
|
line.emitted = true;
|
|
65
|
-
this.stream.write(this.renderLine(line)
|
|
65
|
+
this.stream.write(`${this.renderLine(line)}\n`);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
return;
|
|
@@ -71,12 +71,22 @@ export class TaskRunner {
|
|
|
71
71
|
this.stream.write(`\x1b[${this.renderedCount}A\x1b[J`);
|
|
72
72
|
}
|
|
73
73
|
for (const line of this.lines) {
|
|
74
|
-
this.stream.write(this.renderLine(line)
|
|
74
|
+
this.stream.write(`${this.renderLine(line)}\n`);
|
|
75
75
|
}
|
|
76
76
|
this.renderedCount = this.lines.length;
|
|
77
77
|
}
|
|
78
78
|
renderLine(line) {
|
|
79
|
-
const mark = line.state === 'running'
|
|
79
|
+
const mark = line.state === 'running'
|
|
80
|
+
? this.unicode
|
|
81
|
+
? '•'
|
|
82
|
+
: '*'
|
|
83
|
+
: line.state === 'ok'
|
|
84
|
+
? this.unicode
|
|
85
|
+
? '✓'
|
|
86
|
+
: 'v'
|
|
87
|
+
: this.unicode
|
|
88
|
+
? '✗'
|
|
89
|
+
: 'x';
|
|
80
90
|
const glyph = this.style ? this.style(mark) : mark;
|
|
81
91
|
const parts = [` ${glyph} ${line.label}`];
|
|
82
92
|
if (line.state !== 'running' && line.ms !== undefined)
|
package/dist/tasks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mudah-cli/animation",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "60fps terminal animation engine: ticker, spinners, progress bars, task trees, and transitions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
|
+
"author": "Mudah Contributors",
|
|
8
|
+
"homepage": "https://github.com/thesimonharms/mudah#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/thesimonharms/mudah.git",
|
|
12
|
+
"directory": "packages/animation"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"cli",
|
|
16
|
+
"terminal",
|
|
17
|
+
"animation",
|
|
18
|
+
"spinner",
|
|
19
|
+
"progress-bar",
|
|
20
|
+
"task-tree",
|
|
21
|
+
"typescript"
|
|
22
|
+
],
|
|
7
23
|
"engines": {
|
|
8
24
|
"node": ">=26"
|
|
9
25
|
},
|
|
@@ -18,7 +34,7 @@
|
|
|
18
34
|
],
|
|
19
35
|
"sideEffects": false,
|
|
20
36
|
"dependencies": {
|
|
21
|
-
"@mudah-cli/terminal": "^0.
|
|
37
|
+
"@mudah-cli/terminal": "^0.9.0"
|
|
22
38
|
},
|
|
23
39
|
"publishConfig": {
|
|
24
40
|
"access": "public"
|