@cat-indev/catops-cli 0.0.1-alpha.7 → 0.0.1-alpha.9
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 +76 -40
- package/dist/core/Menu.js +4 -3
- package/dist/core/Menu.js.map +1 -1
- package/dist/core/Notifier.js +7 -7
- package/dist/core/Notifier.js.map +1 -1
- package/dist/core/classifiers.d.ts +2 -1
- package/dist/core/classifiers.js +3 -2
- package/dist/core/classifiers.js.map +1 -1
- package/dist/core/messages.d.ts +3 -2
- package/dist/core/messages.js +4 -3
- package/dist/core/messages.js.map +1 -1
- package/dist/services/ansible.d.ts +7 -6
- package/dist/services/ansible.js +10 -10
- package/dist/services/ansible.js.map +1 -1
- package/dist/services/archive.d.ts +4 -4
- package/dist/services/archive.js +6 -6
- package/dist/services/archive.js.map +1 -1
- package/dist/services/argocd.d.ts +11 -8
- package/dist/services/argocd.js +14 -14
- package/dist/services/argocd.js.map +1 -1
- package/dist/services/az.d.ts +13 -8
- package/dist/services/az.js +17 -14
- package/dist/services/az.js.map +1 -1
- package/dist/services/docker.d.ts +10 -7
- package/dist/services/docker.js +12 -12
- package/dist/services/docker.js.map +1 -1
- package/dist/services/git.d.ts +9 -9
- package/dist/services/git.js +16 -16
- package/dist/services/git.js.map +1 -1
- package/dist/services/helm.d.ts +4 -4
- package/dist/services/helm.js +6 -6
- package/dist/services/helm.js.map +1 -1
- package/dist/services/kubectl.d.ts +4 -2
- package/dist/services/kubectl.js +13 -8
- package/dist/services/kubectl.js.map +1 -1
- package/dist/services/npm.d.ts +5 -5
- package/dist/services/npm.js +8 -8
- package/dist/services/npm.js.map +1 -1
- package/dist/services/oc.d.ts +12 -2
- package/dist/services/oc.js +22 -9
- package/dist/services/oc.js.map +1 -1
- package/dist/services/shell.d.ts +8 -0
- package/dist/services/shell.js +11 -0
- package/dist/services/shell.js.map +1 -1
- package/dist/services/tekton.d.ts +8 -6
- package/dist/services/tekton.js +10 -10
- package/dist/services/tekton.js.map +1 -1
- package/dist/services/terraform.d.ts +13 -8
- package/dist/services/terraform.js +14 -14
- package/dist/services/terraform.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# catops-cli
|
|
2
2
|
|
|
3
3
|
Framework para pipelines DevOps, escrito en **TypeScript** (100% usable desde JavaScript puro), empaquetado como librería npm instalable en cualquier proyecto.
|
|
4
4
|
|
|
@@ -16,53 +16,53 @@ Trae:
|
|
|
16
16
|
**Opción A — publicado en tu registro npm (público o privado tipo Verdaccio/Artifactory/GitHub Packages):**
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
npm install
|
|
20
|
-
# o si lo publicas con scope propio, p.ej. @miorg/
|
|
21
|
-
npm install @miorg/
|
|
19
|
+
npm install catops-cli
|
|
20
|
+
# o si lo publicas con scope propio, p.ej. @miorg/catops-cli
|
|
21
|
+
npm install @miorg/catops-cli
|
|
22
22
|
```
|
|
23
23
|
|
|
24
24
|
**Opción B — sin publicar, directo desde este proyecto (útil mientras lo maduras):**
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
# Dentro del repo de
|
|
28
|
-
npm pack # genera
|
|
27
|
+
# Dentro del repo de catops-cli
|
|
28
|
+
npm pack # genera catops-cli-<version>.tgz
|
|
29
29
|
|
|
30
30
|
# Dentro del proyecto que lo va a consumir
|
|
31
|
-
npm install /ruta/a/
|
|
31
|
+
npm install /ruta/a/catops-cli-<version>.tgz
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
**Opción C — enlazado local con `npm link` (para desarrollar la librería y el proyecto que la consume al mismo tiempo):**
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
# Dentro del repo de
|
|
37
|
+
# Dentro del repo de catops-cli
|
|
38
38
|
npm link
|
|
39
39
|
|
|
40
40
|
# Dentro del proyecto consumidor
|
|
41
|
-
npm link
|
|
41
|
+
npm link catops-cli
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
**Opción D — como dependencia de Git (monorepo o repo privado, sin registro npm):**
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
npm install git+https://github.com/tu-org/
|
|
47
|
+
npm install git+https://github.com/tu-org/catops-cli.git
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
Cualquiera de las 4 deja disponibles dos cosas en el proyecto consumidor:
|
|
51
51
|
|
|
52
52
|
1. La librería, tanto desde TS como desde JS puro:
|
|
53
53
|
```typescript
|
|
54
|
-
import { Context, Menu, services, type MenuDefinition } from "
|
|
54
|
+
import { Context, Menu, services, type MenuDefinition } from "catops-cli";
|
|
55
55
|
```
|
|
56
56
|
```javascript
|
|
57
|
-
const { Context, Menu, services } = require("
|
|
57
|
+
const { Context, Menu, services } = require("catops-cli");
|
|
58
58
|
```
|
|
59
|
-
2. El binario: `npx
|
|
59
|
+
2. El binario: `npx catops-cli` (o `catops-cli` si lo instalaste global con `-g`).
|
|
60
60
|
|
|
61
61
|
## Publicar una nueva versión
|
|
62
62
|
|
|
63
63
|
```bash
|
|
64
64
|
npm version patch # o minor / major
|
|
65
|
-
npm publish # agrega --access public si usas un scope (@miorg/
|
|
65
|
+
npm publish # agrega --access public si usas un scope (@miorg/catops-cli)
|
|
66
66
|
```
|
|
67
67
|
|
|
68
68
|
`prepublishOnly` corre el build y los tests automáticamente antes de publicar.
|
|
@@ -90,18 +90,18 @@ src/
|
|
|
90
90
|
index.ts -> registra todos los servicios anteriores (ServicesRegistry)
|
|
91
91
|
index.ts -> entry point público: Context, Menu, Notifier, senders, classifiers, messages, services, tipos
|
|
92
92
|
bin/
|
|
93
|
-
|
|
93
|
+
catops-cli.ts -> CLI ejecutable (busca devops.pipeline.js en el proyecto consumidor)
|
|
94
94
|
examples/
|
|
95
95
|
pipeline-example.js -> pipeline + menú + notificaciones de ejemplo, corre contra dist/
|
|
96
96
|
test/
|
|
97
97
|
context.test.js, shell.test.js, services.test.js, menu-selector.test.js,
|
|
98
98
|
notifier.test.js, senders.test.js, hooks-integration.test.js,
|
|
99
|
-
kubectl.test.js, oc.test.js, deployment-group.test.js
|
|
99
|
+
kubectl.test.js, oc.test.js, deployment-group.test.js, exec-options-passthrough.test.js
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
## Uso rápido: menú con `devops.pipeline.js` + el bin
|
|
103
103
|
|
|
104
|
-
Crea un `devops.pipeline.js` (o `devops.config.js` / `.
|
|
104
|
+
Crea un `devops.pipeline.js` (o `devops.config.js` / `.catops-cli.js`) en la raíz de tu proyecto:
|
|
105
105
|
|
|
106
106
|
```javascript
|
|
107
107
|
// devops.pipeline.js
|
|
@@ -119,16 +119,16 @@ module.exports = (ctx) => ({
|
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
```bash
|
|
122
|
-
npx
|
|
122
|
+
npx catops-cli --debug --env=prod
|
|
123
123
|
```
|
|
124
124
|
|
|
125
|
-
`
|
|
125
|
+
`catops-cli` detecta el archivo, arma el `Context` a partir de los flags/params de `argv`, y renderiza el menú.
|
|
126
126
|
|
|
127
127
|
## Uso directo en tu propio script (p. ej. con `tsx`)
|
|
128
128
|
|
|
129
129
|
```typescript
|
|
130
130
|
// src/index.ts
|
|
131
|
-
import { Context, Menu, type MenuDefinition } from "
|
|
131
|
+
import { Context, Menu, type MenuDefinition } from "catops-cli";
|
|
132
132
|
|
|
133
133
|
const ctx = Context.parseArgv();
|
|
134
134
|
|
|
@@ -155,7 +155,7 @@ npm run dev -- --menu-selector=build # con npm hace falta el "--" para reenv
|
|
|
155
155
|
## Uso como librería sin menú (pipeline lineal)
|
|
156
156
|
|
|
157
157
|
```javascript
|
|
158
|
-
const { Context } = require("
|
|
158
|
+
const { Context } = require("catops-cli"); // o require("./dist") dentro de este repo
|
|
159
159
|
|
|
160
160
|
const ctx = Context.parseArgv(); // llena flags/params desde argv
|
|
161
161
|
|
|
@@ -210,13 +210,13 @@ Menu.render(mainMenu, ctx);
|
|
|
210
210
|
|
|
211
211
|
```bash
|
|
212
212
|
# encadena ambos niveles en un solo comando, sin ningún prompt interactivo:
|
|
213
|
-
|
|
213
|
+
catops-cli --menu-selector=docker --docker-action=build
|
|
214
214
|
|
|
215
215
|
# un solo nivel:
|
|
216
|
-
|
|
216
|
+
catops-cli --menu-selector=deploy
|
|
217
217
|
|
|
218
218
|
# sin flags -> menú interactivo normal
|
|
219
|
-
|
|
219
|
+
catops-cli
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
Si el valor del flag no matchea ningún `selector` del nivel actual, cae de vuelta al menú interactivo (con un warning), en vez de fallar en seco. Cada submenú revisa su **propio** `flag-selector` de forma independiente, así que podés automatizar tantos niveles como quieras encadenando flags.
|
|
@@ -247,7 +247,7 @@ await ctx.run(
|
|
|
247
247
|
|
|
248
248
|
En ambos casos, además de tus callbacks, el resultado se reporta automáticamente al `ctx.notifier` (ver más abajo) — no hay que llamarlo a mano.
|
|
249
249
|
|
|
250
|
-
## retry / timeout / dryRun en shell.exec
|
|
250
|
+
## retry / timeout / dryRun — en shell.exec y en TODOS los servicios
|
|
251
251
|
|
|
252
252
|
`shell.exec(command, ...args)` sigue aceptando exactamente los mismos argumentos de siempre. Si el último argumento es un objeto plano, se interpreta como opciones **solo para esa llamada**:
|
|
253
253
|
|
|
@@ -262,17 +262,43 @@ await ctx.services.shell.exec("curl", "https://flaky-api.internal", {
|
|
|
262
262
|
});
|
|
263
263
|
```
|
|
264
264
|
|
|
265
|
-
|
|
265
|
+
**Todos los comandos de todos los servicios** (`docker`, `git`, `kubectl`, `helm`, `npm`, `archive`, `terraform`, `ansible`, `argocd`, `tekton`, `oc`, `az`) aceptan este mismo control, sin que cambie nada de lo que ya usabas:
|
|
266
|
+
|
|
267
|
+
- Si la función ya recibía un **objeto de opciones** (la mayoría), agregale la clave `exec`:
|
|
268
|
+
```javascript
|
|
269
|
+
await ctx.services.terraform.apply({ autoApprove: true, exec: { retry: 3 } });
|
|
270
|
+
await ctx.services.argocd.appSync("mi-app", { prune: true, exec: { retry: 3 } });
|
|
271
|
+
```
|
|
272
|
+
- Si la función recibe **argumentos posicionales** (strings sueltos), `exec` va como el **último argumento**:
|
|
273
|
+
```javascript
|
|
274
|
+
await ctx.services.docker.push("registry/app:v1", { retry: 3 });
|
|
275
|
+
await ctx.services.git.push({ retry: 3 });
|
|
276
|
+
await ctx.services.helm.uninstall("mi-app", { retry: 3 });
|
|
277
|
+
```
|
|
278
|
+
- `kubectl` y `oc` combinan `exec` en el **mismo objeto** que ya usás para `kubeconfig`/`namespace`:
|
|
279
|
+
```javascript
|
|
280
|
+
// 10 reintentos en un login inestable de OpenShift
|
|
281
|
+
await ctx.services.oc.login({
|
|
282
|
+
server: "https://api.cluster:6443",
|
|
283
|
+
token: process.env.OC_TOKEN,
|
|
284
|
+
namespace: "prod",
|
|
285
|
+
exec: { retry: 10, retryDelay: 2000 }
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
await ctx.services.kubectl.apply("deploy.yaml", { namespace: "prod", exec: { retry: 5, timeout: 30000 } });
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
Defaults globales para todo el proceso (afecta a todos los comandos que no pasen su propio `exec`/opciones puntuales):
|
|
266
292
|
|
|
267
293
|
```javascript
|
|
268
294
|
ctx.services.shell.configure({ retry: 3, timeout: 30000 });
|
|
269
295
|
```
|
|
270
296
|
|
|
271
|
-
`Context.parseArgv()` ya conecta flags de línea de comandos automáticamente:
|
|
297
|
+
`Context.parseArgv()` ya conecta flags de línea de comandos automáticamente a esos defaults globales:
|
|
272
298
|
|
|
273
299
|
```bash
|
|
274
|
-
npx
|
|
275
|
-
npx
|
|
300
|
+
npx catops-cli --dry-run # activa dryRun global
|
|
301
|
+
npx catops-cli --retry=3 --timeout=15000
|
|
276
302
|
```
|
|
277
303
|
|
|
278
304
|
## Servicios de infraestructura incluidos
|
|
@@ -290,15 +316,15 @@ await ctx.services.tekton.pipelineStart("build-pipeline", { params: { image: "ap
|
|
|
290
316
|
await ctx.services.az.acrBuild({ registry: "miregistro", image: "app:v1" });
|
|
291
317
|
```
|
|
292
318
|
|
|
293
|
-
## kubectl / oc: kubeconfig, namespace y espera cíclica del rollout
|
|
319
|
+
## kubectl / oc: kubeconfig, namespace, retry/timeout, y espera cíclica del rollout
|
|
294
320
|
|
|
295
|
-
`kubectl` y `oc` aceptan `{ kubeconfig, namespace }` como último argumento en **todos** sus comandos (retrocompatible, sigue funcionando sin ese argumento):
|
|
321
|
+
`kubectl` y `oc` aceptan `{ kubeconfig, namespace, exec }` como último argumento en **todos** sus comandos (retrocompatible, sigue funcionando sin ese argumento — ver la sección anterior para el detalle de `exec`):
|
|
296
322
|
|
|
297
323
|
```javascript
|
|
298
324
|
await ctx.services.kubectl.apply("deploy.yaml", { kubeconfig: "/etc/kube/prod.yaml", namespace: "prod" });
|
|
299
|
-
await ctx.services.kubectl.get("pods", "-o", "wide", { namespace: "staging" });
|
|
325
|
+
await ctx.services.kubectl.get("pods", "-o", "wide", { namespace: "staging", exec: { retry: 3 } });
|
|
300
326
|
|
|
301
|
-
await ctx.services.oc.login({ server: "https://api.cluster:6443", token, namespace: "prod" });
|
|
327
|
+
await ctx.services.oc.login({ server: "https://api.cluster:6443", token, namespace: "prod", exec: { retry: 10 } });
|
|
302
328
|
await ctx.services.oc.apply("deploy.yaml", { namespace: "prod" });
|
|
303
329
|
```
|
|
304
330
|
|
|
@@ -374,11 +400,11 @@ ctx.services.azdo.endGroup();
|
|
|
374
400
|
`ctx.notifier` tiene tres responsabilidades independientes:
|
|
375
401
|
|
|
376
402
|
1. **`classify()`** — decide a qué **área de TI** pertenece un error (para elegir a qué canal mandarlo).
|
|
377
|
-
2. **`describeError()`** — decide el **mensaje** a reportar (reemplaza el stderr crudo por algo humano).
|
|
403
|
+
2. **`describeError()`** — decide el **mensaje** a reportar (reemplaza el stderr/stdout crudo por algo humano).
|
|
378
404
|
3. **`channel()`** / **`onSuccess()`** — a qué **senders** se manda cada área.
|
|
379
405
|
|
|
380
406
|
```javascript
|
|
381
|
-
const { classifiers, messages, senders } = require("
|
|
407
|
+
const { classifiers, messages, senders } = require("catops-cli");
|
|
382
408
|
|
|
383
409
|
// 1. ¿A qué área de TI pertenece este error?
|
|
384
410
|
ctx.notifier.classify(classifiers.byCommand({
|
|
@@ -400,7 +426,7 @@ ctx.notifier.classify(classifiers.byPattern([
|
|
|
400
426
|
[/no space left|ENOSPC/i, "infra"]
|
|
401
427
|
]));
|
|
402
428
|
|
|
403
|
-
// 2. ¿qué mensaje se reporta? (opcional — sin esto, se usa el stderr crudo)
|
|
429
|
+
// 2. ¿qué mensaje se reporta? (opcional — sin esto, se usa el stderr/stdout crudo)
|
|
404
430
|
ctx.notifier.describeError(messages.byRule([
|
|
405
431
|
{
|
|
406
432
|
command: "docker", args: "push", pattern: /500 Internal Server Error/,
|
|
@@ -419,7 +445,7 @@ ctx.notifier.describeError(messages.byRule([
|
|
|
419
445
|
// 3. ¿a dónde se manda cada área?
|
|
420
446
|
ctx.notifier.channel("kubernetes", senders.webhook({ url: process.env.TEAMS_WEBHOOK }));
|
|
421
447
|
ctx.notifier.channel("security", senders.http({ url: "https://security.miempresa.com/incidents" }));
|
|
422
|
-
ctx.notifier.channel("*", senders.file({ path: "./
|
|
448
|
+
ctx.notifier.channel("*", senders.file({ path: "./catops-cli-errors.log" })); // TODO error, sin importar el área
|
|
423
449
|
|
|
424
450
|
// (opcional) éxito, sin clasificación de área
|
|
425
451
|
ctx.notifier.onSuccess(senders.log());
|
|
@@ -432,16 +458,25 @@ A partir de aquí, cualquier `ctx.run(...)` o item de menú con `action` reporta
|
|
|
432
458
|
| Fábrica | Uso |
|
|
433
459
|
|---|---|
|
|
434
460
|
| `classifiers.byCommand({ docker: "containers", ... })` | Mapea el comando que falló (adjunto automáticamente por `shell.exec`) a un área |
|
|
435
|
-
| `classifiers.byPattern([[regex, area], ...])` | Matchea contra el `stderr`/mensaje del error |
|
|
461
|
+
| `classifiers.byPattern([[regex, area], ...])` | Matchea contra el `stderr`/`stdout`/mensaje del error |
|
|
436
462
|
|
|
437
463
|
### Formateadores de mensaje (`messages`)
|
|
438
464
|
|
|
439
465
|
| Fábrica | Uso |
|
|
440
466
|
|---|---|
|
|
441
|
-
| `messages.byPattern([[regex, mensaje], ...])` | Mismo mensaje sin importar el comando — solo mira el texto del error |
|
|
467
|
+
| `messages.byPattern([[regex, mensaje], ...])` | Mismo mensaje sin importar el comando — solo mira el texto del error (`stderr`, o `stdout` si `stderr` viene vacío) |
|
|
442
468
|
| `messages.byCommand({ docker: "mensaje fijo" })` | Mensaje fijo por comando, sin importar el detalle del error |
|
|
443
469
|
| `messages.byRule([{ command?, args?, pattern?, message }, ...])` | **La opción avanzada**: combina comando + sub-comando (`args`, distingue `docker push` de `docker build`) + patrón de texto, todo en modo AND. `message` puede ser un string fijo o una función `(error, ctx) => string`. Resuelve el caso de "el mismo 500 puede venir de docker, kubectl o terraform, y cada uno necesita su propio mensaje". |
|
|
444
470
|
|
|
471
|
+
> **Errores que salen por `stdout` en vez de `stderr`:** algunos comandos (p. ej. `oc login`, o errores HTTP del API server) imprimen el mensaje en `stdout` y aun así salen con exit code ≠ 0. Como `shell.exec` rechaza con el `ExecResult` completo (que conserva `stdout` y `stderr`), todos los formateadores/clasificadores de `messages`/`classifiers` prueban primero `stderr` y, si viene vacío, caen a `stdout`. No hace falta configuración extra — el mismo `describeError`/`classify` que usás hoy funciona aunque el texto vaya por stdout:
|
|
472
|
+
|
|
473
|
+
```javascript
|
|
474
|
+
ctx.notifier.describeError(messages.byPattern([
|
|
475
|
+
[/500 Internal Server Error/, "Se ha reportado a infraestructura: falta de espacio en el registry"],
|
|
476
|
+
[/unauthorized|403/i, "Credenciales inválidas contra el registry, revisa el secret"]
|
|
477
|
+
]));
|
|
478
|
+
```
|
|
479
|
+
|
|
445
480
|
Si ningún classifier/formatter matchea, se usa el área `"unclassified"` y el mensaje crudo del error, respectivamente — nada se rompe si no configurás nada de esto.
|
|
446
481
|
|
|
447
482
|
### Senders incluidos
|
|
@@ -472,11 +507,12 @@ npm test
|
|
|
472
507
|
- `notifier.test.js` — classify/channel/onSuccess/describeError/byRule
|
|
473
508
|
- `senders.test.js` — file/http/webhook/log contra servidores reales en localhost
|
|
474
509
|
- `kubectl.test.js`, `oc.test.js` — kubeconfig/namespace, waitForDeployment (éxito, timeout, Failed, maxRestarts)
|
|
510
|
+
- `exec-options-passthrough.test.js` — retry/timeout/dryRun (`exec`) llegando a todos los servicios, incluyendo un retry real que se recupera tras 2 fallos
|
|
475
511
|
- `deployment-group.test.js` — waitForDeploymentGroup (éxito total, fallo parcial, label sin matches, oc con `dc`)
|
|
476
512
|
|
|
477
513
|
## Siguientes pasos posibles
|
|
478
514
|
|
|
479
|
-
- Publicar en un registro privado (Verdaccio/Artifactory/GitHub Packages) para instalarlo con scope, p.ej. `@miorg/
|
|
515
|
+
- Publicar en un registro privado (Verdaccio/Artifactory/GitHub Packages) para instalarlo con scope, p.ej. `@miorg/catops-cli`.
|
|
480
516
|
- Agregar más plugins (`ansible-lint`, `trivy`, `sonar-scanner`) con el mismo patrón que `terraform.ts`/`docker.ts`.
|
|
481
517
|
- CI propio (GitHub Actions/Azure Pipelines) que corra `npm test` en cada PR antes de `npm publish`.
|
|
482
518
|
- `--catch=throw` (o similar) para que un item de menú fallido mate el proceso completo en vez de solo loguear y seguir — útil corriendo vía `--menu-selector` dentro de un step de Azure Pipelines.
|
package/dist/core/Menu.js
CHANGED
|
@@ -72,9 +72,10 @@ function normalizeFlagName(flagSelector) {
|
|
|
72
72
|
return flagSelector.replace(/^--?/, "");
|
|
73
73
|
}
|
|
74
74
|
function errorMessage(error) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
if (error instanceof Error)
|
|
76
|
+
return error.message;
|
|
77
|
+
const execError = error;
|
|
78
|
+
return execError?.stderr ?? execError?.stdout ?? String(error);
|
|
78
79
|
}
|
|
79
80
|
class Menu {
|
|
80
81
|
/**
|
package/dist/core/Menu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../src/core/Menu.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,qCAAkC;AAClC,uCAAoC;AAOvB,QAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AAEnC,SAAS,gBAAgB,CAAC,KAAc;IACpC,OAAO,OAAO,CAAC,KAAK,CAAC;WACd,OAAO,KAAK,KAAK,QAAQ;WACzB,OAAO,IAAK,KAAgB;WAC5B,SAAS,IAAK,KAAgB,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB;IAExC,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;IAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAErC,MAAM,OAAO,GAAG,KAMf,CAAC;QAEF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5E,CAAC;QAED,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO;gBACH,IAAI,EAAE,MAAM;gBACZ,GAAG,EAAE,OAAO,CAAC,MAAM;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;aAC3B,CAAC;QACN,CAAC;IAEL,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEvE,CAAC;AAED,SAAS,iBAAiB,CAAC,YAAoB;IAC3C,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAChC,
|
|
1
|
+
{"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../src/core/Menu.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Notifier.js
CHANGED
|
@@ -7,13 +7,13 @@ function toMessage(error) {
|
|
|
7
7
|
return error.message;
|
|
8
8
|
}
|
|
9
9
|
const maybeExecError = error;
|
|
10
|
-
|
|
11
|
-
return
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
const lastLine = (text) => {
|
|
11
|
+
return text ? text.trim().split("\n").pop() || text : undefined;
|
|
12
|
+
};
|
|
13
|
+
return lastLine(maybeExecError?.stderr)
|
|
14
|
+
|| lastLine(maybeExecError?.stdout)
|
|
15
|
+
|| maybeExecError?.message
|
|
16
|
+
|| String(error);
|
|
17
17
|
}
|
|
18
18
|
class Notifier {
|
|
19
19
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Notifier.js","sourceRoot":"","sources":["../../src/core/Notifier.ts"],"names":[],"mappings":";;;AAGA,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,SAAS,SAAS,CAAC,KAAc;IAE7B,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"Notifier.js","sourceRoot":"","sources":["../../src/core/Notifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,8 @@ import type { ErrorClassifier } from "./types";
|
|
|
19
19
|
export declare function byCommand(map: Record<string, string>): ErrorClassifier;
|
|
20
20
|
/**
|
|
21
21
|
* Clasificador de fábrica: prueba una lista de [regex, área] contra el
|
|
22
|
-
* stderr/mensaje del error y devuelve el
|
|
22
|
+
* stderr (o stdout si stderr viene vacío) /mensaje del error y devuelve el
|
|
23
|
+
* área del primer patrón que matchee.
|
|
23
24
|
*
|
|
24
25
|
* Ejemplo:
|
|
25
26
|
* notifier.classify(classifiers.byPattern([
|
package/dist/core/classifiers.js
CHANGED
|
@@ -29,7 +29,8 @@ function byCommand(map) {
|
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
31
|
* Clasificador de fábrica: prueba una lista de [regex, área] contra el
|
|
32
|
-
* stderr/mensaje del error y devuelve el
|
|
32
|
+
* stderr (o stdout si stderr viene vacío) /mensaje del error y devuelve el
|
|
33
|
+
* área del primer patrón que matchee.
|
|
33
34
|
*
|
|
34
35
|
* Ejemplo:
|
|
35
36
|
* notifier.classify(classifiers.byPattern([
|
|
@@ -41,7 +42,7 @@ function byCommand(map) {
|
|
|
41
42
|
function byPattern(rules) {
|
|
42
43
|
return (error) => {
|
|
43
44
|
const execError = error;
|
|
44
|
-
const text = execError?.stderr || execError?.message || String(error);
|
|
45
|
+
const text = execError?.stderr || execError?.stdout || execError?.message || String(error);
|
|
45
46
|
for (const [pattern, area] of rules) {
|
|
46
47
|
if (pattern.test(text)) {
|
|
47
48
|
return area;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"classifiers.js","sourceRoot":"","sources":["../../src/core/classifiers.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"classifiers.js","sourceRoot":"","sources":["../../src/core/classifiers.ts"],"names":[],"mappings":";;AA0BA,8BAYC;AAcD,8BAiBC;AA5DD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,SAAS,CAAC,GAA2B;IAEjD,OAAO,CAAC,KAAc,EAAE,EAAE;QAEtB,MAAM,OAAO,GAAI,KAAuB,EAAE,OAAO,CAAC;QAElD,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,CAAC,CAAC;AAEN,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,SAAS,CAAC,KAA8B;IAEpD,OAAO,CAAC,KAAc,EAAE,EAAE;QAEtB,MAAM,SAAS,GAAG,KAAsB,CAAC;QACzC,MAAM,IAAI,GAAG,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAE3F,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IAErB,CAAC,CAAC;AAEN,CAAC"}
|
package/dist/core/messages.d.ts
CHANGED
|
@@ -2,8 +2,9 @@ import type { Context } from "./Context";
|
|
|
2
2
|
import type { ErrorMessageFormatter } from "./types";
|
|
3
3
|
/**
|
|
4
4
|
* Formateador de fábrica: prueba una lista de [regex, mensaje] contra el
|
|
5
|
-
* stderr
|
|
6
|
-
*
|
|
5
|
+
* stderr (o stdout si stderr viene vacío, p. ej. errores de `oc` que se
|
|
6
|
+
* imprimen en stdout) /mensaje del error y devuelve el mensaje personalizado
|
|
7
|
+
* del primer patrón que matchee, en vez del stderr crudo.
|
|
7
8
|
*
|
|
8
9
|
* Ojo: esto NO distingue por comando — un mismo patrón (ej. "500 Internal
|
|
9
10
|
* Server Error") aplica igual venga de `docker`, `kubectl` o `terraform`.
|
package/dist/core/messages.js
CHANGED
|
@@ -5,12 +5,13 @@ exports.byCommand = byCommand;
|
|
|
5
5
|
exports.byRule = byRule;
|
|
6
6
|
function textOf(error) {
|
|
7
7
|
const execError = error;
|
|
8
|
-
return execError?.stderr || execError?.message || String(error);
|
|
8
|
+
return execError?.stderr || execError?.stdout || execError?.message || String(error);
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
11
|
* Formateador de fábrica: prueba una lista de [regex, mensaje] contra el
|
|
12
|
-
* stderr
|
|
13
|
-
*
|
|
12
|
+
* stderr (o stdout si stderr viene vacío, p. ej. errores de `oc` que se
|
|
13
|
+
* imprimen en stdout) /mensaje del error y devuelve el mensaje personalizado
|
|
14
|
+
* del primer patrón que matchee, en vez del stderr crudo.
|
|
14
15
|
*
|
|
15
16
|
* Ojo: esto NO distingue por comando — un mismo patrón (ej. "500 Internal
|
|
16
17
|
* Server Error") aplica igual venga de `docker`, `kubectl` o `terraform`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/core/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import type { ExecResult } from "../core/types";
|
|
1
|
+
import type { ExecOptions, ExecResult } from "../core/types";
|
|
2
2
|
export interface AnsiblePlaybookOptions {
|
|
3
3
|
inventory?: string;
|
|
4
4
|
extraVars?: Record<string, string>;
|
|
5
5
|
tags?: string;
|
|
6
|
+
exec?: ExecOptions;
|
|
6
7
|
}
|
|
7
|
-
export declare function playbook(playbookPath: string, { inventory, extraVars, tags }?: AnsiblePlaybookOptions): Promise<ExecResult>;
|
|
8
|
-
export declare function adhoc(host: string, module: string, moduleArgs?: string): Promise<ExecResult>;
|
|
9
|
-
export declare function vaultEncrypt(file: string): Promise<ExecResult>;
|
|
10
|
-
export declare function vaultDecrypt(file: string): Promise<ExecResult>;
|
|
11
|
-
export declare function galaxyInstall(requirementsFile: string): Promise<ExecResult>;
|
|
8
|
+
export declare function playbook(playbookPath: string, { inventory, extraVars, tags, exec }?: AnsiblePlaybookOptions): Promise<ExecResult>;
|
|
9
|
+
export declare function adhoc(host: string, module: string, moduleArgs?: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
10
|
+
export declare function vaultEncrypt(file: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
11
|
+
export declare function vaultDecrypt(file: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
12
|
+
export declare function galaxyInstall(requirementsFile: string, exec?: ExecOptions): Promise<ExecResult>;
|
package/dist/services/ansible.js
CHANGED
|
@@ -6,7 +6,7 @@ exports.vaultEncrypt = vaultEncrypt;
|
|
|
6
6
|
exports.vaultDecrypt = vaultDecrypt;
|
|
7
7
|
exports.galaxyInstall = galaxyInstall;
|
|
8
8
|
const shell_1 = require("./shell");
|
|
9
|
-
function playbook(playbookPath, { inventory, extraVars = {}, tags } = {}) {
|
|
9
|
+
function playbook(playbookPath, { inventory, extraVars = {}, tags, exec } = {}) {
|
|
10
10
|
const args = ["-i", inventory || "inventory.ini", playbookPath];
|
|
11
11
|
Object.entries(extraVars).forEach(([k, v]) => {
|
|
12
12
|
args.push("--extra-vars", `${k}=${v}`);
|
|
@@ -14,22 +14,22 @@ function playbook(playbookPath, { inventory, extraVars = {}, tags } = {}) {
|
|
|
14
14
|
if (tags) {
|
|
15
15
|
args.push("--tags", tags);
|
|
16
16
|
}
|
|
17
|
-
return shell_1.shell.exec("ansible-playbook", ...args);
|
|
17
|
+
return shell_1.shell.exec("ansible-playbook", ...(0, shell_1.withExecOptions)(args, exec));
|
|
18
18
|
}
|
|
19
|
-
function adhoc(host, module, moduleArgs) {
|
|
19
|
+
function adhoc(host, module, moduleArgs, exec) {
|
|
20
20
|
const args = [host, "-m", module];
|
|
21
21
|
if (moduleArgs) {
|
|
22
22
|
args.push("-a", moduleArgs);
|
|
23
23
|
}
|
|
24
|
-
return shell_1.shell.exec("ansible", ...args);
|
|
24
|
+
return shell_1.shell.exec("ansible", ...(0, shell_1.withExecOptions)(args, exec));
|
|
25
25
|
}
|
|
26
|
-
function vaultEncrypt(file) {
|
|
27
|
-
return shell_1.shell.exec("ansible-vault", "encrypt", file);
|
|
26
|
+
function vaultEncrypt(file, exec) {
|
|
27
|
+
return shell_1.shell.exec("ansible-vault", ...(0, shell_1.withExecOptions)(["encrypt", file], exec));
|
|
28
28
|
}
|
|
29
|
-
function vaultDecrypt(file) {
|
|
30
|
-
return shell_1.shell.exec("ansible-vault", "decrypt", file);
|
|
29
|
+
function vaultDecrypt(file, exec) {
|
|
30
|
+
return shell_1.shell.exec("ansible-vault", ...(0, shell_1.withExecOptions)(["decrypt", file], exec));
|
|
31
31
|
}
|
|
32
|
-
function galaxyInstall(requirementsFile) {
|
|
33
|
-
return shell_1.shell.exec("ansible-galaxy", "install", "-r", requirementsFile);
|
|
32
|
+
function galaxyInstall(requirementsFile, exec) {
|
|
33
|
+
return shell_1.shell.exec("ansible-galaxy", ...(0, shell_1.withExecOptions)(["install", "-r", requirementsFile], exec));
|
|
34
34
|
}
|
|
35
35
|
//# sourceMappingURL=ansible.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ansible.js","sourceRoot":"","sources":["../../src/services/ansible.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"ansible.js","sourceRoot":"","sources":["../../src/services/ansible.ts"],"names":[],"mappings":";;AAUA,4BAcC;AAED,sBAUC;AAED,oCAEC;AAED,oCAEC;AAED,sCAEC;AAhDD,mCAAiD;AAUjD,SAAgB,QAAQ,CAAC,YAAoB,EAAE,EAAE,SAAS,EAAE,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,KAA6B,EAAE;IAEjH,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,eAAe,EAAE,YAAY,CAAC,CAAC;IAEhE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;QACzC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,aAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,IAAA,uBAAe,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAE1E,CAAC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,MAAc,EAAE,UAAmB,EAAE,IAAkB;IAEvF,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAElC,IAAI,UAAU,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,aAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAA,uBAAe,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjE,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAkB;IACzD,OAAO,aAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY,EAAE,IAAkB;IACzD,OAAO,aAAK,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAgB,aAAa,CAAC,gBAAwB,EAAE,IAAkB;IACtE,OAAO,aAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,SAAS,EAAE,IAAI,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvG,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExecResult } from "../core/types";
|
|
2
|
-
export declare function zip(source: string, target: string): Promise<ExecResult>;
|
|
3
|
-
export declare function unzip(file: string, target: string): Promise<ExecResult>;
|
|
4
|
-
export declare function tar(source: string, target: string): Promise<ExecResult>;
|
|
1
|
+
import type { ExecOptions, ExecResult } from "../core/types";
|
|
2
|
+
export declare function zip(source: string, target: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
3
|
+
export declare function unzip(file: string, target: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
4
|
+
export declare function tar(source: string, target: string, exec?: ExecOptions): Promise<ExecResult>;
|
package/dist/services/archive.js
CHANGED
|
@@ -4,13 +4,13 @@ exports.zip = zip;
|
|
|
4
4
|
exports.unzip = unzip;
|
|
5
5
|
exports.tar = tar;
|
|
6
6
|
const shell_1 = require("./shell");
|
|
7
|
-
function zip(source, target) {
|
|
8
|
-
return shell_1.shell.exec("zip", "-r", target, source);
|
|
7
|
+
function zip(source, target, exec) {
|
|
8
|
+
return shell_1.shell.exec("zip", ...(0, shell_1.withExecOptions)(["-r", target, source], exec));
|
|
9
9
|
}
|
|
10
|
-
function unzip(file, target) {
|
|
11
|
-
return shell_1.shell.exec("unzip", file, "-d", target);
|
|
10
|
+
function unzip(file, target, exec) {
|
|
11
|
+
return shell_1.shell.exec("unzip", ...(0, shell_1.withExecOptions)([file, "-d", target], exec));
|
|
12
12
|
}
|
|
13
|
-
function tar(source, target) {
|
|
14
|
-
return shell_1.shell.exec("tar", "-czf", target, source);
|
|
13
|
+
function tar(source, target, exec) {
|
|
14
|
+
return shell_1.shell.exec("tar", ...(0, shell_1.withExecOptions)(["-czf", target, source], exec));
|
|
15
15
|
}
|
|
16
16
|
//# sourceMappingURL=archive.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/services/archive.ts"],"names":[],"mappings":";;AAGA,kBAEC;AAED,sBAEC;AAED,kBAEC;AAbD,
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/services/archive.ts"],"names":[],"mappings":";;AAGA,kBAEC;AAED,sBAEC;AAED,kBAEC;AAbD,mCAAiD;AAGjD,SAAgB,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,IAAkB;IAClE,OAAO,aAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAgB,KAAK,CAAC,IAAY,EAAE,MAAc,EAAE,IAAkB;IAClE,OAAO,aAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,SAAgB,GAAG,CAAC,MAAc,EAAE,MAAc,EAAE,IAAkB;IAClE,OAAO,aAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAA,uBAAe,EAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjF,CAAC"}
|
|
@@ -1,20 +1,23 @@
|
|
|
1
|
-
import type { ExecResult } from "../core/types";
|
|
1
|
+
import type { ExecOptions, ExecResult } from "../core/types";
|
|
2
2
|
export interface ArgoLoginOptions {
|
|
3
3
|
server: string;
|
|
4
4
|
username: string;
|
|
5
5
|
password: string;
|
|
6
6
|
insecure?: boolean;
|
|
7
|
+
exec?: ExecOptions;
|
|
7
8
|
}
|
|
8
9
|
export interface ArgoSyncOptions {
|
|
9
10
|
prune?: boolean;
|
|
11
|
+
exec?: ExecOptions;
|
|
10
12
|
}
|
|
11
13
|
export interface ArgoWaitOptions {
|
|
12
14
|
timeout?: number;
|
|
15
|
+
exec?: ExecOptions;
|
|
13
16
|
}
|
|
14
|
-
export declare function login({ server, username, password, insecure }: ArgoLoginOptions): Promise<ExecResult>;
|
|
15
|
-
export declare function appSync(name: string, { prune }?: ArgoSyncOptions): Promise<ExecResult>;
|
|
16
|
-
export declare function appGet(name: string): Promise<ExecResult>;
|
|
17
|
-
export declare function appWait(name: string, { timeout }?: ArgoWaitOptions): Promise<ExecResult>;
|
|
18
|
-
export declare function appSet(name: string, params?: Record<string, string
|
|
19
|
-
export declare function appList(): Promise<ExecResult>;
|
|
20
|
-
export declare function appRollback(name: string, revisionId: string): Promise<ExecResult>;
|
|
17
|
+
export declare function login({ server, username, password, insecure, exec }: ArgoLoginOptions): Promise<ExecResult>;
|
|
18
|
+
export declare function appSync(name: string, { prune, exec }?: ArgoSyncOptions): Promise<ExecResult>;
|
|
19
|
+
export declare function appGet(name: string, exec?: ExecOptions): Promise<ExecResult>;
|
|
20
|
+
export declare function appWait(name: string, { timeout, exec }?: ArgoWaitOptions): Promise<ExecResult>;
|
|
21
|
+
export declare function appSet(name: string, params?: Record<string, string>, exec?: ExecOptions): Promise<ExecResult>;
|
|
22
|
+
export declare function appList(exec?: ExecOptions): Promise<ExecResult>;
|
|
23
|
+
export declare function appRollback(name: string, revisionId: string, exec?: ExecOptions): Promise<ExecResult>;
|