@desplega.ai/qa-use 2.17.0 → 2.19.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 +30 -0
- package/dist/lib/api/browser.d.ts.map +1 -1
- package/dist/lib/api/browser.js +6 -1
- package/dist/lib/api/browser.js.map +1 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +5 -1
- package/dist/lib/browser/index.js.map +1 -1
- package/dist/lib/env/force-headless.d.ts +36 -0
- package/dist/lib/env/force-headless.d.ts.map +1 -0
- package/dist/lib/env/force-headless.js +56 -0
- package/dist/lib/env/force-headless.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/src/cli/commands/browser/_detached.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/_detached.js +8 -1
- package/dist/src/cli/commands/browser/_detached.js.map +1 -1
- package/dist/src/cli/commands/browser/create.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/create.js +16 -1
- package/dist/src/cli/commands/browser/create.js.map +1 -1
- package/dist/src/cli/commands/browser/run.d.ts.map +1 -1
- package/dist/src/cli/commands/browser/run.js +9 -0
- package/dist/src/cli/commands/browser/run.js.map +1 -1
- package/dist/src/cli/commands/check/create.d.ts +6 -0
- package/dist/src/cli/commands/check/create.d.ts.map +1 -0
- package/dist/src/cli/commands/check/create.js +47 -0
- package/dist/src/cli/commands/check/create.js.map +1 -0
- package/dist/src/cli/commands/check/delete.d.ts +6 -0
- package/dist/src/cli/commands/check/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/check/delete.js +31 -0
- package/dist/src/cli/commands/check/delete.js.map +1 -0
- package/dist/src/cli/commands/check/index.d.ts +6 -0
- package/dist/src/cli/commands/check/index.d.ts.map +1 -0
- package/dist/src/cli/commands/check/index.js +16 -0
- package/dist/src/cli/commands/check/index.js.map +1 -0
- package/dist/src/cli/commands/check/info.d.ts +11 -0
- package/dist/src/cli/commands/check/info.d.ts.map +1 -0
- package/dist/src/cli/commands/check/info.js +111 -0
- package/dist/src/cli/commands/check/info.js.map +1 -0
- package/dist/src/cli/commands/check/lib.d.ts +71 -0
- package/dist/src/cli/commands/check/lib.d.ts.map +1 -0
- package/dist/src/cli/commands/check/lib.js +295 -0
- package/dist/src/cli/commands/check/lib.js.map +1 -0
- package/dist/src/cli/commands/check/list.d.ts +16 -0
- package/dist/src/cli/commands/check/list.d.ts.map +1 -0
- package/dist/src/cli/commands/check/list.js +81 -0
- package/dist/src/cli/commands/check/list.js.map +1 -0
- package/dist/src/cli/commands/check/update.d.ts +6 -0
- package/dist/src/cli/commands/check/update.d.ts.map +1 -0
- package/dist/src/cli/commands/check/update.js +50 -0
- package/dist/src/cli/commands/check/update.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/create.d.ts +6 -0
- package/dist/src/cli/commands/check-schedule/create.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/create.js +44 -0
- package/dist/src/cli/commands/check-schedule/create.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/delete.d.ts +6 -0
- package/dist/src/cli/commands/check-schedule/delete.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/delete.js +31 -0
- package/dist/src/cli/commands/check-schedule/delete.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/index.d.ts +6 -0
- package/dist/src/cli/commands/check-schedule/index.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/index.js +18 -0
- package/dist/src/cli/commands/check-schedule/index.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/info.d.ts +7 -0
- package/dist/src/cli/commands/check-schedule/info.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/info.js +86 -0
- package/dist/src/cli/commands/check-schedule/info.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/list.d.ts +16 -0
- package/dist/src/cli/commands/check-schedule/list.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/list.js +96 -0
- package/dist/src/cli/commands/check-schedule/list.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/run.d.ts +6 -0
- package/dist/src/cli/commands/check-schedule/run.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/run.js +32 -0
- package/dist/src/cli/commands/check-schedule/run.js.map +1 -0
- package/dist/src/cli/commands/check-schedule/update.d.ts +6 -0
- package/dist/src/cli/commands/check-schedule/update.d.ts.map +1 -0
- package/dist/src/cli/commands/check-schedule/update.js +45 -0
- package/dist/src/cli/commands/check-schedule/update.js.map +1 -0
- package/dist/src/cli/commands/test/run.d.ts.map +1 -1
- package/dist/src/cli/commands/test/run.js +13 -0
- package/dist/src/cli/commands/test/run.js.map +1 -1
- package/dist/src/cli/commands/test/sync.js +3 -3
- package/dist/src/cli/commands/test/sync.js.map +1 -1
- package/dist/src/cli/generated/docs-content.d.ts +1 -1
- package/dist/src/cli/generated/docs-content.d.ts.map +1 -1
- package/dist/src/cli/generated/docs-content.js +232 -0
- package/dist/src/cli/generated/docs-content.js.map +1 -1
- package/dist/src/cli/index.js +11 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/lib/api-helpers.d.ts +4 -3
- package/dist/src/cli/lib/api-helpers.d.ts.map +1 -1
- package/dist/src/cli/lib/api-helpers.js +13 -7
- package/dist/src/cli/lib/api-helpers.js.map +1 -1
- package/dist/src/cli/lib/browser.d.ts.map +1 -1
- package/dist/src/cli/lib/browser.js +5 -2
- package/dist/src/cli/lib/browser.js.map +1 -1
- package/dist/src/cli/lib/config.d.ts.map +1 -1
- package/dist/src/cli/lib/config.js +8 -0
- package/dist/src/cli/lib/config.js.map +1 -1
- package/dist/src/cli/lib/loader.d.ts.map +1 -1
- package/dist/src/cli/lib/loader.js +5 -0
- package/dist/src/cli/lib/loader.js.map +1 -1
- package/dist/src/cli/lib/test-vars.d.ts +1 -1
- package/dist/src/cli/lib/test-vars.d.ts.map +1 -1
- package/dist/src/cli/lib/test-vars.js +1 -0
- package/dist/src/cli/lib/test-vars.js.map +1 -1
- package/dist/src/types/test-definition.d.ts +8 -6
- package/dist/src/types/test-definition.d.ts.map +1 -1
- package/dist/src/types/test-definition.js +3 -3
- package/lib/api/browser.ts +9 -1
- package/lib/browser/index.ts +9 -1
- package/lib/env/force-headless.test.ts +83 -0
- package/lib/env/force-headless.ts +61 -0
- package/package.json +1 -1
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { parseResourceInput } from '../../lib/api-helpers.js';
|
|
3
|
+
import { info, success } from '../../lib/output.js';
|
|
4
|
+
export const CHECK_RETRY_STRATEGIES = ['none', 'simple', 'exponential'];
|
|
5
|
+
export const CHECK_TYPES = ['api', 'script'];
|
|
6
|
+
export const CHECK_SCHEDULE_FAILURE_STRATEGIES = [
|
|
7
|
+
'stop_on_failure',
|
|
8
|
+
'continue_on_failure',
|
|
9
|
+
];
|
|
10
|
+
export function collectValues(value, previous) {
|
|
11
|
+
previous.push(value);
|
|
12
|
+
return previous;
|
|
13
|
+
}
|
|
14
|
+
function isPlainObject(value) {
|
|
15
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
function parseJsonValue(rawValue) {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(rawValue);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return rawValue;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function parseIntegerOption(name, value) {
|
|
26
|
+
if (!/^-?\d+$/.test(value)) {
|
|
27
|
+
throw new Error(`${name} must be an integer`);
|
|
28
|
+
}
|
|
29
|
+
const parsed = Number.parseInt(value, 10);
|
|
30
|
+
if (!Number.isSafeInteger(parsed)) {
|
|
31
|
+
throw new Error(`${name} must be a safe integer`);
|
|
32
|
+
}
|
|
33
|
+
return parsed;
|
|
34
|
+
}
|
|
35
|
+
function parseNumberOption(name, value) {
|
|
36
|
+
const parsed = Number(value);
|
|
37
|
+
if (!Number.isFinite(parsed)) {
|
|
38
|
+
throw new Error(`${name} must be a number`);
|
|
39
|
+
}
|
|
40
|
+
return parsed;
|
|
41
|
+
}
|
|
42
|
+
function requireNonNegative(name, value) {
|
|
43
|
+
if (value < 0) {
|
|
44
|
+
throw new Error(`${name} must be greater than or equal to 0`);
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function requirePositive(name, value) {
|
|
49
|
+
if (value <= 0) {
|
|
50
|
+
throw new Error(`${name} must be greater than 0`);
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
export async function readJsonObjectFile(path, label) {
|
|
55
|
+
const raw = await fs.readFile(path, 'utf-8');
|
|
56
|
+
try {
|
|
57
|
+
const parsed = JSON.parse(raw);
|
|
58
|
+
if (isPlainObject(parsed)) {
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`${label} file must contain a JSON object, got ${typeof parsed}`);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
if (err instanceof SyntaxError) {
|
|
65
|
+
throw new Error(`Failed to parse ${label} JSON file: ${path}`);
|
|
66
|
+
}
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function parseCheckVariables(entries) {
|
|
71
|
+
return (entries ?? []).map((entry) => {
|
|
72
|
+
const idx = entry.indexOf('=');
|
|
73
|
+
if (idx <= 0) {
|
|
74
|
+
throw new Error(`Invalid variable \`${entry}\`. Expected format key=value`);
|
|
75
|
+
}
|
|
76
|
+
const key = entry.slice(0, idx).trim();
|
|
77
|
+
const rawValue = entry.slice(idx + 1).trim();
|
|
78
|
+
const value = parseJsonValue(rawValue);
|
|
79
|
+
if (!key) {
|
|
80
|
+
throw new Error(`Invalid variable \`${entry}\`. Variable key cannot be empty`);
|
|
81
|
+
}
|
|
82
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
83
|
+
throw new Error(`Invalid variable \`${entry}\`. Variable value must be a string or number`);
|
|
84
|
+
}
|
|
85
|
+
return { key, value };
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
export function parseOutputCaptures(entries) {
|
|
89
|
+
return (entries ?? []).map((entry) => {
|
|
90
|
+
const idx = entry.indexOf('=');
|
|
91
|
+
if (idx <= 0) {
|
|
92
|
+
throw new Error(`Invalid capture \`${entry}\`. Expected format name=json_path`);
|
|
93
|
+
}
|
|
94
|
+
const name = entry.slice(0, idx).trim();
|
|
95
|
+
const jsonPath = entry.slice(idx + 1).trim();
|
|
96
|
+
if (!name) {
|
|
97
|
+
throw new Error(`Invalid capture \`${entry}\`. Capture name cannot be empty`);
|
|
98
|
+
}
|
|
99
|
+
if (!jsonPath) {
|
|
100
|
+
throw new Error(`Invalid capture \`${entry}\`. Capture json_path cannot be empty`);
|
|
101
|
+
}
|
|
102
|
+
return { name, json_path: jsonPath };
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
export function validateCheckRetryStrategy(value) {
|
|
106
|
+
if (!CHECK_RETRY_STRATEGIES.includes(value)) {
|
|
107
|
+
throw new Error(`Invalid retry strategy \`${value}\`. Expected one of: ${CHECK_RETRY_STRATEGIES.join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
return value;
|
|
110
|
+
}
|
|
111
|
+
export function validateCheckType(value) {
|
|
112
|
+
if (!CHECK_TYPES.includes(value)) {
|
|
113
|
+
throw new Error(`Invalid check type \`${value}\`. Expected one of: ${CHECK_TYPES.join(', ')}`);
|
|
114
|
+
}
|
|
115
|
+
return value;
|
|
116
|
+
}
|
|
117
|
+
export function validateCheckScheduleFailureStrategy(value) {
|
|
118
|
+
if (!CHECK_SCHEDULE_FAILURE_STRATEGIES.includes(value)) {
|
|
119
|
+
throw new Error(`Invalid failure strategy \`${value}\`. Expected one of: ${CHECK_SCHEDULE_FAILURE_STRATEGIES.join(', ')}`);
|
|
120
|
+
}
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
export function parseJsonObjectOption(name, rawValue) {
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(rawValue);
|
|
126
|
+
if (isPlainObject(parsed)) {
|
|
127
|
+
return parsed;
|
|
128
|
+
}
|
|
129
|
+
throw new Error(`${name} must be a JSON object`);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (err instanceof SyntaxError) {
|
|
133
|
+
throw new Error(`Failed to parse ${name} as JSON`);
|
|
134
|
+
}
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export async function buildCheckInputBody(options) {
|
|
139
|
+
const body = await parseResourceInput(options);
|
|
140
|
+
if (options.name !== undefined)
|
|
141
|
+
body.name = options.name;
|
|
142
|
+
if (options.description !== undefined)
|
|
143
|
+
body.description = options.description;
|
|
144
|
+
if (options.appConfig !== undefined)
|
|
145
|
+
body.app_config_id = options.appConfig;
|
|
146
|
+
if (options.type !== undefined)
|
|
147
|
+
body.check_type = validateCheckType(options.type);
|
|
148
|
+
if (options.config !== undefined)
|
|
149
|
+
body.config = await readJsonObjectFile(options.config, 'config');
|
|
150
|
+
if (options.validation !== undefined) {
|
|
151
|
+
body.validation = await readJsonObjectFile(options.validation, 'validation');
|
|
152
|
+
}
|
|
153
|
+
if (options.var && options.var.length > 0)
|
|
154
|
+
body.variables = parseCheckVariables(options.var);
|
|
155
|
+
if (options.dependsOn && options.dependsOn.length > 0) {
|
|
156
|
+
body.check_dependency_ids = options.dependsOn;
|
|
157
|
+
}
|
|
158
|
+
if (options.alias !== undefined)
|
|
159
|
+
body.alias = options.alias;
|
|
160
|
+
if (options.capture && options.capture.length > 0) {
|
|
161
|
+
body.output_captures = parseOutputCaptures(options.capture);
|
|
162
|
+
}
|
|
163
|
+
if (options.retryStrategy !== undefined) {
|
|
164
|
+
body.retry_strategy = validateCheckRetryStrategy(options.retryStrategy);
|
|
165
|
+
}
|
|
166
|
+
if (options.maxRetries !== undefined) {
|
|
167
|
+
body.max_retries = requireNonNegative('--max-retries', parseIntegerOption('--max-retries', options.maxRetries));
|
|
168
|
+
}
|
|
169
|
+
if (options.retryDelaySeconds !== undefined) {
|
|
170
|
+
body.retry_delay_seconds = requireNonNegative('--retry-delay-seconds', parseNumberOption('--retry-delay-seconds', options.retryDelaySeconds));
|
|
171
|
+
}
|
|
172
|
+
if (options.backoffMultiplier !== undefined) {
|
|
173
|
+
body.backoff_multiplier = requirePositive('--backoff-multiplier', parseNumberOption('--backoff-multiplier', options.backoffMultiplier));
|
|
174
|
+
}
|
|
175
|
+
if (options.timeoutMs !== undefined) {
|
|
176
|
+
body.timeout_ms = requirePositive('--timeout-ms', parseIntegerOption('--timeout-ms', options.timeoutMs));
|
|
177
|
+
}
|
|
178
|
+
return body;
|
|
179
|
+
}
|
|
180
|
+
export function validateCheckCreateBody(body) {
|
|
181
|
+
const missing = [];
|
|
182
|
+
if (!body.name)
|
|
183
|
+
missing.push('name');
|
|
184
|
+
if (!body.app_config_id)
|
|
185
|
+
missing.push('app_config_id');
|
|
186
|
+
if (!body.config)
|
|
187
|
+
missing.push('config');
|
|
188
|
+
if (missing.length > 0) {
|
|
189
|
+
throw new Error(`Missing required field${missing.length === 1 ? '' : 's'}: ${missing.join(', ')}`);
|
|
190
|
+
}
|
|
191
|
+
if (!isPlainObject(body.config)) {
|
|
192
|
+
throw new Error('config must be a JSON object');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
export function validateCheckUpdateBody(body) {
|
|
196
|
+
if (Object.keys(body).length === 0) {
|
|
197
|
+
throw new Error('No fields provided');
|
|
198
|
+
}
|
|
199
|
+
if (body.config !== undefined && body.config !== null && !isPlainObject(body.config)) {
|
|
200
|
+
throw new Error('config must be a JSON object');
|
|
201
|
+
}
|
|
202
|
+
if (body.validation !== undefined &&
|
|
203
|
+
body.validation !== null &&
|
|
204
|
+
!isPlainObject(body.validation)) {
|
|
205
|
+
throw new Error('validation must be a JSON object');
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
export async function buildCheckScheduleInputBody(options) {
|
|
209
|
+
const body = await parseResourceInput(options);
|
|
210
|
+
if (options.name !== undefined)
|
|
211
|
+
body.name = options.name;
|
|
212
|
+
if (options.description !== undefined)
|
|
213
|
+
body.description = options.description;
|
|
214
|
+
if (options.appConfig !== undefined)
|
|
215
|
+
body.app_config_id = options.appConfig;
|
|
216
|
+
if (options.check && options.check.length > 0)
|
|
217
|
+
body.check_ids = options.check;
|
|
218
|
+
if (options.cron !== undefined)
|
|
219
|
+
body.cron_expression = options.cron;
|
|
220
|
+
if (options.timezone !== undefined)
|
|
221
|
+
body.timezone = options.timezone;
|
|
222
|
+
if (options.enabled && options.disabled) {
|
|
223
|
+
throw new Error('--enabled and --disabled cannot be used together');
|
|
224
|
+
}
|
|
225
|
+
if (options.enabled)
|
|
226
|
+
body.enabled = true;
|
|
227
|
+
if (options.disabled)
|
|
228
|
+
body.enabled = false;
|
|
229
|
+
if (options.failureStrategy !== undefined) {
|
|
230
|
+
body.failure_strategy = validateCheckScheduleFailureStrategy(options.failureStrategy);
|
|
231
|
+
}
|
|
232
|
+
if (options.dependencyCondition !== undefined) {
|
|
233
|
+
body.check_dependency_graph_conditions = parseJsonObjectOption('--dependency-condition', options.dependencyCondition);
|
|
234
|
+
}
|
|
235
|
+
return body;
|
|
236
|
+
}
|
|
237
|
+
export function validateCheckScheduleCreateBody(body) {
|
|
238
|
+
const missing = [];
|
|
239
|
+
if (!body.name)
|
|
240
|
+
missing.push('name');
|
|
241
|
+
if (!body.app_config_id)
|
|
242
|
+
missing.push('app_config_id');
|
|
243
|
+
if (!body.cron_expression)
|
|
244
|
+
missing.push('cron_expression');
|
|
245
|
+
if (missing.length > 0) {
|
|
246
|
+
throw new Error(`Missing required field${missing.length === 1 ? '' : 's'}: ${missing.join(', ')}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
export function validateCheckScheduleUpdateBody(body) {
|
|
250
|
+
if (Object.keys(body).length === 0) {
|
|
251
|
+
throw new Error('No fields provided');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export function buildCheckScheduleRunBody(scheduleId, options) {
|
|
255
|
+
return {
|
|
256
|
+
schedule_id: scheduleId,
|
|
257
|
+
variables: parseCheckVariables(options.var),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function firstStringLikeValue(source, keys) {
|
|
261
|
+
for (const key of keys) {
|
|
262
|
+
const value = source[key];
|
|
263
|
+
if (typeof value === 'string' && value.length > 0)
|
|
264
|
+
return value;
|
|
265
|
+
if (typeof value === 'number')
|
|
266
|
+
return String(value);
|
|
267
|
+
}
|
|
268
|
+
return undefined;
|
|
269
|
+
}
|
|
270
|
+
export function getCheckScheduleRunId(response) {
|
|
271
|
+
return firstStringLikeValue(response, [
|
|
272
|
+
'check_schedule_run_id',
|
|
273
|
+
'schedule_run_id',
|
|
274
|
+
'run_id',
|
|
275
|
+
'id',
|
|
276
|
+
]);
|
|
277
|
+
}
|
|
278
|
+
export function getCheckScheduleRunStatus(response) {
|
|
279
|
+
return firstStringLikeValue(response, ['run_status', 'status']);
|
|
280
|
+
}
|
|
281
|
+
export function formatCheckScheduleRunResponse(response) {
|
|
282
|
+
const runId = getCheckScheduleRunId(response);
|
|
283
|
+
const status = getCheckScheduleRunStatus(response);
|
|
284
|
+
const lines = [
|
|
285
|
+
runId
|
|
286
|
+
? success(`Check schedule run started (ID: ${runId})`)
|
|
287
|
+
: success('Check schedule run started'),
|
|
288
|
+
];
|
|
289
|
+
if (status) {
|
|
290
|
+
lines.push(` Status: ${status}`);
|
|
291
|
+
}
|
|
292
|
+
lines.push(info('Use --json to inspect the raw untyped run response.'));
|
|
293
|
+
return lines.join('\n');
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check list - List remote API checks
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { type Column } from '../../lib/table.js';
|
|
6
|
+
export interface CheckListOptions {
|
|
7
|
+
appConfig?: string;
|
|
8
|
+
q?: string;
|
|
9
|
+
limit?: string;
|
|
10
|
+
offset?: string;
|
|
11
|
+
json?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function buildCheckListQuery(options: CheckListOptions): Record<string, string>;
|
|
14
|
+
export declare function createCheckListColumns(): Column[];
|
|
15
|
+
export declare const listCommand: Command;
|
|
16
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/check/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EACL,KAAK,MAAM,EAKZ,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKrF;AAED,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAkCjD;AAED,eAAO,MAAM,WAAW,SA8BpB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check list - List remote API checks
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { apiCall, paginationQuery, requireApiKey } from '../../lib/api-helpers.js';
|
|
6
|
+
import { loadConfig } from '../../lib/config.js';
|
|
7
|
+
import { error, formatError, warning } from '../../lib/output.js';
|
|
8
|
+
import { formatStatus, formatTimestamp, printTable, truncate, } from '../../lib/table.js';
|
|
9
|
+
export function buildCheckListQuery(options) {
|
|
10
|
+
const query = paginationQuery(options);
|
|
11
|
+
if (options.appConfig)
|
|
12
|
+
query.app_config_id = options.appConfig;
|
|
13
|
+
if (options.q)
|
|
14
|
+
query.q = options.q;
|
|
15
|
+
return query;
|
|
16
|
+
}
|
|
17
|
+
export function createCheckListColumns() {
|
|
18
|
+
return [
|
|
19
|
+
{ key: 'id', header: 'ID', width: 36 },
|
|
20
|
+
{
|
|
21
|
+
key: 'name',
|
|
22
|
+
header: 'NAME',
|
|
23
|
+
width: 30,
|
|
24
|
+
format: (v) => truncate(String(v ?? '-'), 30),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'check_type',
|
|
28
|
+
header: 'TYPE',
|
|
29
|
+
width: 12,
|
|
30
|
+
format: (v) => String(v ?? '-'),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
key: 'app_config_id',
|
|
34
|
+
header: 'APP_CONFIG',
|
|
35
|
+
width: 36,
|
|
36
|
+
format: (v) => String(v ?? '-'),
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
key: 'status',
|
|
40
|
+
header: 'STATUS',
|
|
41
|
+
width: 11,
|
|
42
|
+
format: (v, row) => formatStatus(String(v ?? row.run_status ?? '-')),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
key: 'updated_at',
|
|
46
|
+
header: 'UPDATED',
|
|
47
|
+
width: 19,
|
|
48
|
+
format: (v, row) => formatTimestamp(String(v ?? row.created_at ?? '')),
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
export const listCommand = new Command('list')
|
|
53
|
+
.description('List remote API checks')
|
|
54
|
+
.option('--app-config <id>', 'Filter by app_config_id')
|
|
55
|
+
.option('--q <query>', 'Search checks')
|
|
56
|
+
.option('--limit <n>', 'Limit results (default: 20)', '20')
|
|
57
|
+
.option('--offset <n>', 'Skip N results', '0')
|
|
58
|
+
.option('--json', 'Output as JSON')
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
try {
|
|
61
|
+
const config = await loadConfig();
|
|
62
|
+
requireApiKey(config);
|
|
63
|
+
const checks = (await apiCall(config, 'GET', '/api/v1/checks', {
|
|
64
|
+
query: buildCheckListQuery(options),
|
|
65
|
+
}));
|
|
66
|
+
const limit = Number.parseInt(options.limit ?? '20', 10);
|
|
67
|
+
const offset = Number.parseInt(options.offset ?? '0', 10);
|
|
68
|
+
printTable(createCheckListColumns(), checks, {
|
|
69
|
+
json: options.json,
|
|
70
|
+
title: `Checks (${checks.length} result${checks.length === 1 ? '' : 's'})`,
|
|
71
|
+
emptyMessage: warning('No checks found'),
|
|
72
|
+
limit,
|
|
73
|
+
offset,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
console.log(error(`Failed to list checks: ${formatError(err)}`));
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/check/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,aAAa,SAgDtB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check update - Update a remote API check
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { apiCall, collectFields, requireApiKey } from '../../lib/api-helpers.js';
|
|
6
|
+
import { loadConfig } from '../../lib/config.js';
|
|
7
|
+
import { error, formatError, success } from '../../lib/output.js';
|
|
8
|
+
import { buildCheckInputBody, collectValues, validateCheckUpdateBody, } from './lib.js';
|
|
9
|
+
export const updateCommand = new Command('update')
|
|
10
|
+
.description('Update a remote API check')
|
|
11
|
+
.argument('<check-id>', 'Check ID (UUID)')
|
|
12
|
+
.option('--name <name>', 'Check name')
|
|
13
|
+
.option('--description <text>', 'Check description')
|
|
14
|
+
.option('--app-config <id>', 'App config ID')
|
|
15
|
+
.option('--type <api|script>', 'Check type')
|
|
16
|
+
.option('--config <file>', 'JSON object file for check config')
|
|
17
|
+
.option('--validation <file>', 'JSON object file for validation rules')
|
|
18
|
+
.option('--input <file|->', 'JSON object with check fields, or - to read from stdin')
|
|
19
|
+
.option('-F, --field <key=value>', 'Set raw API field (repeatable)', collectFields, [])
|
|
20
|
+
.option('--depends-on <id>', 'Check dependency ID (repeatable)', collectValues, [])
|
|
21
|
+
.option('--alias <name>', 'Alias exposed to downstream checks')
|
|
22
|
+
.option('--capture <name=json_path>', 'Output capture to expose downstream (repeatable)', collectValues, [])
|
|
23
|
+
.option('--var <key=value>', 'Check variable (repeatable)', collectValues, [])
|
|
24
|
+
.option('--retry-strategy <none|simple|exponential>', 'Retry strategy')
|
|
25
|
+
.option('--max-retries <n>', 'Maximum retry attempts')
|
|
26
|
+
.option('--retry-delay-seconds <seconds>', 'Delay between retries')
|
|
27
|
+
.option('--backoff-multiplier <n>', 'Exponential retry backoff multiplier')
|
|
28
|
+
.option('--timeout-ms <ms>', 'Check timeout in milliseconds')
|
|
29
|
+
.option('--json', 'Output updated check as JSON')
|
|
30
|
+
.action(async (checkId, options) => {
|
|
31
|
+
try {
|
|
32
|
+
const config = await loadConfig();
|
|
33
|
+
requireApiKey(config);
|
|
34
|
+
const body = await buildCheckInputBody(options);
|
|
35
|
+
validateCheckUpdateBody(body);
|
|
36
|
+
const result = (await apiCall(config, 'PATCH', `/api/v1/checks/${checkId}`, {
|
|
37
|
+
body,
|
|
38
|
+
}));
|
|
39
|
+
if (options.json) {
|
|
40
|
+
console.log(JSON.stringify(result, null, 2));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log(success(`Check ${checkId} updated`));
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
console.log(error(`Failed to update check: ${formatError(err)}`));
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check/update.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,mBAAmB,EAEnB,aAAa,EACb,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAMlB,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,2BAA2B,CAAC;KACxC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;KACzC,MAAM,CAAC,eAAe,EAAE,YAAY,CAAC;KACrC,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,CAAC;KACnD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,qBAAqB,EAAE,YAAY,CAAC;KAC3C,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,kBAAkB,EAAE,wDAAwD,CAAC;KACpF,MAAM,CAAC,yBAAyB,EAAE,gCAAgC,EAAE,aAAa,EAAE,EAAE,CAAC;KACtF,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,EAAE,aAAa,EAAE,EAAE,CAAC;KAClF,MAAM,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;KAC9D,MAAM,CACL,4BAA4B,EAC5B,kDAAkD,EAClD,aAAa,EACb,EAAE,CACH;KACA,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,EAAE,aAAa,EAAE,EAAE,CAAC;KAC7E,MAAM,CAAC,4CAA4C,EAAE,gBAAgB,CAAC;KACtE,MAAM,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;KACrD,MAAM,CAAC,iCAAiC,EAAE,uBAAuB,CAAC;KAClE,MAAM,CAAC,0BAA0B,EAAE,sCAAsC,CAAC;KAC1E,MAAM,CAAC,mBAAmB,EAAE,+BAA+B,CAAC;KAC5D,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;KAChD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,OAA2B,EAAE,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAChD,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,OAAO,EAAE,EAAE;YAC1E,IAAI;SACL,CAAC,CAA4B,CAAC;QAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,OAAO,UAAU,CAAC,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,aAAa,SAwCtB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check-schedule create - Create a remote check schedule
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { apiCall, collectFields, requireApiKey } from '../../lib/api-helpers.js';
|
|
6
|
+
import { loadConfig } from '../../lib/config.js';
|
|
7
|
+
import { error, formatError, success } from '../../lib/output.js';
|
|
8
|
+
import { buildCheckScheduleInputBody, collectValues, validateCheckScheduleCreateBody, } from '../check/lib.js';
|
|
9
|
+
export const createCommand = new Command('create')
|
|
10
|
+
.description('Create a remote check schedule')
|
|
11
|
+
.option('--name <name>', 'Schedule name (required unless supplied by --input or -F)')
|
|
12
|
+
.option('--description <text>', 'Schedule description')
|
|
13
|
+
.option('--app-config <id>', 'App config ID (required unless supplied by --input or -F)')
|
|
14
|
+
.option('--check <id>', 'Check ID included in the schedule (repeatable)', collectValues, [])
|
|
15
|
+
.option('--cron <expr>', 'Cron expression (required unless supplied by --input or -F)')
|
|
16
|
+
.option('--timezone <tz>', 'Schedule timezone (display defaults to UTC when omitted)')
|
|
17
|
+
.option('--enabled', 'Create the schedule enabled')
|
|
18
|
+
.option('--disabled', 'Create the schedule disabled')
|
|
19
|
+
.option('--failure-strategy <stop_on_failure|continue_on_failure>', 'Failure strategy for the ordered check chain')
|
|
20
|
+
.option('--dependency-condition <json>', 'JSON object for check_dependency_graph_conditions')
|
|
21
|
+
.option('--input <file|->', 'JSON object with schedule fields, or - to read from stdin')
|
|
22
|
+
.option('-F, --field <key=value>', 'Set raw API field (repeatable)', collectFields, [])
|
|
23
|
+
.option('--json', 'Output created check schedule as JSON')
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
try {
|
|
26
|
+
const config = await loadConfig();
|
|
27
|
+
requireApiKey(config);
|
|
28
|
+
const body = await buildCheckScheduleInputBody(options);
|
|
29
|
+
validateCheckScheduleCreateBody(body);
|
|
30
|
+
const result = (await apiCall(config, 'POST', '/api/v1/check-schedules', {
|
|
31
|
+
body,
|
|
32
|
+
}));
|
|
33
|
+
if (options.json) {
|
|
34
|
+
console.log(JSON.stringify(result, null, 2));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log(success(`Check schedule created (ID: ${String(result.id ?? '-')})`));
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.log(error(`Failed to create check schedule: ${formatError(err)}`));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,2BAA2B,EAE3B,aAAa,EACb,+BAA+B,GAChC,MAAM,iBAAiB,CAAC;AAMzB,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,eAAe,EAAE,2DAA2D,CAAC;KACpF,MAAM,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;KACtD,MAAM,CAAC,mBAAmB,EAAE,2DAA2D,CAAC;KACxF,MAAM,CAAC,cAAc,EAAE,gDAAgD,EAAE,aAAa,EAAE,EAAE,CAAC;KAC3F,MAAM,CAAC,eAAe,EAAE,6DAA6D,CAAC;KACtF,MAAM,CAAC,iBAAiB,EAAE,0DAA0D,CAAC;KACrF,MAAM,CAAC,WAAW,EAAE,6BAA6B,CAAC;KAClD,MAAM,CAAC,YAAY,EAAE,8BAA8B,CAAC;KACpD,MAAM,CACL,0DAA0D,EAC1D,8CAA8C,CAC/C;KACA,MAAM,CAAC,+BAA+B,EAAE,mDAAmD,CAAC;KAC5F,MAAM,CAAC,kBAAkB,EAAE,2DAA2D,CAAC;KACvF,MAAM,CAAC,yBAAyB,EAAE,gCAAgC,EAAE,aAAa,EAAE,EAAE,CAAC;KACtF,MAAM,CAAC,QAAQ,EAAE,uCAAuC,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,OAAmC,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,MAAM,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACxD,+BAA+B,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE;YACvE,IAAI;SACL,CAAC,CAA4B,CAAC;QAE/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,+BAA+B,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAuBtB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check-schedule delete - Delete a remote check schedule
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { apiCall, confirmAction, requireApiKey } from '../../lib/api-helpers.js';
|
|
6
|
+
import { loadConfig } from '../../lib/config.js';
|
|
7
|
+
import { error, formatError, success } from '../../lib/output.js';
|
|
8
|
+
export const deleteCommand = new Command('delete')
|
|
9
|
+
.description('Delete a remote check schedule')
|
|
10
|
+
.argument('<schedule-id>', 'Check schedule ID (UUID)')
|
|
11
|
+
.option('--force', 'Skip confirmation prompt')
|
|
12
|
+
.action(async (scheduleId, options) => {
|
|
13
|
+
try {
|
|
14
|
+
const config = await loadConfig();
|
|
15
|
+
requireApiKey(config);
|
|
16
|
+
if (!options.force) {
|
|
17
|
+
const confirmed = await confirmAction(`Delete check schedule ${scheduleId}?`);
|
|
18
|
+
if (!confirmed) {
|
|
19
|
+
console.log('Cancelled.');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
await apiCall(config, 'DELETE', `/api/v1/check-schedules/${scheduleId}`);
|
|
24
|
+
console.log(success(`Check schedule ${scheduleId} deleted`));
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.log(error(`Failed to delete check schedule: ${formatError(err)}`));
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/delete.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,QAAQ,CAAC,eAAe,EAAE,0BAA0B,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,OAA4B,EAAE,EAAE;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,CAAC,CAAC;QAEtB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,yBAAyB,UAAU,GAAG,CAAC,CAAC;YAC9E,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,2BAA2B,UAAU,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,kBAAkB,UAAU,UAAU,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,oBAAoB,SAEhC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* qa-use check-schedule - Manage remote check schedules
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { createCommand } from './create.js';
|
|
6
|
+
import { deleteCommand } from './delete.js';
|
|
7
|
+
import { infoCommand } from './info.js';
|
|
8
|
+
import { listCommand } from './list.js';
|
|
9
|
+
import { runCommand } from './run.js';
|
|
10
|
+
import { updateCommand } from './update.js';
|
|
11
|
+
export const checkScheduleCommand = new Command('check-schedule').description('Manage remote check schedules');
|
|
12
|
+
checkScheduleCommand.addCommand(listCommand);
|
|
13
|
+
checkScheduleCommand.addCommand(infoCommand);
|
|
14
|
+
checkScheduleCommand.addCommand(createCommand);
|
|
15
|
+
checkScheduleCommand.addCommand(updateCommand);
|
|
16
|
+
checkScheduleCommand.addCommand(deleteCommand);
|
|
17
|
+
checkScheduleCommand.addCommand(runCommand);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/cli/commands/check-schedule/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC,WAAW,CAC3E,+BAA+B,CAChC,CAAC;AAEF,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC7C,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAC7C,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC/C,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC/C,oBAAoB,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAC/C,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC"}
|