@timetotest/cli 0.1.3 → 0.1.5
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 +3 -3
- package/dist/bin/ttt.js +6 -2
- package/dist/bin/ttt.js.map +1 -1
- package/dist/package.json +47 -0
- package/dist/src/commands/ask.js +31 -10
- package/dist/src/commands/ask.js.map +1 -1
- package/dist/src/commands/start-test.js +22 -6
- package/dist/src/commands/start-test.js.map +1 -1
- package/dist/src/commands/stream.js +4 -7
- package/dist/src/commands/stream.js.map +1 -1
- package/dist/src/commands/test.js +32 -8
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/lib/config.js +2 -2
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/events.js +67 -0
- package/dist/src/lib/events.js.map +1 -0
- package/dist/src/lib/tui/events.js +338 -0
- package/dist/src/lib/tui/events.js.map +1 -0
- package/dist/src/lib/tui/icons.js +21 -0
- package/dist/src/lib/tui/icons.js.map +1 -0
- package/dist/src/lib/tui/print.js +69 -0
- package/dist/src/lib/tui/print.js.map +1 -0
- package/dist/src/lib/tui/prompt.js +453 -0
- package/dist/src/lib/tui/prompt.js.map +1 -0
- package/dist/src/lib/tui/status.js +13 -0
- package/dist/src/lib/tui/status.js.map +1 -0
- package/dist/src/lib/tui/style.js +11 -0
- package/dist/src/lib/tui/style.js.map +1 -0
- package/dist/src/lib/tui/utils.js +113 -0
- package/dist/src/lib/tui/utils.js.map +1 -0
- package/dist/src/lib/tui.js +7 -508
- package/dist/src/lib/tui.js.map +1 -1
- package/dist/src/lib/update.js +141 -0
- package/dist/src/lib/update.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import ora from "ora";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import https from "node:https";
|
|
6
|
+
import { printHeader } from "./tui.js";
|
|
7
|
+
import packageJson from "../../package.json" with { type: "json" };
|
|
8
|
+
const PACKAGE_NAME = String(packageJson.name || "@timetotest/cli");
|
|
9
|
+
const LOCAL_VERSION = String(packageJson.version || "0.0.0");
|
|
10
|
+
const REGISTRY_URL = `https://registry.npmjs.org/${PACKAGE_NAME}/latest`;
|
|
11
|
+
function compareVersions(a, b) {
|
|
12
|
+
const pa = a.split(".").map(Number);
|
|
13
|
+
const pb = b.split(".").map(Number);
|
|
14
|
+
const len = Math.max(pa.length, pb.length);
|
|
15
|
+
for (let i = 0; i < len; i++) {
|
|
16
|
+
const va = pa[i] ?? 0;
|
|
17
|
+
const vb = pb[i] ?? 0;
|
|
18
|
+
if (Number.isNaN(va) || Number.isNaN(vb))
|
|
19
|
+
continue;
|
|
20
|
+
if (va > vb)
|
|
21
|
+
return 1;
|
|
22
|
+
if (va < vb)
|
|
23
|
+
return -1;
|
|
24
|
+
}
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
27
|
+
function fetchLatestVersion(timeoutMs = 2500) {
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeout = setTimeout(() => {
|
|
31
|
+
controller.abort();
|
|
32
|
+
resolve(null);
|
|
33
|
+
}, timeoutMs);
|
|
34
|
+
const request = https.get(REGISTRY_URL, { signal: controller.signal, headers: { "User-Agent": "ttt-cli-update-check" } }, (res) => {
|
|
35
|
+
if (res.statusCode !== 200) {
|
|
36
|
+
clearTimeout(timeout);
|
|
37
|
+
res.resume();
|
|
38
|
+
resolve(null);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let raw = "";
|
|
42
|
+
res.setEncoding("utf8");
|
|
43
|
+
res.on("data", (chunk) => (raw += chunk));
|
|
44
|
+
res.on("end", () => {
|
|
45
|
+
clearTimeout(timeout);
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
const version = typeof parsed?.version === "string" ? parsed.version : null;
|
|
49
|
+
resolve(version);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
resolve(null);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
request.on("error", () => {
|
|
57
|
+
clearTimeout(timeout);
|
|
58
|
+
resolve(null);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function getNpmCommand() {
|
|
63
|
+
return process.platform === "win32" ? "npm.cmd" : "npm";
|
|
64
|
+
}
|
|
65
|
+
async function runUpgrade() {
|
|
66
|
+
const spinner = ora("Installing latest CLI release").start();
|
|
67
|
+
return new Promise((resolve) => {
|
|
68
|
+
const child = spawn(getNpmCommand(), ["install", "-g", PACKAGE_NAME], {
|
|
69
|
+
stdio: "inherit",
|
|
70
|
+
env: process.env,
|
|
71
|
+
});
|
|
72
|
+
child.on("error", (error) => {
|
|
73
|
+
spinner.fail("Failed to run npm install");
|
|
74
|
+
console.error(chalk.red(error.message));
|
|
75
|
+
resolve(false);
|
|
76
|
+
});
|
|
77
|
+
child.on("exit", (code) => {
|
|
78
|
+
if (code === 0) {
|
|
79
|
+
spinner.succeed("CLI upgraded successfully");
|
|
80
|
+
resolve(true);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
spinner.fail("npm install exited with an error");
|
|
84
|
+
resolve(false);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function shouldSkipUpdatePrompt() {
|
|
90
|
+
if (process.env.TTT_DISABLE_UPDATE_CHECK === "1")
|
|
91
|
+
return true;
|
|
92
|
+
if (process.env.CI)
|
|
93
|
+
return true;
|
|
94
|
+
if (!process.stdout.isTTY || !process.stdin.isTTY)
|
|
95
|
+
return true;
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
export async function promptForUpdateIfAvailable() {
|
|
99
|
+
if (shouldSkipUpdatePrompt())
|
|
100
|
+
return;
|
|
101
|
+
const latest = await fetchLatestVersion();
|
|
102
|
+
if (!latest)
|
|
103
|
+
return;
|
|
104
|
+
if (compareVersions(latest, LOCAL_VERSION) <= 0)
|
|
105
|
+
return;
|
|
106
|
+
printHeader("Update available", [
|
|
107
|
+
`${chalk.gray("Current")} ${chalk.white(LOCAL_VERSION)}`,
|
|
108
|
+
`${chalk.gray("Latest")} ${chalk.green(latest)}`,
|
|
109
|
+
]);
|
|
110
|
+
console.log(chalk.white("A newer version of the Time to Test CLI is available on npm. You can upgrade now to get the latest features."));
|
|
111
|
+
console.log();
|
|
112
|
+
const { action } = await inquirer.prompt([
|
|
113
|
+
{
|
|
114
|
+
type: "list",
|
|
115
|
+
name: "action",
|
|
116
|
+
message: "How would you like to proceed?",
|
|
117
|
+
choices: [
|
|
118
|
+
{ name: "Update now", value: "update" },
|
|
119
|
+
{ name: "Remind me later", value: "remind" },
|
|
120
|
+
{ name: "Skip this version", value: "skip" },
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
if (action !== "update") {
|
|
125
|
+
console.log(chalk.gray(`You can manually update later by running ${chalk.white(`${getNpmCommand()} install -g ${PACKAGE_NAME}`)}`));
|
|
126
|
+
console.log();
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const success = await runUpgrade();
|
|
130
|
+
if (success) {
|
|
131
|
+
console.log();
|
|
132
|
+
console.log(chalk.green("Upgrade complete! Please restart the current command to use the updated CLI."));
|
|
133
|
+
console.log();
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log();
|
|
137
|
+
console.log(chalk.red("Automatic upgrade failed. You can try again manually with the command above."));
|
|
138
|
+
console.log();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/lib/update.ts"],"names":[],"mappings":"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"}
|