komplian 0.4.0 → 0.4.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/README.md +12 -4
- package/komplian-onboard.mjs +2 -1
- package/komplian-postman.mjs +153 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,17 +10,25 @@
|
|
|
10
10
|
|
|
11
11
|
1. En [Postman](https://postman.com) usa una cuenta con email **`@komplian.com`** (o añade ese email a tu perfil).
|
|
12
12
|
2. Crea una **API key**: Settings → **API keys** → Generate.
|
|
13
|
-
3.
|
|
13
|
+
3. **Una vez por máquina** (guarda la clave en `~/.komplian/postman-api-key`; no hace falta `export` después):
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx komplian postman login
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
4. Cuando quieras sincronizar la colección:
|
|
14
20
|
|
|
15
21
|
```bash
|
|
16
|
-
export POSTMAN_API_KEY=pmak-…
|
|
17
22
|
npx komplian postman --yes
|
|
18
23
|
```
|
|
19
24
|
|
|
20
|
-
|
|
25
|
+
Opcional: `export POSTMAN_API_KEY=…` solo para la sesión actual (tiene prioridad sobre el archivo).
|
|
26
|
+
|
|
27
|
+
El comando llama a `GET https://api.getpostman.com/me` y **solo continúa** si el email de la cuenta es `@komplian.com`. Crea la colección **Komplian API**, los entornos **Komplian — Local Dev** y **Komplian — Production**, y deja copia en `./komplian-postman/*.json`.
|
|
21
28
|
|
|
22
29
|
- Solo exportar archivos (sin subir por API): `npx komplian postman --yes --export-only`
|
|
23
|
-
- Otro workspace: `POSTMAN_WORKSPACE_ID=<id>`
|
|
30
|
+
- Otro workspace: `POSTMAN_WORKSPACE_ID=<id>`
|
|
31
|
+
- Ruta alternativa del archivo de clave: `KOMPLIAN_POSTMAN_KEY_FILE`
|
|
24
32
|
|
|
25
33
|
No OAuth App registration — `gh` uses GitHub’s built-in flow. **Default workspace:** current working directory (`process.cwd()`), not `~/komplian`. Pass a path as last argument to clone elsewhere.
|
|
26
34
|
**Dependencies:** repos with `package-lock.json` use **`npm ci`** (does not modify the lockfile, so no spurious git changes). Repos without a lockfile use **`npm install --no-package-lock`** so onboarding does not create a new `package-lock.json`. Yarn / pnpm repos use frozen lock installs when `yarn` / `pnpm` is on PATH. Unless `KOMPLIAN_NPM_AUDIT=1`, npm runs with `--no-audit --no-fund`.
|
package/komplian-onboard.mjs
CHANGED
|
@@ -396,7 +396,8 @@ function npmInstallEach(workspace) {
|
|
|
396
396
|
function usage() {
|
|
397
397
|
log(`Uso: komplian onboard [opciones] [carpeta] | komplian postman [opciones]`);
|
|
398
398
|
log(` npx komplian onboard --yes`);
|
|
399
|
-
log(` npx komplian postman
|
|
399
|
+
log(` npx komplian postman login ${c.dim}(una vez · guarda API key)${c.reset}`);
|
|
400
|
+
log(` npx komplian postman --yes ${c.dim}(email @komplian.com)${c.reset}`);
|
|
400
401
|
log(``);
|
|
401
402
|
log(` Antes (una vez): gh auth login -h github.com -s repo -s read:org -w`);
|
|
402
403
|
log(` Requisitos: Node 18+, git, GitHub CLI (gh)`);
|
package/komplian-postman.mjs
CHANGED
|
@@ -2,17 +2,23 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Komplian Postman — API key + email @komplian.com (Postman /me), luego colección + entornos.
|
|
4
4
|
*
|
|
5
|
-
* Requisitos: Node 18
|
|
5
|
+
* Requisitos: Node 18+. Primera vez: npx komplian postman login
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* Opcional: POSTMAN_WORKSPACE_ID (si no, usa el primer workspace con permiso de escritura)
|
|
11
|
-
* Opcional: KOMPLIAN_EMAIL_DOMAIN=komplian.com (solo para pruebas internas del script)
|
|
7
|
+
* Clave: POSTMAN_API_KEY o ~/.komplian/postman-api-key (npx komplian postman login)
|
|
8
|
+
* Opcional: POSTMAN_WORKSPACE_ID, KOMPLIAN_EMAIL_DOMAIN, KOMPLIAN_POSTMAN_KEY_FILE
|
|
12
9
|
*/
|
|
13
10
|
|
|
14
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
writeFileSync,
|
|
13
|
+
mkdirSync,
|
|
14
|
+
readFileSync,
|
|
15
|
+
existsSync,
|
|
16
|
+
chmodSync,
|
|
17
|
+
} from "node:fs";
|
|
15
18
|
import { join, resolve } from "node:path";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
21
|
+
import { createInterface } from "node:readline/promises";
|
|
16
22
|
|
|
17
23
|
const POSTMAN_API = "https://api.getpostman.com";
|
|
18
24
|
|
|
@@ -30,6 +36,40 @@ function log(s = "") {
|
|
|
30
36
|
console.log(s);
|
|
31
37
|
}
|
|
32
38
|
|
|
39
|
+
function defaultKeyPath() {
|
|
40
|
+
const override = process.env.KOMPLIAN_POSTMAN_KEY_FILE?.trim();
|
|
41
|
+
if (override) return resolve(override);
|
|
42
|
+
return join(homedir(), ".komplian", "postman-api-key");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Orden: POSTMAN_API_KEY → ~/.komplian/postman-api-key (o KOMPLIAN_POSTMAN_KEY_FILE).
|
|
47
|
+
*/
|
|
48
|
+
function resolveApiKey() {
|
|
49
|
+
const env = process.env.POSTMAN_API_KEY?.trim();
|
|
50
|
+
if (env) return { key: env, source: "POSTMAN_API_KEY" };
|
|
51
|
+
const path = defaultKeyPath();
|
|
52
|
+
if (existsSync(path)) {
|
|
53
|
+
const k = readFileSync(path, "utf8").trim();
|
|
54
|
+
if (k) return { key: k, source: path };
|
|
55
|
+
}
|
|
56
|
+
return { key: "", source: null };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function printMissingKeyHelp() {
|
|
60
|
+
log(`${c.red}✗${c.reset} No hay API key de Postman.`);
|
|
61
|
+
log(``);
|
|
62
|
+
log(` ${c.bold}Una vez por máquina:${c.reset}`);
|
|
63
|
+
log(` ${c.cyan}npx komplian postman login${c.reset}`);
|
|
64
|
+
log(` (pega la clave de Postman → Settings → API keys → Generate)`);
|
|
65
|
+
log(``);
|
|
66
|
+
log(` ${c.dim}O en la sesión actual: export POSTMAN_API_KEY=…${c.reset}`);
|
|
67
|
+
log(
|
|
68
|
+
`${c.dim} Archivo manual: ${defaultKeyPath()}${c.reset}`
|
|
69
|
+
);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
|
|
33
73
|
function headers(apiKey) {
|
|
34
74
|
return {
|
|
35
75
|
"X-API-Key": apiKey,
|
|
@@ -305,7 +345,7 @@ async function verifyKomplianEmail(apiKey, domain) {
|
|
|
305
345
|
const { ok, status, body } = await pmFetch(apiKey, "/me");
|
|
306
346
|
if (!ok) {
|
|
307
347
|
log(
|
|
308
|
-
`${c.red}✗${c.reset}
|
|
348
|
+
`${c.red}✗${c.reset} API key de Postman inválida o sin acceso (${status}).`
|
|
309
349
|
);
|
|
310
350
|
process.exit(1);
|
|
311
351
|
}
|
|
@@ -363,33 +403,126 @@ function parseArgs(argv) {
|
|
|
363
403
|
return out;
|
|
364
404
|
}
|
|
365
405
|
|
|
406
|
+
function parseLoginArgs(argv) {
|
|
407
|
+
const out = { help: false };
|
|
408
|
+
for (const a of argv) {
|
|
409
|
+
if (a === "-h" || a === "--help") out.help = true;
|
|
410
|
+
else if (a.startsWith("-")) {
|
|
411
|
+
log(`${c.red}✗${c.reset} Opción desconocida: ${a}`);
|
|
412
|
+
process.exit(1);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return out;
|
|
416
|
+
}
|
|
417
|
+
|
|
366
418
|
function usage() {
|
|
367
|
-
log(`Uso: komplian postman [opciones]`);
|
|
368
|
-
log(` ${c.dim}POSTMAN_API_KEY${c.reset}
|
|
369
|
-
log(`
|
|
419
|
+
log(`Uso: komplian postman [opciones] | komplian postman login`);
|
|
420
|
+
log(` Clave: ${c.dim}POSTMAN_API_KEY${c.reset} o archivo ${c.dim}~/.komplian/postman-api-key${c.reset} (véase ${c.cyan}postman login${c.reset})`);
|
|
421
|
+
log(` Dominio email: solo @komplian.com (GET /me)`);
|
|
370
422
|
log(``);
|
|
371
|
-
log(` -y, --yes Sin
|
|
423
|
+
log(` -y, --yes Sin prompts extra`);
|
|
372
424
|
log(` --export-only Solo escribe JSON en disco (no llama a la API de Postman)`);
|
|
373
425
|
log(` --out <dir> Carpeta para export (por defecto: ./komplian-postman)`);
|
|
374
426
|
log(` -h, --help`);
|
|
375
427
|
log(``);
|
|
376
|
-
log(` Opcional: POSTMAN_WORKSPACE_ID, KOMPLIAN_EMAIL_DOMAIN
|
|
428
|
+
log(` Opcional: POSTMAN_WORKSPACE_ID, KOMPLIAN_EMAIL_DOMAIN, KOMPLIAN_POSTMAN_KEY_FILE`);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
function usageLogin() {
|
|
432
|
+
log(`Uso: komplian postman login`);
|
|
433
|
+
log(` Guarda la API key de Postman en ${c.dim}~/.komplian/postman-api-key${c.reset} (permiso 600).`);
|
|
434
|
+
log(` Tras esto: ${c.cyan}npx komplian postman --yes${c.reset} sin exportar variables.`);
|
|
435
|
+
log(``);
|
|
436
|
+
log(` Postman → Settings (avatar) → API keys → Generate`);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
async function promptApiKey() {
|
|
440
|
+
if (input.isTTY) {
|
|
441
|
+
const rl = createInterface({ input, output });
|
|
442
|
+
const line = await rl.question(
|
|
443
|
+
`${c.cyan}Pega tu Postman API key${c.reset} (Settings → API keys): `
|
|
444
|
+
);
|
|
445
|
+
rl.close();
|
|
446
|
+
return line.trim();
|
|
447
|
+
}
|
|
448
|
+
return new Promise((resolve, reject) => {
|
|
449
|
+
const chunks = [];
|
|
450
|
+
input.on("data", (d) => chunks.push(d));
|
|
451
|
+
input.on("end", () => {
|
|
452
|
+
resolve(Buffer.concat(chunks).toString("utf8").trim());
|
|
453
|
+
});
|
|
454
|
+
input.on("error", reject);
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
async function runPostmanLogin(argv) {
|
|
459
|
+
const la = parseLoginArgs(argv);
|
|
460
|
+
if (la.help) {
|
|
461
|
+
usageLogin();
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
log(`${c.cyan}━━ Postman login (Komplian) ━━${c.reset}`);
|
|
466
|
+
log(
|
|
467
|
+
`${c.dim}Cuenta con email @komplian.com. Genera la clave en Postman → Settings → API keys.${c.reset}`
|
|
468
|
+
);
|
|
469
|
+
log("");
|
|
470
|
+
|
|
471
|
+
const domain = (process.env.KOMPLIAN_EMAIL_DOMAIN || "komplian.com").trim();
|
|
472
|
+
const keyPath = defaultKeyPath();
|
|
473
|
+
|
|
474
|
+
let apiKey = await promptApiKey();
|
|
475
|
+
if (!apiKey) {
|
|
476
|
+
log(`${c.red}✗${c.reset} Clave vacía.`);
|
|
477
|
+
process.exit(1);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
await verifyKomplianEmail(apiKey, domain);
|
|
481
|
+
|
|
482
|
+
mkdirSync(join(homedir(), ".komplian"), { recursive: true });
|
|
483
|
+
writeFileSync(keyPath, `${apiKey}\n`, { encoding: "utf8", mode: 0o600 });
|
|
484
|
+
try {
|
|
485
|
+
chmodSync(keyPath, 0o600);
|
|
486
|
+
} catch {
|
|
487
|
+
/* Windows puede ignorar chmod */
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
log("");
|
|
491
|
+
log(
|
|
492
|
+
`${c.green}✓${c.reset} Guardada en ${c.bold}${keyPath}${c.reset} (solo tu usuario).`
|
|
493
|
+
);
|
|
494
|
+
log(
|
|
495
|
+
`${c.dim} Siguiente: ${c.reset}${c.cyan}npx komplian postman --yes${c.reset}`
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function normalizePostmanArgv(argv) {
|
|
500
|
+
const a = [...argv];
|
|
501
|
+
if (a[0] === "login") {
|
|
502
|
+
return { mode: "login", rest: a.slice(1) };
|
|
503
|
+
}
|
|
504
|
+
return { mode: "sync", rest: a };
|
|
377
505
|
}
|
|
378
506
|
|
|
379
507
|
export async function runPostman(argv) {
|
|
380
|
-
const
|
|
508
|
+
const { mode, rest } = normalizePostmanArgv(argv);
|
|
509
|
+
if (mode === "login") {
|
|
510
|
+
await runPostmanLogin(rest);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
const args = parseArgs(rest);
|
|
381
515
|
if (args.help) {
|
|
382
516
|
usage();
|
|
383
517
|
return;
|
|
384
518
|
}
|
|
385
519
|
|
|
386
|
-
const apiKey =
|
|
520
|
+
const { key: apiKey, source } = resolveApiKey();
|
|
387
521
|
if (!apiKey) {
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
);
|
|
392
|
-
process.exit(1);
|
|
522
|
+
printMissingKeyHelp();
|
|
523
|
+
}
|
|
524
|
+
if (source && source !== "POSTMAN_API_KEY") {
|
|
525
|
+
log(`${c.dim}→ API key: ${source}${c.reset}`);
|
|
393
526
|
}
|
|
394
527
|
|
|
395
528
|
const domain = (process.env.KOMPLIAN_EMAIL_DOMAIN || "komplian.com").trim();
|