@tutorflow/cli 0.3.1 → 0.4.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/README.md +246 -664
- package/dist/client.d.ts +16 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +76 -16
- package/dist/client.js.map +1 -1
- package/dist/commands/agent.d.ts.map +1 -1
- package/dist/commands/agent.js +38 -23
- package/dist/commands/agent.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +20 -12
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/classroom.d.ts +3 -0
- package/dist/commands/classroom.d.ts.map +1 -0
- package/dist/commands/classroom.js +27 -0
- package/dist/commands/classroom.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -4
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/course.d.ts.map +1 -1
- package/dist/commands/course.js +25 -96
- package/dist/commands/course.js.map +1 -1
- package/dist/commands/credits.d.ts +3 -0
- package/dist/commands/credits.d.ts.map +1 -0
- package/dist/commands/credits.js +39 -0
- package/dist/commands/credits.js.map +1 -0
- package/dist/commands/evaluate.d.ts +3 -0
- package/dist/commands/evaluate.d.ts.map +1 -1
- package/dist/commands/evaluate.js +98 -57
- package/dist/commands/evaluate.js.map +1 -1
- package/dist/commands/interactive.d.ts +13 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +100 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/learner.d.ts +4 -0
- package/dist/commands/learner.d.ts.map +1 -0
- package/dist/commands/learner.js +76 -0
- package/dist/commands/learner.js.map +1 -0
- package/dist/commands/module.d.ts.map +1 -1
- package/dist/commands/module.js +18 -98
- package/dist/commands/module.js.map +1 -1
- package/dist/commands/platform.d.ts.map +1 -1
- package/dist/commands/platform.js +10 -2
- package/dist/commands/platform.js.map +1 -1
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +69 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/slide.d.ts.map +1 -1
- package/dist/commands/slide.js +25 -97
- package/dist/commands/slide.js.map +1 -1
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +38 -106
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/video.d.ts.map +1 -1
- package/dist/commands/video.js +138 -86
- package/dist/commands/video.js.map +1 -1
- package/dist/commands/webhook.d.ts +3 -0
- package/dist/commands/webhook.d.ts.map +1 -0
- package/dist/commands/webhook.js +75 -0
- package/dist/commands/webhook.js.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -16
- package/dist/config.js.map +1 -1
- package/dist/content/context.d.ts +26 -0
- package/dist/content/context.d.ts.map +1 -0
- package/dist/content/context.js +74 -0
- package/dist/content/context.js.map +1 -0
- package/dist/content/resource.d.ts +66 -0
- package/dist/content/resource.d.ts.map +1 -0
- package/dist/content/resource.js +181 -0
- package/dist/content/resource.js.map +1 -0
- package/dist/content/runs.d.ts +51 -0
- package/dist/content/runs.d.ts.map +1 -0
- package/dist/content/runs.js +171 -0
- package/dist/content/runs.js.map +1 -0
- package/dist/index.js +71 -21
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +15 -65
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +4 -4
- package/dist/utils/args.d.ts +15 -0
- package/dist/utils/args.d.ts.map +1 -0
- package/dist/utils/args.js +91 -0
- package/dist/utils/args.js.map +1 -0
- package/dist/utils/keys.d.ts +11 -0
- package/dist/utils/keys.d.ts.map +1 -0
- package/dist/utils/keys.js +29 -0
- package/dist/utils/keys.js.map +1 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +21 -6
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/runtime.d.ts +14 -4
- package/dist/utils/runtime.d.ts.map +1 -1
- package/dist/utils/runtime.js +42 -7
- package/dist/utils/runtime.js.map +1 -1
- package/package.json +4 -3
- package/dist/utils/spinner.d.ts +0 -8
- package/dist/utils/spinner.d.ts.map +0 -1
- package/dist/utils/spinner.js +0 -26
- package/dist/utils/spinner.js.map +0 -1
package/dist/utils/output.js
CHANGED
|
@@ -38,13 +38,23 @@ function printResult(data) {
|
|
|
38
38
|
for (const [k, v] of Object.entries(data)) {
|
|
39
39
|
if (v === undefined || v === null)
|
|
40
40
|
continue;
|
|
41
|
-
process.stdout.write(chalk_1.default.gray(` ${k}: ${v}\n`));
|
|
41
|
+
process.stdout.write(chalk_1.default.gray(` ${k}: ${formatValue(v)}\n`));
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
else {
|
|
45
45
|
process.stdout.write(String(data) + '\n');
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
+
const MAX_TEXT_VALUE_LENGTH = 200;
|
|
49
|
+
/** Nested values print as compact JSON instead of "[object Object]". */
|
|
50
|
+
function formatValue(value) {
|
|
51
|
+
if (typeof value !== 'object')
|
|
52
|
+
return String(value);
|
|
53
|
+
const json = JSON.stringify(value);
|
|
54
|
+
return json.length > MAX_TEXT_VALUE_LENGTH
|
|
55
|
+
? `${json.slice(0, MAX_TEXT_VALUE_LENGTH)}… (use --json for the full value)`
|
|
56
|
+
: json;
|
|
57
|
+
}
|
|
48
58
|
/** Status/progress line. Suppressed in JSON mode to keep stdout clean. */
|
|
49
59
|
function printStatus(message, kind = 'info') {
|
|
50
60
|
if ((0, runtime_1.isJsonMode)())
|
|
@@ -58,23 +68,28 @@ function formatTable(rows) {
|
|
|
58
68
|
const columns = Object.keys(rows[0]);
|
|
59
69
|
const colWidths = {};
|
|
60
70
|
columns.forEach((col) => {
|
|
61
|
-
colWidths[col] = Math.max(col.length, ...rows.map((r) =>
|
|
71
|
+
colWidths[col] = Math.max(col.length, ...rows.map((r) => formatCell(r[col]).length));
|
|
62
72
|
});
|
|
63
|
-
const border = columns.map((c) => '─'.repeat(colWidths[c] + 2)).join(
|
|
73
|
+
const border = (junction) => columns.map((c) => '─'.repeat(colWidths[c] + 2)).join(junction);
|
|
64
74
|
const header = columns
|
|
65
75
|
.map((c) => ` ${c}${' '.repeat(colWidths[c] - c.length)} `)
|
|
66
76
|
.join('│');
|
|
67
77
|
const body = rows
|
|
68
78
|
.map((r) => columns
|
|
69
79
|
.map((c) => {
|
|
70
|
-
const v =
|
|
80
|
+
const v = formatCell(r[c]);
|
|
71
81
|
return ` ${v}${' '.repeat(colWidths[c] - v.length)} `;
|
|
72
82
|
})
|
|
73
83
|
.join('│'))
|
|
74
84
|
.join('\n');
|
|
75
|
-
return `┌${border}┐\n│${header}│\n├${border}┤\n${body
|
|
85
|
+
return `┌${border('┬')}┐\n│${header}│\n├${border('┼')}┤\n${body
|
|
76
86
|
.split('\n')
|
|
77
87
|
.map((r) => `│${r}│`)
|
|
78
|
-
.join('\n')}\n└${border}┘`;
|
|
88
|
+
.join('\n')}\n└${border('┴')}┘`;
|
|
89
|
+
}
|
|
90
|
+
function formatCell(value) {
|
|
91
|
+
if (value === undefined || value === null)
|
|
92
|
+
return '';
|
|
93
|
+
return typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
79
94
|
}
|
|
80
95
|
//# sourceMappingURL=output.js.map
|
package/dist/utils/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":";;;;;AAeA,kCAmBC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/runtime.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Runtime helpers shared by every command.
|
|
3
3
|
*
|
|
4
|
-
* Output mode and
|
|
5
|
-
* subcommands don't need to thread options through.
|
|
6
|
-
* pieces of mutable global state in the CLI.
|
|
4
|
+
* Output mode, debug and the classroom override are set once on the root
|
|
5
|
+
* program and read here so subcommands don't need to thread options through.
|
|
6
|
+
* They are the *only* pieces of mutable global state in the CLI.
|
|
7
7
|
*/
|
|
8
8
|
export declare function setJsonMode(on: boolean): void;
|
|
9
9
|
export declare function setDebugMode(on: boolean): void;
|
|
10
|
+
export declare function setClassroomOverride(classroomId: string | undefined): void;
|
|
11
|
+
export declare function getClassroomOverride(): string | undefined;
|
|
10
12
|
export declare function isJsonMode(): boolean;
|
|
11
13
|
export declare function isDebugMode(): boolean;
|
|
12
14
|
/**
|
|
@@ -14,20 +16,26 @@ export declare function isDebugMode(): boolean;
|
|
|
14
16
|
* AI agent sandboxes, etc. — i.e. anywhere `@clack/prompts` would crash.
|
|
15
17
|
*/
|
|
16
18
|
export declare function isInteractive(): boolean;
|
|
19
|
+
/** Prompts write to stdout, so JSON mode never prompts even on a TTY. */
|
|
20
|
+
export declare function canPrompt(): boolean;
|
|
17
21
|
/**
|
|
18
22
|
* Wrap a command action so:
|
|
19
23
|
* - thrown errors always set exit code 1 (or the error's `exitCode`)
|
|
20
|
-
* - in JSON mode, errors are serialized as { error: { message, code
|
|
24
|
+
* - in JSON mode, errors are serialized as { error: { message, code, ...details } }
|
|
21
25
|
* - in text mode, errors are formatted via `printError`
|
|
22
26
|
* - stack traces are printed only when DEBUG / --debug is on
|
|
23
27
|
*/
|
|
24
28
|
export declare function command<T extends unknown[]>(fn: (...args: T) => Promise<void> | void): (...args: T) => Promise<void>;
|
|
29
|
+
export type CliErrorDetails = Record<string, unknown>;
|
|
25
30
|
export declare class CliError extends Error {
|
|
26
31
|
readonly code: string;
|
|
27
32
|
readonly exitCode: number;
|
|
33
|
+
/** Extra machine-readable fields merged into the JSON error (status, apiCode, hint, …). */
|
|
34
|
+
readonly details?: CliErrorDetails;
|
|
28
35
|
constructor(message: string, opts?: {
|
|
29
36
|
code?: string;
|
|
30
37
|
exitCode?: number;
|
|
38
|
+
details?: CliErrorDetails;
|
|
31
39
|
});
|
|
32
40
|
}
|
|
33
41
|
export declare function printError(error: unknown): void;
|
|
@@ -36,4 +44,6 @@ export declare function printError(error: unknown): void;
|
|
|
36
44
|
* `hint` should describe the flags the caller could use instead.
|
|
37
45
|
*/
|
|
38
46
|
export declare function requireInteractive(hint: string): void;
|
|
47
|
+
/** Progress line for long waits: stderr, text mode only, never in JSON mode. */
|
|
48
|
+
export declare function printProgress(message: string): void;
|
|
39
49
|
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAgB,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE1E;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,UAAU,IAAI,OAAO,CAGpC;AAED,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,yEAAyE;AACzE,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,OAAO,EAAE,EACzC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GACvC,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAS/B;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;gBAGjC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,eAAe,CAAA;KAAO;CAO7E;AA0BD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAqB/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMrD;AAED,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGnD"}
|
package/dist/utils/runtime.js
CHANGED
|
@@ -2,28 +2,39 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Runtime helpers shared by every command.
|
|
4
4
|
*
|
|
5
|
-
* Output mode and
|
|
6
|
-
* subcommands don't need to thread options through.
|
|
7
|
-
* pieces of mutable global state in the CLI.
|
|
5
|
+
* Output mode, debug and the classroom override are set once on the root
|
|
6
|
+
* program and read here so subcommands don't need to thread options through.
|
|
7
|
+
* They are the *only* pieces of mutable global state in the CLI.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.CliError = void 0;
|
|
11
11
|
exports.setJsonMode = setJsonMode;
|
|
12
12
|
exports.setDebugMode = setDebugMode;
|
|
13
|
+
exports.setClassroomOverride = setClassroomOverride;
|
|
14
|
+
exports.getClassroomOverride = getClassroomOverride;
|
|
13
15
|
exports.isJsonMode = isJsonMode;
|
|
14
16
|
exports.isDebugMode = isDebugMode;
|
|
15
17
|
exports.isInteractive = isInteractive;
|
|
18
|
+
exports.canPrompt = canPrompt;
|
|
16
19
|
exports.command = command;
|
|
17
20
|
exports.printError = printError;
|
|
18
21
|
exports.requireInteractive = requireInteractive;
|
|
22
|
+
exports.printProgress = printProgress;
|
|
19
23
|
let jsonMode = false;
|
|
20
24
|
let debugMode = false;
|
|
25
|
+
let classroomOverride;
|
|
21
26
|
function setJsonMode(on) {
|
|
22
27
|
jsonMode = on;
|
|
23
28
|
}
|
|
24
29
|
function setDebugMode(on) {
|
|
25
30
|
debugMode = on;
|
|
26
31
|
}
|
|
32
|
+
function setClassroomOverride(classroomId) {
|
|
33
|
+
classroomOverride = classroomId?.trim() || undefined;
|
|
34
|
+
}
|
|
35
|
+
function getClassroomOverride() {
|
|
36
|
+
return classroomOverride;
|
|
37
|
+
}
|
|
27
38
|
function isJsonMode() {
|
|
28
39
|
// Env var override lets agents set this once globally without a flag.
|
|
29
40
|
return jsonMode || process.env.TUTORFLOW_JSON === '1';
|
|
@@ -38,10 +49,14 @@ function isDebugMode() {
|
|
|
38
49
|
function isInteractive() {
|
|
39
50
|
return Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY);
|
|
40
51
|
}
|
|
52
|
+
/** Prompts write to stdout, so JSON mode never prompts even on a TTY. */
|
|
53
|
+
function canPrompt() {
|
|
54
|
+
return isInteractive() && !isJsonMode();
|
|
55
|
+
}
|
|
41
56
|
/**
|
|
42
57
|
* Wrap a command action so:
|
|
43
58
|
* - thrown errors always set exit code 1 (or the error's `exitCode`)
|
|
44
|
-
* - in JSON mode, errors are serialized as { error: { message, code
|
|
59
|
+
* - in JSON mode, errors are serialized as { error: { message, code, ...details } }
|
|
45
60
|
* - in text mode, errors are formatted via `printError`
|
|
46
61
|
* - stack traces are printed only when DEBUG / --debug is on
|
|
47
62
|
*/
|
|
@@ -61,6 +76,7 @@ class CliError extends Error {
|
|
|
61
76
|
super(message);
|
|
62
77
|
this.code = opts.code ?? 'EGENERIC';
|
|
63
78
|
this.exitCode = opts.exitCode ?? 1;
|
|
79
|
+
this.details = opts.details;
|
|
64
80
|
}
|
|
65
81
|
}
|
|
66
82
|
exports.CliError = CliError;
|
|
@@ -79,15 +95,28 @@ function getErrorMessage(error) {
|
|
|
79
95
|
return error.message;
|
|
80
96
|
return String(error);
|
|
81
97
|
}
|
|
98
|
+
function getErrorDetails(error) {
|
|
99
|
+
if (error instanceof CliError && error.details) {
|
|
100
|
+
return Object.fromEntries(Object.entries(error.details).filter(([, value]) => value !== undefined));
|
|
101
|
+
}
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
82
104
|
function printError(error) {
|
|
83
105
|
const message = getErrorMessage(error);
|
|
84
106
|
const code = getErrorCode(error);
|
|
107
|
+
const details = getErrorDetails(error);
|
|
85
108
|
if (isJsonMode()) {
|
|
86
|
-
process.stderr.write(JSON.stringify({ error: { message, code } }) + '\n');
|
|
109
|
+
process.stderr.write(JSON.stringify({ error: { message, code, ...details } }) + '\n');
|
|
87
110
|
}
|
|
88
111
|
else {
|
|
89
112
|
// chalk is loaded by callers; keep this dependency-free and use ANSI directly.
|
|
90
113
|
process.stderr.write(`\x1b[31m✗ ${message}\x1b[0m\n`);
|
|
114
|
+
if (typeof details.hint === 'string') {
|
|
115
|
+
process.stderr.write(`\x1b[90m ${details.hint}\x1b[0m\n`);
|
|
116
|
+
}
|
|
117
|
+
if (typeof details.requestId === 'string') {
|
|
118
|
+
process.stderr.write(`\x1b[90m request id: ${details.requestId}\x1b[0m\n`);
|
|
119
|
+
}
|
|
91
120
|
}
|
|
92
121
|
if (isDebugMode() && error instanceof Error && error.stack) {
|
|
93
122
|
process.stderr.write(error.stack + '\n');
|
|
@@ -98,8 +127,14 @@ function printError(error) {
|
|
|
98
127
|
* `hint` should describe the flags the caller could use instead.
|
|
99
128
|
*/
|
|
100
129
|
function requireInteractive(hint) {
|
|
101
|
-
if (
|
|
130
|
+
if (canPrompt())
|
|
131
|
+
return;
|
|
132
|
+
throw new CliError(`Required input not provided and no prompt is possible (no terminal, or JSON mode). ${hint}`, { code: 'ENOINTERACTIVE', exitCode: 2 });
|
|
133
|
+
}
|
|
134
|
+
/** Progress line for long waits: stderr, text mode only, never in JSON mode. */
|
|
135
|
+
function printProgress(message) {
|
|
136
|
+
if (isJsonMode())
|
|
102
137
|
return;
|
|
103
|
-
|
|
138
|
+
process.stderr.write(`\x1b[90m${message}\x1b[0m\n`);
|
|
104
139
|
}
|
|
105
140
|
//# sourceMappingURL=runtime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/utils/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutorflow/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "TutorFlow CLI - agent-friendly
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "TutorFlow CLI - agent-friendly command line for the TutorFlow Content API: generate courses, slides, tests, modules, videos, games and simulations, grade learner answers, and manage learners and webhooks. Supports --json output, env-var auth, --wait polling, and non-interactive use.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tutorflow",
|
|
7
7
|
"education",
|
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
"tutor",
|
|
15
15
|
"lesson",
|
|
16
16
|
"evaluation",
|
|
17
|
+
"content-api",
|
|
17
18
|
"cli",
|
|
18
19
|
"agent",
|
|
19
20
|
"automation"
|
|
20
21
|
],
|
|
21
22
|
"bin": {
|
|
22
|
-
"tutorflow": "
|
|
23
|
+
"tutorflow": "dist/index.js"
|
|
23
24
|
},
|
|
24
25
|
"main": "./dist/index.js",
|
|
25
26
|
"types": "./dist/index.d.ts",
|
package/dist/utils/spinner.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { spinner as clackSpinner } from '@clack/prompts';
|
|
2
|
-
export type Spinner = ReturnType<typeof clackSpinner>;
|
|
3
|
-
export declare function createSpinner(): Spinner;
|
|
4
|
-
export declare function startSpinner(message: string): Spinner;
|
|
5
|
-
export declare function stopSpinner(s: Spinner, message: string): void;
|
|
6
|
-
export declare function successSpinner(s: Spinner, message: string): void;
|
|
7
|
-
export declare function errorSpinner(s: Spinner, message: string): void;
|
|
8
|
-
//# sourceMappingURL=spinner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AAEtD,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAIrD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9D"}
|
package/dist/utils/spinner.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSpinner = createSpinner;
|
|
4
|
-
exports.startSpinner = startSpinner;
|
|
5
|
-
exports.stopSpinner = stopSpinner;
|
|
6
|
-
exports.successSpinner = successSpinner;
|
|
7
|
-
exports.errorSpinner = errorSpinner;
|
|
8
|
-
const prompts_1 = require("@clack/prompts");
|
|
9
|
-
function createSpinner() {
|
|
10
|
-
return (0, prompts_1.spinner)();
|
|
11
|
-
}
|
|
12
|
-
function startSpinner(message) {
|
|
13
|
-
const s = (0, prompts_1.spinner)();
|
|
14
|
-
s.start(message);
|
|
15
|
-
return s;
|
|
16
|
-
}
|
|
17
|
-
function stopSpinner(s, message) {
|
|
18
|
-
s.stop(message);
|
|
19
|
-
}
|
|
20
|
-
function successSpinner(s, message) {
|
|
21
|
-
s.stop(`✓ ${message}`);
|
|
22
|
-
}
|
|
23
|
-
function errorSpinner(s, message) {
|
|
24
|
-
s.stop(`✗ ${message}`);
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=spinner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":";;AAIA,sCAEC;AAED,oCAIC;AAED,kCAEC;AAED,wCAEC;AAED,oCAEC;AAxBD,4CAAyD;AAIzD,SAAgB,aAAa;IAC3B,OAAO,IAAA,iBAAY,GAAE,CAAC;AACxB,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,CAAC,GAAG,IAAA,iBAAY,GAAE,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAgB,WAAW,CAAC,CAAU,EAAE,OAAe;IACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClB,CAAC;AAED,SAAgB,cAAc,CAAC,CAAU,EAAE,OAAe;IACxD,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,YAAY,CAAC,CAAU,EAAE,OAAe;IACtD,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AACzB,CAAC"}
|