@observeone/cli 1.21.0 → 1.22.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/LICENSE +201 -21
- package/README.md +14 -14
- package/dist/README.md +14 -14
- package/dist/commands/alert-channel.d.ts.map +1 -1
- package/dist/commands/alert-channel.js +12 -73
- package/dist/commands/alert-channel.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +12 -109
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/heartbeat.d.ts.map +1 -1
- package/dist/commands/heartbeat.js +3 -64
- package/dist/commands/heartbeat.js.map +1 -1
- package/dist/commands/incident.d.ts.map +1 -1
- package/dist/commands/incident.js +3 -71
- package/dist/commands/incident.js.map +1 -1
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +7 -80
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/resource-command.factory.d.ts.map +1 -1
- package/dist/commands/resource-command.factory.js +14 -0
- package/dist/commands/resource-command.factory.js.map +1 -1
- package/dist/commands/status-page.d.ts.map +1 -1
- package/dist/commands/status-page.js +3 -79
- package/dist/commands/status-page.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/utils/schema-prompts.d.ts +36 -0
- package/dist/utils/schema-prompts.d.ts.map +1 -0
- package/dist/utils/schema-prompts.js +175 -0
- package/dist/utils/schema-prompts.js.map +1 -0
- package/dist/utils/schemas.d.ts +41 -0
- package/dist/utils/schemas.d.ts.map +1 -1
- package/dist/utils/schemas.js +237 -0
- package/dist/utils/schemas.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status-page.js","sourceRoot":"","sources":["../../src/commands/status-page.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"status-page.js","sourceRoot":"","sources":["../../src/commands/status-page.ts"],"names":[],"mappings":"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"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@observeone/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "ObserveOne CLI - AI-powered website monitoring and testing from the command line",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"browser-automation"
|
|
30
30
|
],
|
|
31
31
|
"author": "ObserveOne Team",
|
|
32
|
-
"license": "
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"axios": "^1.6.0",
|
|
35
35
|
"chalk": "^5.3.0",
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ResourceSchema } from './schemas.js';
|
|
2
|
+
import { IOutputService } from '../interfaces/output.interface.js';
|
|
3
|
+
type Options = Record<string, unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Default `createPrompts` callback for the resource-command factory.
|
|
6
|
+
*
|
|
7
|
+
* Behavior:
|
|
8
|
+
* 1. For every field with `requiredOnCreate` and no CLI flag, builds an inquirer
|
|
9
|
+
* question (using `inquirerType`, `label`, `choices`, `default`, `validate`)
|
|
10
|
+
* and runs them as a single prompt batch. Bails fast with `requireTTY` if
|
|
11
|
+
* stdin is not a TTY.
|
|
12
|
+
* 2. Assembles the payload by iterating every field in `fieldMetadata`:
|
|
13
|
+
* - Pulls the value from `options[flagName]` (or from the inquirer answers).
|
|
14
|
+
* - Falls back to `default` when neither is present.
|
|
15
|
+
* - Applies `transformer` to the raw value before merging.
|
|
16
|
+
*
|
|
17
|
+
* Returns the payload as a `Partial<T>`-compatible plain object.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildDefaultCreatePrompts<T>(schema: ResourceSchema): (options: Options) => Promise<Partial<T>>;
|
|
20
|
+
/**
|
|
21
|
+
* Default `updatePrompts` callback for the resource-command factory.
|
|
22
|
+
*
|
|
23
|
+
* Behavior:
|
|
24
|
+
* 1. Asserts the user passed at least one updatable flag; otherwise emits an
|
|
25
|
+
* error via `outputService` and exits with code 1 (mirrors the existing
|
|
26
|
+
* per-command "Please provide at least one field to update" pattern).
|
|
27
|
+
* 2. Assembles the payload by iterating every updatable field:
|
|
28
|
+
* - If the CLI flag was passed, uses the flag value (with `transformer`).
|
|
29
|
+
* - Otherwise, falls back to `existing[field]` so the value is preserved.
|
|
30
|
+
* - If both are absent, uses `default` (or omits the field).
|
|
31
|
+
*
|
|
32
|
+
* No inquirer prompts on update — `update` is non-interactive by design.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildDefaultUpdatePrompts<T>(schema: ResourceSchema, outputService: IOutputService): (id: number, options: Options, existing: T) => Promise<Partial<T>>;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=schema-prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-prompts.d.ts","sourceRoot":"","sources":["../../src/utils/schema-prompts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,MAAM,EAAE,cAAc,GACrB,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAuC3C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EACzC,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,cAAc,GAC5B,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CA4CpE"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { requireTTY } from './confirm.js';
|
|
4
|
+
/**
|
|
5
|
+
* Default `createPrompts` callback for the resource-command factory.
|
|
6
|
+
*
|
|
7
|
+
* Behavior:
|
|
8
|
+
* 1. For every field with `requiredOnCreate` and no CLI flag, builds an inquirer
|
|
9
|
+
* question (using `inquirerType`, `label`, `choices`, `default`, `validate`)
|
|
10
|
+
* and runs them as a single prompt batch. Bails fast with `requireTTY` if
|
|
11
|
+
* stdin is not a TTY.
|
|
12
|
+
* 2. Assembles the payload by iterating every field in `fieldMetadata`:
|
|
13
|
+
* - Pulls the value from `options[flagName]` (or from the inquirer answers).
|
|
14
|
+
* - Falls back to `default` when neither is present.
|
|
15
|
+
* - Applies `transformer` to the raw value before merging.
|
|
16
|
+
*
|
|
17
|
+
* Returns the payload as a `Partial<T>`-compatible plain object.
|
|
18
|
+
*/
|
|
19
|
+
export function buildDefaultCreatePrompts(schema) {
|
|
20
|
+
return async (options) => {
|
|
21
|
+
const metadata = schema.fieldMetadata ?? {};
|
|
22
|
+
const entries = Object.entries(metadata);
|
|
23
|
+
// Trigger condition: any `requiredOnCreate` field is missing from options.
|
|
24
|
+
// Matches the existing per-command pattern where one missing required
|
|
25
|
+
// flag flips the whole create flow into interactive mode.
|
|
26
|
+
const triggered = entries.some(([field, meta]) => {
|
|
27
|
+
if (!meta.requiredOnCreate)
|
|
28
|
+
return false;
|
|
29
|
+
return isFlagAbsent(options, field, meta);
|
|
30
|
+
});
|
|
31
|
+
const promptQuestions = [];
|
|
32
|
+
if (triggered) {
|
|
33
|
+
// Once triggered, batch-prompt every field with an `inquirerType` whose
|
|
34
|
+
// flag is missing — including optional fields with defaults (e.g.
|
|
35
|
+
// heartbeat period/grace). The user can just press enter to accept.
|
|
36
|
+
for (const [field, meta] of entries) {
|
|
37
|
+
if (!meta.inquirerType)
|
|
38
|
+
continue;
|
|
39
|
+
if (!isFlagAbsent(options, field, meta))
|
|
40
|
+
continue;
|
|
41
|
+
promptQuestions.push(toInquirerQuestion(field, meta));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
let answers = {};
|
|
45
|
+
if (promptQuestions.length > 0) {
|
|
46
|
+
requireTTY((msg) => console.error(chalk.red(`\n❌ ${msg}\n`)));
|
|
47
|
+
answers = (await inquirer.prompt(promptQuestions));
|
|
48
|
+
}
|
|
49
|
+
const payload = {};
|
|
50
|
+
for (const [field, meta] of entries) {
|
|
51
|
+
const value = resolveValue(field, meta, options, answers);
|
|
52
|
+
if (value !== undefined)
|
|
53
|
+
payload[field] = value;
|
|
54
|
+
}
|
|
55
|
+
return payload;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Default `updatePrompts` callback for the resource-command factory.
|
|
60
|
+
*
|
|
61
|
+
* Behavior:
|
|
62
|
+
* 1. Asserts the user passed at least one updatable flag; otherwise emits an
|
|
63
|
+
* error via `outputService` and exits with code 1 (mirrors the existing
|
|
64
|
+
* per-command "Please provide at least one field to update" pattern).
|
|
65
|
+
* 2. Assembles the payload by iterating every updatable field:
|
|
66
|
+
* - If the CLI flag was passed, uses the flag value (with `transformer`).
|
|
67
|
+
* - Otherwise, falls back to `existing[field]` so the value is preserved.
|
|
68
|
+
* - If both are absent, uses `default` (or omits the field).
|
|
69
|
+
*
|
|
70
|
+
* No inquirer prompts on update — `update` is non-interactive by design.
|
|
71
|
+
*/
|
|
72
|
+
export function buildDefaultUpdatePrompts(schema, outputService) {
|
|
73
|
+
return async (_id, options, existing) => {
|
|
74
|
+
const metadata = schema.fieldMetadata ?? {};
|
|
75
|
+
const entries = Object.entries(metadata);
|
|
76
|
+
const updatableEntries = entries.filter(([, m]) => m.updatable !== false);
|
|
77
|
+
const anyFlagPassed = updatableEntries.some(([field, meta]) => !isFlagAbsent(options, field, meta)) ||
|
|
78
|
+
(schema.extraUpdateTriggers ?? []).some((flag) => options[flag] !== undefined);
|
|
79
|
+
if (!anyFlagPassed) {
|
|
80
|
+
const updatableFlags = updatableEntries
|
|
81
|
+
.map(([field, meta]) => meta.flagName ?? field)
|
|
82
|
+
.filter((f) => f)
|
|
83
|
+
.map((f) => `--${kebab(f)}`);
|
|
84
|
+
const hint = updatableFlags.length > 0 ? ` (${updatableFlags.join(', ')})` : '';
|
|
85
|
+
outputService.error(`Please provide at least one field to update${hint}.`);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// `existing` is a generic `T` so we cast to a row to index by API field name.
|
|
89
|
+
const existingRecord = (existing ?? {});
|
|
90
|
+
const payload = {};
|
|
91
|
+
for (const [field, meta] of updatableEntries) {
|
|
92
|
+
const flag = meta.flagName ?? field;
|
|
93
|
+
const flagAbsent = isFlagAbsent(options, field, meta);
|
|
94
|
+
const raw = flagAbsent ? undefined : options[flag];
|
|
95
|
+
let value;
|
|
96
|
+
if (raw !== undefined) {
|
|
97
|
+
value = meta.transformer ? meta.transformer(raw) : raw;
|
|
98
|
+
assertChoice(field, meta, value);
|
|
99
|
+
}
|
|
100
|
+
else if (existingRecord[field] != null) {
|
|
101
|
+
// `!= null` matches the existing `??`-chain semantics used across the
|
|
102
|
+
// hand-rolled commands — both undefined and null fall through to default.
|
|
103
|
+
value = existingRecord[field];
|
|
104
|
+
}
|
|
105
|
+
else if (meta.default !== undefined) {
|
|
106
|
+
value = meta.default;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
payload[field] = value;
|
|
112
|
+
}
|
|
113
|
+
return payload;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function toInquirerQuestion(field, meta) {
|
|
117
|
+
const question = {
|
|
118
|
+
type: meta.inquirerType ?? 'input',
|
|
119
|
+
name: field,
|
|
120
|
+
message: meta.label ?? `${field}:`,
|
|
121
|
+
};
|
|
122
|
+
if (meta.choices) {
|
|
123
|
+
question.choices = meta.choices;
|
|
124
|
+
}
|
|
125
|
+
if (meta.default !== undefined) {
|
|
126
|
+
question.default = meta.default;
|
|
127
|
+
}
|
|
128
|
+
if (meta.validate) {
|
|
129
|
+
question.validate = meta.validate;
|
|
130
|
+
}
|
|
131
|
+
return question;
|
|
132
|
+
}
|
|
133
|
+
function resolveValue(field, meta, options, answers) {
|
|
134
|
+
const flag = meta.flagName ?? field;
|
|
135
|
+
const fromOptions = isFlagAbsent(options, field, meta) ? undefined : options[flag];
|
|
136
|
+
const fromAnswers = field in answers ? answers[field] : undefined;
|
|
137
|
+
const raw = fromOptions !== undefined ? fromOptions : fromAnswers;
|
|
138
|
+
if (raw !== undefined) {
|
|
139
|
+
const transformed = meta.transformer ? meta.transformer(raw) : raw;
|
|
140
|
+
assertChoice(field, meta, transformed);
|
|
141
|
+
return transformed;
|
|
142
|
+
}
|
|
143
|
+
return meta.default;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Returns true when the user didn't actually supply this flag — either it's
|
|
147
|
+
* undefined or it's an empty array that the schema marked as
|
|
148
|
+
* `treatEmptyArrayAsAbsent` (commander's repeatable-option default).
|
|
149
|
+
*/
|
|
150
|
+
function isFlagAbsent(options, field, meta) {
|
|
151
|
+
const flag = meta.flagName ?? field;
|
|
152
|
+
const raw = options[flag];
|
|
153
|
+
if (raw === undefined)
|
|
154
|
+
return true;
|
|
155
|
+
if (meta.treatEmptyArrayAsAbsent && Array.isArray(raw) && raw.length === 0)
|
|
156
|
+
return true;
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Reject CLI/prompt input that's not a member of `meta.choices`. Skipped when
|
|
161
|
+
* `meta.choices` is undefined or the value comes from `existing[field]` (which
|
|
162
|
+
* is presumed valid because it came from the backend).
|
|
163
|
+
*/
|
|
164
|
+
function assertChoice(field, meta, value) {
|
|
165
|
+
if (!meta.choices)
|
|
166
|
+
return;
|
|
167
|
+
if (meta.choices.includes(value))
|
|
168
|
+
return;
|
|
169
|
+
throw new Error(`Invalid ${field}: '${String(value)}'. Must be one of: ${meta.choices.join(', ')}`);
|
|
170
|
+
}
|
|
171
|
+
/** camelCase → kebab-case for help-message rendering of flag names. */
|
|
172
|
+
function kebab(name) {
|
|
173
|
+
return name.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=schema-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-prompts.js","sourceRoot":"","sources":["../../src/utils/schema-prompts.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/schemas.d.ts
CHANGED
|
@@ -1,7 +1,48 @@
|
|
|
1
|
+
export type InquirerType = 'input' | 'list' | 'number' | 'confirm';
|
|
2
|
+
export interface FieldSchema {
|
|
3
|
+
/** CLI option key (camelCase). If omitted, no CLI flag is bound to this field. */
|
|
4
|
+
flagName?: string;
|
|
5
|
+
/** Inquirer prompt type for interactive fallback. */
|
|
6
|
+
inquirerType?: InquirerType;
|
|
7
|
+
/** Prompt message (with trailing colon, e.g. "Monitor name:"). */
|
|
8
|
+
label?: string;
|
|
9
|
+
/** Force an interactive prompt on create when the flag is missing. */
|
|
10
|
+
requiredOnCreate?: boolean;
|
|
11
|
+
/** Whether the field appears in update payloads. Default true. */
|
|
12
|
+
updatable?: boolean;
|
|
13
|
+
/** Default value emitted on create when option and prompt are both absent. */
|
|
14
|
+
default?: unknown;
|
|
15
|
+
/** Inquirer choices for list-type fields. */
|
|
16
|
+
choices?: readonly string[];
|
|
17
|
+
/** Synchronous validator (returns true or an error message). */
|
|
18
|
+
validate?: (val: unknown) => boolean | string;
|
|
19
|
+
/** Transform a CLI string or inquirer answer before merging into the payload. */
|
|
20
|
+
transformer?: (val: unknown) => unknown;
|
|
21
|
+
/**
|
|
22
|
+
* Treat an empty array value as if the flag wasn't passed at all.
|
|
23
|
+
*
|
|
24
|
+
* Needed for fields backed by commander's repeatable-option collector
|
|
25
|
+
* (`.option('-a, --foo <v>', 'desc', collectOptionValues, [])`) where the
|
|
26
|
+
* empty `[]` default is indistinguishable from the user explicitly clearing
|
|
27
|
+
* the field. With this opt-in, an empty array falls through to `existing`
|
|
28
|
+
* on update (rather than wiping the existing value).
|
|
29
|
+
*/
|
|
30
|
+
treatEmptyArrayAsAbsent?: boolean;
|
|
31
|
+
}
|
|
1
32
|
export interface ResourceSchema {
|
|
2
33
|
description: string;
|
|
3
34
|
required: string[];
|
|
4
35
|
template: Record<string, unknown>;
|
|
36
|
+
/** Per-field metadata that drives the schema-driven prompt fallback in the resource-command factory. */
|
|
37
|
+
fieldMetadata?: Record<string, FieldSchema>;
|
|
38
|
+
/**
|
|
39
|
+
* Extra CLI flag names (camelCase) that count toward the "any updatable
|
|
40
|
+
* field was passed" check on update, but don't appear in the payload
|
|
41
|
+
* directly. Use for inputs that flow into a custom composer (e.g.
|
|
42
|
+
* alert-channel's --email / --webhook-url which feed buildConfigFromOptions
|
|
43
|
+
* to produce a single `config` field).
|
|
44
|
+
*/
|
|
45
|
+
extraUpdateTriggers?: readonly string[];
|
|
5
46
|
}
|
|
6
47
|
export declare const schemas: Record<string, ResourceSchema>;
|
|
7
48
|
export declare function resolveSchema(resource: string): ResourceSchema | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/utils/schemas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/utils/schemas.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEnE,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kEAAkE;IAClE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,gEAAgE;IAChE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;IAC9C,iFAAiF;IACjF,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC;IACxC;;;;;;;;OAQG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,wGAAwG;IACxG,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAyCD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAsSlD,CAAC;AAQF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAG1E;AAED,eAAO,MAAM,aAAa,UAAuB,CAAC;AA8BlD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAarF"}
|
package/dist/utils/schemas.js
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
import { parseKeyValuePairs, parseNumericIds } from './cli-input.js';
|
|
2
|
+
const trimNonEmpty = (label) => (val) => typeof val === 'string' && val.trim().length > 0 ? true : `${label} is required`;
|
|
3
|
+
const validateUrl = (val) => {
|
|
4
|
+
if (typeof val !== 'string')
|
|
5
|
+
return 'Please enter a valid URL (e.g. https://example.com)';
|
|
6
|
+
try {
|
|
7
|
+
new URL(val);
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return 'Please enter a valid URL (e.g. https://example.com)';
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
const validateMinLength = (label, min) => (val) => typeof val === 'string' && val.trim().length >= min ? true : `${label} is required`;
|
|
15
|
+
/** Coerce CLI strings to integers; leave inquirer numbers untouched. */
|
|
16
|
+
const toInt = (val) => (typeof val === 'string' ? parseInt(val, 10) : val);
|
|
17
|
+
const toUpper = (val) => (typeof val === 'string' ? val.toUpperCase() : val);
|
|
18
|
+
const negateBool = (val) => !val;
|
|
19
|
+
const HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'];
|
|
20
|
+
const INCIDENT_PRIORITIES = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'];
|
|
21
|
+
const ALERT_CHANNEL_TYPES = [
|
|
22
|
+
'email',
|
|
23
|
+
'slack',
|
|
24
|
+
'discord',
|
|
25
|
+
'teams',
|
|
26
|
+
'telegram',
|
|
27
|
+
'sms',
|
|
28
|
+
'webhook',
|
|
29
|
+
];
|
|
1
30
|
export const schemas = {
|
|
2
31
|
monitor: {
|
|
3
32
|
description: 'URL monitor — pings an HTTP endpoint on a cron schedule',
|
|
@@ -11,6 +40,39 @@ export const schemas = {
|
|
|
11
40
|
description: '',
|
|
12
41
|
channel_ids: [],
|
|
13
42
|
},
|
|
43
|
+
fieldMetadata: {
|
|
44
|
+
name: {
|
|
45
|
+
flagName: 'name',
|
|
46
|
+
inquirerType: 'input',
|
|
47
|
+
label: 'Monitor name:',
|
|
48
|
+
requiredOnCreate: true,
|
|
49
|
+
validate: trimNonEmpty('Name'),
|
|
50
|
+
},
|
|
51
|
+
url: {
|
|
52
|
+
flagName: 'url',
|
|
53
|
+
inquirerType: 'input',
|
|
54
|
+
label: 'URL to monitor:',
|
|
55
|
+
requiredOnCreate: true,
|
|
56
|
+
validate: validateUrl,
|
|
57
|
+
},
|
|
58
|
+
interval: {
|
|
59
|
+
flagName: 'interval',
|
|
60
|
+
inquirerType: 'input',
|
|
61
|
+
label: 'Cron interval (default: Every 5 mins):',
|
|
62
|
+
default: '*/5 * * * *',
|
|
63
|
+
},
|
|
64
|
+
description: { flagName: 'description', default: '' },
|
|
65
|
+
// `--no-alerts` flag → options.alerts === false on commander; absence
|
|
66
|
+
// is undefined, so the default fires and alert_on_failure stays true.
|
|
67
|
+
alert_on_failure: { flagName: 'alerts', default: true },
|
|
68
|
+
timeout_ms: { default: 30000 },
|
|
69
|
+
channel_ids: {
|
|
70
|
+
flagName: 'alertChannelId',
|
|
71
|
+
default: [],
|
|
72
|
+
treatEmptyArrayAsAbsent: true,
|
|
73
|
+
transformer: (v) => parseNumericIds(v, 'alert-channel-id') ?? [],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
14
76
|
},
|
|
15
77
|
check: {
|
|
16
78
|
description: 'API check — HTTP request with method/headers/body/assertions',
|
|
@@ -28,6 +90,52 @@ export const schemas = {
|
|
|
28
90
|
description: '',
|
|
29
91
|
channel_ids: [],
|
|
30
92
|
},
|
|
93
|
+
fieldMetadata: {
|
|
94
|
+
name: {
|
|
95
|
+
flagName: 'name',
|
|
96
|
+
inquirerType: 'input',
|
|
97
|
+
label: 'Check name:',
|
|
98
|
+
requiredOnCreate: true,
|
|
99
|
+
validate: trimNonEmpty('Name'),
|
|
100
|
+
},
|
|
101
|
+
url: {
|
|
102
|
+
flagName: 'url',
|
|
103
|
+
inquirerType: 'input',
|
|
104
|
+
label: 'API URL:',
|
|
105
|
+
requiredOnCreate: true,
|
|
106
|
+
validate: trimNonEmpty('URL'),
|
|
107
|
+
},
|
|
108
|
+
method: {
|
|
109
|
+
flagName: 'method',
|
|
110
|
+
inquirerType: 'list',
|
|
111
|
+
label: 'HTTP Method:',
|
|
112
|
+
// Not requiredOnCreate — mirrors old behavior where method silently
|
|
113
|
+
// defaults to GET when the flag is missing. Still gets prompted as
|
|
114
|
+
// part of the batch when name or url are missing.
|
|
115
|
+
choices: HTTP_METHODS,
|
|
116
|
+
default: 'GET',
|
|
117
|
+
transformer: toUpper,
|
|
118
|
+
},
|
|
119
|
+
description: { flagName: 'description', default: '' },
|
|
120
|
+
body: { flagName: 'body' },
|
|
121
|
+
cron_expression: { flagName: 'interval' },
|
|
122
|
+
headers: {
|
|
123
|
+
flagName: 'header',
|
|
124
|
+
treatEmptyArrayAsAbsent: true,
|
|
125
|
+
transformer: (v) => parseKeyValuePairs(v, 'header'),
|
|
126
|
+
},
|
|
127
|
+
regions: { flagName: 'regions', treatEmptyArrayAsAbsent: true },
|
|
128
|
+
retry_count: { flagName: 'retryCount', transformer: toInt },
|
|
129
|
+
retry_interval: { flagName: 'retryInterval', transformer: toInt },
|
|
130
|
+
channel_ids: {
|
|
131
|
+
flagName: 'alertChannelId',
|
|
132
|
+
default: [],
|
|
133
|
+
treatEmptyArrayAsAbsent: true,
|
|
134
|
+
transformer: (v) => parseNumericIds(v, 'alert-channel-id') ?? [],
|
|
135
|
+
},
|
|
136
|
+
alert_on_failure: { flagName: 'alerts', default: true },
|
|
137
|
+
timeout_ms: { default: 30000 },
|
|
138
|
+
},
|
|
31
139
|
},
|
|
32
140
|
heartbeat: {
|
|
33
141
|
description: 'Heartbeat — inbound ping receiver with grace period',
|
|
@@ -38,6 +146,30 @@ export const schemas = {
|
|
|
38
146
|
grace_period: 60,
|
|
39
147
|
description: '',
|
|
40
148
|
},
|
|
149
|
+
fieldMetadata: {
|
|
150
|
+
name: {
|
|
151
|
+
flagName: 'name',
|
|
152
|
+
inquirerType: 'input',
|
|
153
|
+
label: 'Heartbeat name:',
|
|
154
|
+
requiredOnCreate: true,
|
|
155
|
+
validate: trimNonEmpty('Name'),
|
|
156
|
+
},
|
|
157
|
+
period: {
|
|
158
|
+
flagName: 'period',
|
|
159
|
+
inquirerType: 'number',
|
|
160
|
+
label: 'Expected period (seconds):',
|
|
161
|
+
default: 300,
|
|
162
|
+
transformer: toInt,
|
|
163
|
+
},
|
|
164
|
+
grace_period: {
|
|
165
|
+
flagName: 'grace',
|
|
166
|
+
inquirerType: 'number',
|
|
167
|
+
label: 'Grace period (seconds):',
|
|
168
|
+
default: 60,
|
|
169
|
+
transformer: toInt,
|
|
170
|
+
},
|
|
171
|
+
description: { flagName: 'description', default: '' },
|
|
172
|
+
},
|
|
41
173
|
},
|
|
42
174
|
'alert-channel': {
|
|
43
175
|
description: 'Alert channel — delivery target for notifications (email, slack, webhook, etc.)',
|
|
@@ -49,6 +181,33 @@ export const schemas = {
|
|
|
49
181
|
email: 'alerts@example.com',
|
|
50
182
|
},
|
|
51
183
|
},
|
|
184
|
+
fieldMetadata: {
|
|
185
|
+
name: {
|
|
186
|
+
flagName: 'name',
|
|
187
|
+
inquirerType: 'input',
|
|
188
|
+
label: 'Channel name:',
|
|
189
|
+
requiredOnCreate: true,
|
|
190
|
+
validate: trimNonEmpty('Name'),
|
|
191
|
+
},
|
|
192
|
+
type: {
|
|
193
|
+
flagName: 'type',
|
|
194
|
+
inquirerType: 'list',
|
|
195
|
+
label: 'Channel type:',
|
|
196
|
+
requiredOnCreate: true,
|
|
197
|
+
choices: ALERT_CHANNEL_TYPES,
|
|
198
|
+
},
|
|
199
|
+
is_default: { flagName: 'default', default: false },
|
|
200
|
+
},
|
|
201
|
+
extraUpdateTriggers: [
|
|
202
|
+
'email',
|
|
203
|
+
'webhookUrl',
|
|
204
|
+
'botToken',
|
|
205
|
+
'chatId',
|
|
206
|
+
'accountSid',
|
|
207
|
+
'authToken',
|
|
208
|
+
'fromNumber',
|
|
209
|
+
'phoneNumber',
|
|
210
|
+
],
|
|
52
211
|
},
|
|
53
212
|
'status-page': {
|
|
54
213
|
description: 'Public status page — aggregates resource statuses and incident history',
|
|
@@ -61,6 +220,40 @@ export const schemas = {
|
|
|
61
220
|
show_incident_history: true,
|
|
62
221
|
show_uptime_percentage: true,
|
|
63
222
|
},
|
|
223
|
+
fieldMetadata: {
|
|
224
|
+
slug: {
|
|
225
|
+
flagName: 'slug',
|
|
226
|
+
inquirerType: 'input',
|
|
227
|
+
label: 'Status page slug:',
|
|
228
|
+
requiredOnCreate: true,
|
|
229
|
+
validate: trimNonEmpty('Slug'),
|
|
230
|
+
},
|
|
231
|
+
name: {
|
|
232
|
+
flagName: 'name',
|
|
233
|
+
inquirerType: 'input',
|
|
234
|
+
label: 'Status page name:',
|
|
235
|
+
requiredOnCreate: true,
|
|
236
|
+
validate: trimNonEmpty('Name'),
|
|
237
|
+
},
|
|
238
|
+
description: { flagName: 'description', default: '' },
|
|
239
|
+
logo_url: { flagName: 'logoUrl' },
|
|
240
|
+
theme_primary_color: { flagName: 'themePrimaryColor' },
|
|
241
|
+
theme_background_color: { flagName: 'themeBackgroundColor' },
|
|
242
|
+
// Inverted booleans: --private flag presence sets is_public=false.
|
|
243
|
+
// When the flag is absent on update we fall through to existing[field];
|
|
244
|
+
// on create the default (true) wins.
|
|
245
|
+
is_public: { flagName: 'private', transformer: negateBool, default: true },
|
|
246
|
+
show_incident_history: {
|
|
247
|
+
flagName: 'hideIncidentHistory',
|
|
248
|
+
transformer: negateBool,
|
|
249
|
+
default: true,
|
|
250
|
+
},
|
|
251
|
+
show_uptime_percentage: {
|
|
252
|
+
flagName: 'hideUptime',
|
|
253
|
+
transformer: negateBool,
|
|
254
|
+
default: true,
|
|
255
|
+
},
|
|
256
|
+
},
|
|
64
257
|
},
|
|
65
258
|
incident: {
|
|
66
259
|
description: 'Incident — human-authored status event visible on a status page',
|
|
@@ -71,6 +264,26 @@ export const schemas = {
|
|
|
71
264
|
status: 'OPEN',
|
|
72
265
|
description: '',
|
|
73
266
|
},
|
|
267
|
+
fieldMetadata: {
|
|
268
|
+
title: {
|
|
269
|
+
flagName: 'title',
|
|
270
|
+
inquirerType: 'input',
|
|
271
|
+
label: 'Incident title:',
|
|
272
|
+
requiredOnCreate: true,
|
|
273
|
+
validate: validateMinLength('Title', 3),
|
|
274
|
+
},
|
|
275
|
+
priority: {
|
|
276
|
+
flagName: 'priority',
|
|
277
|
+
inquirerType: 'list',
|
|
278
|
+
label: 'Priority:',
|
|
279
|
+
requiredOnCreate: true,
|
|
280
|
+
choices: INCIDENT_PRIORITIES,
|
|
281
|
+
transformer: toUpper,
|
|
282
|
+
},
|
|
283
|
+
description: { flagName: 'description', default: '' },
|
|
284
|
+
assigned_to: { flagName: 'assignedTo' },
|
|
285
|
+
team_id: { flagName: 'teamId', transformer: toInt },
|
|
286
|
+
},
|
|
74
287
|
},
|
|
75
288
|
'ai-check': {
|
|
76
289
|
description: 'AI browser check — prompt-driven Playwright run against a URL',
|
|
@@ -81,6 +294,30 @@ export const schemas = {
|
|
|
81
294
|
prompt: 'Verify the page loads and the main heading is visible',
|
|
82
295
|
description: '',
|
|
83
296
|
},
|
|
297
|
+
fieldMetadata: {
|
|
298
|
+
name: {
|
|
299
|
+
flagName: 'name',
|
|
300
|
+
inquirerType: 'input',
|
|
301
|
+
label: 'AI check name:',
|
|
302
|
+
requiredOnCreate: true,
|
|
303
|
+
validate: trimNonEmpty('Name'),
|
|
304
|
+
},
|
|
305
|
+
url: {
|
|
306
|
+
flagName: 'url',
|
|
307
|
+
inquirerType: 'input',
|
|
308
|
+
label: 'URL to test:',
|
|
309
|
+
requiredOnCreate: true,
|
|
310
|
+
validate: validateUrl,
|
|
311
|
+
},
|
|
312
|
+
prompt: {
|
|
313
|
+
flagName: 'prompt',
|
|
314
|
+
inquirerType: 'input',
|
|
315
|
+
label: 'AI prompt:',
|
|
316
|
+
requiredOnCreate: true,
|
|
317
|
+
validate: trimNonEmpty('Prompt'),
|
|
318
|
+
},
|
|
319
|
+
description: { flagName: 'description', default: '' },
|
|
320
|
+
},
|
|
84
321
|
},
|
|
85
322
|
};
|
|
86
323
|
const resourceAliases = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/utils/schemas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/utils/schemas.ts"],"names":[],"mappings":"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"}
|