@doist/twist-cli 1.9.1 → 1.10.1
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/__tests__/channel.test.d.ts +2 -0
- package/dist/__tests__/channel.test.d.ts.map +1 -0
- package/dist/__tests__/channel.test.js +38 -0
- package/dist/__tests__/channel.test.js.map +1 -0
- package/dist/__tests__/inbox.test.d.ts +2 -0
- package/dist/__tests__/inbox.test.d.ts.map +1 -0
- package/dist/__tests__/inbox.test.js +39 -0
- package/dist/__tests__/inbox.test.js.map +1 -0
- package/dist/__tests__/msg.test.d.ts +2 -0
- package/dist/__tests__/msg.test.d.ts.map +1 -0
- package/dist/__tests__/msg.test.js +47 -0
- package/dist/__tests__/msg.test.js.map +1 -0
- package/dist/__tests__/search.test.d.ts +2 -0
- package/dist/__tests__/search.test.d.ts.map +1 -0
- package/dist/__tests__/search.test.js +39 -0
- package/dist/__tests__/search.test.js.map +1 -0
- package/dist/__tests__/spinner.test.js +113 -1
- package/dist/__tests__/spinner.test.js.map +1 -1
- package/dist/__tests__/thread.test.d.ts +2 -0
- package/dist/__tests__/thread.test.d.ts.map +1 -0
- package/dist/__tests__/thread.test.js +41 -0
- package/dist/__tests__/thread.test.js.map +1 -0
- package/dist/__tests__/user.test.d.ts +2 -0
- package/dist/__tests__/user.test.d.ts.map +1 -0
- package/dist/__tests__/user.test.js +33 -0
- package/dist/__tests__/user.test.js.map +1 -0
- package/dist/commands/channel.d.ts.map +1 -1
- package/dist/commands/channel.js +6 -6
- package/dist/commands/channel.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +6 -6
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/msg.d.ts.map +1 -1
- package/dist/commands/msg.js +14 -8
- package/dist/commands/msg.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +6 -6
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/thread.d.ts.map +1 -1
- package/dist/commands/thread.js +8 -2
- package/dist/commands/thread.js.map +1 -1
- package/dist/commands/user.d.ts.map +1 -1
- package/dist/commands/user.js +6 -6
- package/dist/commands/user.js.map +1 -1
- package/dist/index.js +73 -27
- package/dist/index.js.map +1 -1
- package/dist/lib/markdown.d.ts.map +1 -1
- package/dist/lib/markdown.js +5 -1
- package/dist/lib/markdown.js.map +1 -1
- package/dist/lib/skills/content.d.ts +2 -2
- package/dist/lib/skills/content.d.ts.map +1 -1
- package/dist/lib/skills/content.js +2 -0
- package/dist/lib/skills/content.js.map +1 -1
- package/dist/lib/spinner.d.ts +5 -1
- package/dist/lib/spinner.d.ts.map +1 -1
- package/dist/lib/spinner.js +74 -18
- package/dist/lib/spinner.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/spinner.js
CHANGED
|
@@ -1,54 +1,110 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import yoctoSpinner from 'yocto-spinner';
|
|
3
|
+
function shouldDisableSpinner() {
|
|
4
|
+
// Check for environment variables that should disable spinners
|
|
5
|
+
if (process.env.TW_SPINNER === 'false') {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
// Check if we're in CI environment
|
|
9
|
+
if (process.env.CI) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
// Check process arguments for flags that should disable spinner
|
|
13
|
+
const args = process.argv;
|
|
14
|
+
const spinnerDisablingFlags = ['--json', '--ndjson', '--no-spinner', '--progress-jsonl'];
|
|
15
|
+
// Check for both exact matches and prefix matches (to handle --flag=value variants)
|
|
16
|
+
return spinnerDisablingFlags.some((flag) => args.includes(flag) || // exact match
|
|
17
|
+
args.some((arg) => arg.startsWith(`${flag}=`)));
|
|
18
|
+
}
|
|
19
|
+
// ── Early spinner (shown before command module is loaded) ──────────────
|
|
20
|
+
let earlySpinnerInstance = null;
|
|
21
|
+
let originalStdoutWrite = null;
|
|
22
|
+
export function startEarlySpinner() {
|
|
23
|
+
if (!process.stdout.isTTY || shouldDisableSpinner()) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
earlySpinnerInstance = yoctoSpinner({ text: chalk.blue('Loading...') });
|
|
27
|
+
earlySpinnerInstance.start();
|
|
28
|
+
// Intercept stdout.write so the spinner auto-stops before any command output
|
|
29
|
+
originalStdoutWrite = process.stdout.write.bind(process.stdout);
|
|
30
|
+
process.stdout.write = ((...args) => {
|
|
31
|
+
stopEarlySpinner();
|
|
32
|
+
return process.stdout.write(...args);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export function stopEarlySpinner() {
|
|
36
|
+
if (originalStdoutWrite) {
|
|
37
|
+
process.stdout.write = originalStdoutWrite;
|
|
38
|
+
originalStdoutWrite = null;
|
|
39
|
+
}
|
|
40
|
+
if (earlySpinnerInstance) {
|
|
41
|
+
earlySpinnerInstance.stop();
|
|
42
|
+
earlySpinnerInstance = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** For tests only — reset singleton state without stopping */
|
|
46
|
+
export function resetEarlySpinner() {
|
|
47
|
+
earlySpinnerInstance = null;
|
|
48
|
+
originalStdoutWrite = null;
|
|
49
|
+
}
|
|
50
|
+
// ── LoadingSpinner (used by API calls) ─────────────────────────────────
|
|
3
51
|
class LoadingSpinner {
|
|
4
52
|
spinnerInstance = null;
|
|
53
|
+
adopted = false;
|
|
5
54
|
start(options) {
|
|
6
55
|
// Don't show spinner in non-interactive environments, when disabled via options, or when JSON output is expected
|
|
7
|
-
if (!process.stdout.isTTY || options.noSpinner ||
|
|
56
|
+
if (!process.stdout.isTTY || options.noSpinner || shouldDisableSpinner()) {
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
// If an early spinner is running, adopt it instead of creating a new one
|
|
60
|
+
if (earlySpinnerInstance) {
|
|
61
|
+
this.spinnerInstance = earlySpinnerInstance;
|
|
62
|
+
this.spinnerInstance.text = chalk[options.color || 'blue'](options.text);
|
|
63
|
+
earlySpinnerInstance = null;
|
|
64
|
+
this.adopted = true;
|
|
8
65
|
return this;
|
|
9
66
|
}
|
|
10
67
|
const colorFn = chalk[options.color || 'blue'];
|
|
11
68
|
this.spinnerInstance = yoctoSpinner({
|
|
12
69
|
text: colorFn(options.text),
|
|
13
|
-
// yocto-spinner uses dots spinner by default which matches NPM's braille pattern
|
|
14
70
|
});
|
|
15
71
|
this.spinnerInstance.start();
|
|
16
72
|
return this;
|
|
17
73
|
}
|
|
18
74
|
succeed(text) {
|
|
19
75
|
if (this.spinnerInstance) {
|
|
76
|
+
if (this.adopted) {
|
|
77
|
+
// Release back so subsequent API calls can re-adopt
|
|
78
|
+
earlySpinnerInstance = this.spinnerInstance;
|
|
79
|
+
this.spinnerInstance = null;
|
|
80
|
+
this.adopted = false;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
20
83
|
this.spinnerInstance.success(text ? chalk.green(`✓ ${text}`) : undefined);
|
|
21
84
|
this.spinnerInstance = null;
|
|
22
85
|
}
|
|
23
86
|
}
|
|
24
87
|
fail(text) {
|
|
25
88
|
if (this.spinnerInstance) {
|
|
89
|
+
// Errors always stop the spinner for real
|
|
26
90
|
this.spinnerInstance.error(text ? chalk.red(`✗ ${text}`) : undefined);
|
|
27
91
|
this.spinnerInstance = null;
|
|
92
|
+
this.adopted = false;
|
|
28
93
|
}
|
|
29
94
|
}
|
|
30
95
|
stop() {
|
|
31
96
|
if (this.spinnerInstance) {
|
|
97
|
+
if (this.adopted) {
|
|
98
|
+
// Release back so subsequent API calls can re-adopt
|
|
99
|
+
earlySpinnerInstance = this.spinnerInstance;
|
|
100
|
+
this.spinnerInstance = null;
|
|
101
|
+
this.adopted = false;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
32
104
|
this.spinnerInstance.stop();
|
|
33
105
|
this.spinnerInstance = null;
|
|
34
106
|
}
|
|
35
107
|
}
|
|
36
|
-
shouldDisableSpinner() {
|
|
37
|
-
// Check for environment variables that should disable spinners
|
|
38
|
-
if (process.env.TW_SPINNER === 'false') {
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
// Check if we're in CI environment
|
|
42
|
-
if (process.env.CI) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
// Check process arguments for flags that should disable spinner
|
|
46
|
-
const args = process.argv;
|
|
47
|
-
const spinnerDisablingFlags = ['--json', '--ndjson', '--no-spinner', '--progress-jsonl'];
|
|
48
|
-
// Check for both exact matches and prefix matches (to handle --flag=value variants)
|
|
49
|
-
return spinnerDisablingFlags.some((flag) => args.includes(flag) || // exact match
|
|
50
|
-
args.some((arg) => arg.startsWith(`${flag}=`)));
|
|
51
|
-
}
|
|
52
108
|
}
|
|
53
109
|
/**
|
|
54
110
|
* High-level wrapper function for running async operations with a loading spinner.
|
package/dist/lib/spinner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,YAAY,MAAM,eAAe,CAAA;AAQxC,
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
|