@desplega.ai/qa-use 2.8.4 → 2.8.7
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 +21 -0
- package/dist/lib/browser/index.d.ts +0 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +0 -1
- package/dist/lib/browser/index.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/cli/commands/api/index.d.ts +3 -0
- package/dist/src/cli/commands/api/index.d.ts.map +1 -0
- package/dist/src/cli/commands/api/index.js +6 -0
- package/dist/src/cli/commands/api/index.js.map +1 -0
- package/dist/src/cli/commands/api/lib/http.d.ts +18 -0
- package/dist/src/cli/commands/api/lib/http.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/http.js +51 -0
- package/dist/src/cli/commands/api/lib/http.js.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-cache.d.ts +10 -0
- package/dist/src/cli/commands/api/lib/openapi-cache.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-cache.js +41 -0
- package/dist/src/cli/commands/api/lib/openapi-cache.js.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-errors.d.ts +8 -0
- package/dist/src/cli/commands/api/lib/openapi-errors.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-errors.js +20 -0
- package/dist/src/cli/commands/api/lib/openapi-errors.js.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.d.ts +62 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.js +166 -0
- package/dist/src/cli/commands/api/lib/openapi-spec.js.map +1 -0
- package/dist/src/cli/commands/api/lib/output.d.ts +8 -0
- package/dist/src/cli/commands/api/lib/output.d.ts.map +1 -0
- package/dist/src/cli/commands/api/lib/output.js +31 -0
- package/dist/src/cli/commands/api/lib/output.js.map +1 -0
- package/dist/src/cli/commands/api/ls.d.ts +3 -0
- package/dist/src/cli/commands/api/ls.d.ts.map +1 -0
- package/dist/src/cli/commands/api/ls.js +76 -0
- package/dist/src/cli/commands/api/ls.js.map +1 -0
- package/dist/src/cli/commands/api/request.d.ts +11 -0
- package/dist/src/cli/commands/api/request.d.ts.map +1 -0
- package/dist/src/cli/commands/api/request.js +225 -0
- package/dist/src/cli/commands/api/request.js.map +1 -0
- package/dist/src/cli/commands/test/run.d.ts.map +1 -1
- package/dist/src/cli/commands/test/run.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts.map +1 -1
- package/dist/src/cli/commands/update.js +8 -16
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/index.js +10 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/lib/update-check.d.ts +34 -0
- package/dist/src/cli/lib/update-check.d.ts.map +1 -0
- package/dist/src/cli/lib/update-check.js +153 -0
- package/dist/src/cli/lib/update-check.js.map +1 -0
- package/lib/browser/index.ts +0 -2
- package/package.json +2 -2
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update hinting for the qa-use CLI
|
|
3
|
+
*
|
|
4
|
+
* Checks the npm registry for newer versions and shows a hint on startup.
|
|
5
|
+
* Uses ~/.qa-use.json to cache results (24h TTL). The fetch is fire-and-forget
|
|
6
|
+
* so it never blocks CLI startup.
|
|
7
|
+
*/
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { warning } from './output.js';
|
|
12
|
+
// ==========================================
|
|
13
|
+
// Constants
|
|
14
|
+
// ==========================================
|
|
15
|
+
const CONFIG_PATH = join(homedir(), '.qa-use.json');
|
|
16
|
+
const REGISTRY_URL = 'https://registry.npmjs.org/@desplega.ai/qa-use/latest';
|
|
17
|
+
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
18
|
+
const FETCH_TIMEOUT_MS = 3000;
|
|
19
|
+
// ==========================================
|
|
20
|
+
// Cache Operations
|
|
21
|
+
// ==========================================
|
|
22
|
+
function readConfig() {
|
|
23
|
+
if (!existsSync(CONFIG_PATH))
|
|
24
|
+
return {};
|
|
25
|
+
try {
|
|
26
|
+
return JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function writeConfig(config) {
|
|
33
|
+
try {
|
|
34
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Silently ignore write errors (permissions, disk full, etc.)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function readUpdateCache() {
|
|
41
|
+
return readConfig().update_cache;
|
|
42
|
+
}
|
|
43
|
+
function writeUpdateCache(cache) {
|
|
44
|
+
const config = readConfig();
|
|
45
|
+
config.update_cache = cache;
|
|
46
|
+
writeConfig(config);
|
|
47
|
+
}
|
|
48
|
+
function isCacheStale(cache) {
|
|
49
|
+
const checkedAt = new Date(cache.checked_at).getTime();
|
|
50
|
+
return Date.now() - checkedAt > CACHE_TTL_MS;
|
|
51
|
+
}
|
|
52
|
+
// ==========================================
|
|
53
|
+
// Version Comparison
|
|
54
|
+
// ==========================================
|
|
55
|
+
function parseVersion(v) {
|
|
56
|
+
return v.replace(/^v/, '').split('.').map(Number);
|
|
57
|
+
}
|
|
58
|
+
export function isNewerVersion(latest, current) {
|
|
59
|
+
const l = parseVersion(latest);
|
|
60
|
+
const c = parseVersion(current);
|
|
61
|
+
for (let i = 0; i < Math.max(l.length, c.length); i++) {
|
|
62
|
+
const lp = l[i] ?? 0;
|
|
63
|
+
const cp = c[i] ?? 0;
|
|
64
|
+
if (lp > cp)
|
|
65
|
+
return true;
|
|
66
|
+
if (lp < cp)
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
// ==========================================
|
|
72
|
+
// Registry Fetch
|
|
73
|
+
// ==========================================
|
|
74
|
+
export async function fetchLatestVersion() {
|
|
75
|
+
try {
|
|
76
|
+
const controller = new AbortController();
|
|
77
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
78
|
+
const res = await fetch(REGISTRY_URL, { signal: controller.signal });
|
|
79
|
+
clearTimeout(timeout);
|
|
80
|
+
if (!res.ok)
|
|
81
|
+
return null;
|
|
82
|
+
const data = (await res.json());
|
|
83
|
+
return data.version ?? null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// ==========================================
|
|
90
|
+
// Public API
|
|
91
|
+
// ==========================================
|
|
92
|
+
/**
|
|
93
|
+
* Fire-and-forget: fetch latest version from npm and update cache.
|
|
94
|
+
* Does not block — errors are silently swallowed.
|
|
95
|
+
*/
|
|
96
|
+
export function checkForUpdateAsync() {
|
|
97
|
+
const cache = readUpdateCache();
|
|
98
|
+
if (cache && !isCacheStale(cache))
|
|
99
|
+
return;
|
|
100
|
+
fetchLatestVersion()
|
|
101
|
+
.then((version) => {
|
|
102
|
+
if (version) {
|
|
103
|
+
writeUpdateCache({ latest_version: version, checked_at: new Date().toISOString() });
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
.catch(() => {
|
|
107
|
+
// Silently ignore — this is best-effort
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Show an update hint to stderr if the cache indicates a newer version.
|
|
112
|
+
* Synchronous — reads from cache only, no network.
|
|
113
|
+
*/
|
|
114
|
+
export function showUpdateHintIfAvailable(currentVersion) {
|
|
115
|
+
const cache = readUpdateCache();
|
|
116
|
+
if (!cache)
|
|
117
|
+
return; // No cache = first run or never checked → stay silent
|
|
118
|
+
if (isNewerVersion(cache.latest_version, currentVersion)) {
|
|
119
|
+
process.stderr.write(`${warning(`Update available: ${currentVersion} → ${cache.latest_version}`)}\n` +
|
|
120
|
+
` Run ${'\x1b[36m'}qa-use update${'\x1b[0m'} to update\n\n`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Returns the update hint string for help text, or empty string if no update.
|
|
125
|
+
*/
|
|
126
|
+
export function getUpdateHintForHelp(currentVersion) {
|
|
127
|
+
const cache = readUpdateCache();
|
|
128
|
+
if (!cache || !isNewerVersion(cache.latest_version, currentVersion))
|
|
129
|
+
return '';
|
|
130
|
+
return (`\n${warning(`Update available: ${currentVersion} → ${cache.latest_version}`)}\n` +
|
|
131
|
+
` Run ${'qa-use update'} to update`);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Determine if the update check should be skipped.
|
|
135
|
+
*/
|
|
136
|
+
export function shouldSkipCheck(argv) {
|
|
137
|
+
// Env var opt-out
|
|
138
|
+
if (process.env.QA_USE_NO_UPDATE_CHECK === '1')
|
|
139
|
+
return true;
|
|
140
|
+
// CI environment
|
|
141
|
+
if (process.env.CI)
|
|
142
|
+
return true;
|
|
143
|
+
// Non-interactive (not a TTY)
|
|
144
|
+
if (!process.stderr.isTTY)
|
|
145
|
+
return true;
|
|
146
|
+
// Skip for browser commands except "browser create"
|
|
147
|
+
// argv: [node, script, ...args]
|
|
148
|
+
const args = argv.slice(2);
|
|
149
|
+
if (args[0] === 'browser' && args[1] !== 'create')
|
|
150
|
+
return true;
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=update-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../../../src/cli/lib/update-check.ts"],"names":[],"mappings":"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"}
|
package/lib/browser/index.ts
CHANGED
|
@@ -19,7 +19,6 @@ export interface BrowserSession {
|
|
|
19
19
|
|
|
20
20
|
export interface BrowserOptions {
|
|
21
21
|
headless?: boolean;
|
|
22
|
-
devtools?: boolean;
|
|
23
22
|
args?: string[];
|
|
24
23
|
userDataDir?: string;
|
|
25
24
|
isolated?: boolean;
|
|
@@ -51,7 +50,6 @@ export class BrowserManager {
|
|
|
51
50
|
try {
|
|
52
51
|
const browserServer = await chromium.launchServer({
|
|
53
52
|
headless: options.headless ?? true,
|
|
54
|
-
devtools: options.devtools ?? false,
|
|
55
53
|
args: [...defaultArgs, ...(options.args || [])],
|
|
56
54
|
handleSIGINT: false,
|
|
57
55
|
handleSIGTERM: false,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@desplega.ai/qa-use",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.7",
|
|
4
4
|
"packageManager": "bun@^1.3.4",
|
|
5
5
|
"description": "QA automation tool for browser testing with MCP server support",
|
|
6
6
|
"type": "module",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"dotenv": "^16.4.5",
|
|
91
91
|
"express": "^4.21.2",
|
|
92
92
|
"glob": "^13.0.0",
|
|
93
|
-
"playwright": "1.
|
|
93
|
+
"playwright": "1.58.0",
|
|
94
94
|
"ws": "^8.19.0",
|
|
95
95
|
"yaml": "^2.8.2"
|
|
96
96
|
}
|