@vertaaux/cli 0.2.0 → 0.2.2
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/dist/cache/route-cache.d.ts.map +1 -1
- package/dist/cache/route-cache.js +3 -2
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +5 -4
- package/dist/output/envelope.d.ts.map +1 -1
- package/dist/output/envelope.js +46 -2
- package/dist/output/sarif.d.ts.map +1 -1
- package/dist/output/sarif.js +3 -2
- package/dist/utils/validators.d.ts +3 -3
- package/dist/utils/validators.js +11 -11
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-cache.d.ts","sourceRoot":"","sources":["../../src/cache/route-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"route-cache.d.ts","sourceRoot":"","sources":["../../src/cache/route-cache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAsB/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAiB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAexD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAiBT;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,GAAG,IAAI,CAYjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CASN;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,SAA0B,GAC/B,MAAM,CAeR;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CA+BA"}
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import path from "path";
|
|
10
10
|
import { createHash } from "crypto";
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
import { getVersion } from "../ui/banner.js";
|
|
12
|
+
// Get CLI version for cache invalidation (read from package.json)
|
|
13
|
+
const CLI_VERSION = getVersion();
|
|
13
14
|
/** Default cache file location */
|
|
14
15
|
const CACHE_FILE = ".vertaaux/route-cache.json";
|
|
15
16
|
/** Current cache format version */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,MAAM,WAAW,mBAAmB;IAElC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAG5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAGvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8EpC,MAAM,WAAW,mBAAmB;IAElC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAG5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IAGvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAGnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA4tBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiT3D"}
|
package/dist/commands/audit.js
CHANGED
|
@@ -28,8 +28,9 @@ import chalk from "chalk";
|
|
|
28
28
|
import semver from "semver";
|
|
29
29
|
// Artifact directory
|
|
30
30
|
const ARTIFACTS_DIR = ".vertaaux/artifacts";
|
|
31
|
-
// CLI version for policy version requirements
|
|
32
|
-
|
|
31
|
+
// CLI version for policy version requirements (read from package.json)
|
|
32
|
+
import { getVersion } from "../ui/banner.js";
|
|
33
|
+
const CLI_VERSION = getVersion();
|
|
33
34
|
/**
|
|
34
35
|
* Detect current branch from CI environment or git.
|
|
35
36
|
*/
|
|
@@ -402,7 +403,7 @@ async function executeAudit(targetUrl, options, config) {
|
|
|
402
403
|
if (format === "json") {
|
|
403
404
|
if (options.output) {
|
|
404
405
|
const output = JSON.stringify(createEnvelope(created, "audit"), null, 2);
|
|
405
|
-
const filePath = writeOutputToFile(output, options.output
|
|
406
|
+
const filePath = writeOutputToFile(output, options.output);
|
|
406
407
|
if (filePath && !quiet) {
|
|
407
408
|
console.error(`Report written to: ${filePath}`);
|
|
408
409
|
}
|
|
@@ -527,7 +528,7 @@ async function executeAudit(targetUrl, options, config) {
|
|
|
527
528
|
if (format === "json") {
|
|
528
529
|
if (options.output) {
|
|
529
530
|
const jsonStr = JSON.stringify(createEnvelope(filteredResult, "audit"), null, 2);
|
|
530
|
-
const filePath = writeOutputToFile(jsonStr, options.output
|
|
531
|
+
const filePath = writeOutputToFile(jsonStr, options.output);
|
|
531
532
|
if (filePath && !quiet) {
|
|
532
533
|
console.error(`Report written to: ${filePath}`);
|
|
533
534
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/output/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;CACT;
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/output/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC;CACT;AA0DD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAU7E;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
package/dist/output/envelope.js
CHANGED
|
@@ -6,14 +6,58 @@
|
|
|
6
6
|
* provenance information for debugging and version tracking.
|
|
7
7
|
*/
|
|
8
8
|
import { getVersion } from "../ui/banner.js";
|
|
9
|
+
/** Flags whose next argument is a secret value that must be redacted. */
|
|
10
|
+
const SECRET_FLAGS = new Set([
|
|
11
|
+
"--github-token",
|
|
12
|
+
"--gitlab-token",
|
|
13
|
+
"--api-key",
|
|
14
|
+
]);
|
|
15
|
+
/** Returns true if an arg looks like it contains or is a secret. */
|
|
16
|
+
function isSecretArg(arg) {
|
|
17
|
+
return (arg.includes("VERTAAUX_API_KEY") ||
|
|
18
|
+
arg.includes("Bearer") ||
|
|
19
|
+
arg.includes("GITHUB_TOKEN") ||
|
|
20
|
+
arg.includes("GITLAB_TOKEN") ||
|
|
21
|
+
arg.includes("CI_JOB_TOKEN"));
|
|
22
|
+
}
|
|
23
|
+
/** Redact secret values from CLI args for safe envelope output. */
|
|
24
|
+
function redactArgs(argv) {
|
|
25
|
+
const result = [];
|
|
26
|
+
let skipNext = false;
|
|
27
|
+
for (const arg of argv) {
|
|
28
|
+
if (skipNext) {
|
|
29
|
+
result.push("[REDACTED]");
|
|
30
|
+
skipNext = false;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (SECRET_FLAGS.has(arg)) {
|
|
34
|
+
result.push(arg);
|
|
35
|
+
skipNext = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Handle --flag=value form for secret flags
|
|
39
|
+
const eqIdx = arg.indexOf("=");
|
|
40
|
+
if (eqIdx > 0) {
|
|
41
|
+
const flag = arg.slice(0, eqIdx);
|
|
42
|
+
if (SECRET_FLAGS.has(flag)) {
|
|
43
|
+
result.push(`${flag}=[REDACTED]`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (isSecretArg(arg)) {
|
|
48
|
+
continue; // drop entirely (env var leaks like VERTAAUX_API_KEY=...)
|
|
49
|
+
}
|
|
50
|
+
result.push(arg);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
9
54
|
export function createEnvelope(data, command) {
|
|
10
55
|
return {
|
|
11
56
|
meta: {
|
|
12
57
|
version: getVersion(),
|
|
13
58
|
timestamp: new Date().toISOString(),
|
|
14
59
|
command,
|
|
15
|
-
|
|
16
|
-
args: process.argv.slice(2).filter(a => !a.includes("VERTAAUX_API_KEY") && !a.includes("Bearer")),
|
|
60
|
+
args: redactArgs(process.argv.slice(2)),
|
|
17
61
|
},
|
|
18
62
|
data,
|
|
19
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/output/sarif.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../src/output/sarif.ts"],"names":[],"mappings":"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"}
|
package/dist/output/sarif.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* @see https://docs.github.com/en/code-security/code-scanning/integrating-with-code-scanning/sarif-support-for-code-scanning
|
|
9
9
|
*/
|
|
10
10
|
import { generateFingerprint } from "../baseline/hash.js";
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
import { getVersion } from "../ui/banner.js";
|
|
12
|
+
// Package version for tool.driver.version (read from package.json)
|
|
13
|
+
const CLI_VERSION = getVersion();
|
|
13
14
|
// GitHub Code Scanning limits
|
|
14
15
|
const MAX_RESULTS = 25000;
|
|
15
16
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure validation functions for CLI option parsing.
|
|
3
3
|
*
|
|
4
|
-
* All validators throw Commander's
|
|
4
|
+
* All validators throw Commander's InvalidOptionArgumentError on failure,
|
|
5
5
|
* which integrates with Commander's built-in error handling pipeline.
|
|
6
6
|
* No process.exit calls -- callers decide error handling.
|
|
7
7
|
*
|
|
@@ -19,14 +19,14 @@ export interface NumericConstraint {
|
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
21
|
* Validate and parse a numeric string value.
|
|
22
|
-
* Throws
|
|
22
|
+
* Throws InvalidOptionArgumentError with descriptive message on failure.
|
|
23
23
|
*
|
|
24
24
|
* Uses Number() (not parseInt) to reject partial parses like "12abc".
|
|
25
25
|
*/
|
|
26
26
|
export declare function validateNumeric(value: string, name: string, constraints?: NumericConstraint): number;
|
|
27
27
|
/**
|
|
28
28
|
* Validate a string value against an allowed set.
|
|
29
|
-
* Throws
|
|
29
|
+
* Throws InvalidOptionArgumentError with "Did you mean?" suggestion on typos.
|
|
30
30
|
*/
|
|
31
31
|
export declare function validateEnum(value: string, name: string, allowed: readonly string[]): string;
|
|
32
32
|
export declare function parseTimeout(value: string): number;
|
package/dist/utils/validators.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure validation functions for CLI option parsing.
|
|
3
3
|
*
|
|
4
|
-
* All validators throw Commander's
|
|
4
|
+
* All validators throw Commander's InvalidOptionArgumentError on failure,
|
|
5
5
|
* which integrates with Commander's built-in error handling pipeline.
|
|
6
6
|
* No process.exit calls -- callers decide error handling.
|
|
7
7
|
*
|
|
8
8
|
* Includes Levenshtein distance for "Did you mean?" suggestions on enum typos.
|
|
9
9
|
*/
|
|
10
|
-
import {
|
|
10
|
+
import { InvalidOptionArgumentError } from "commander";
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
12
12
|
// Levenshtein distance (private)
|
|
13
13
|
// ---------------------------------------------------------------------------
|
|
@@ -52,26 +52,26 @@ export function closestMatch(input, candidates, maxDistance = 3) {
|
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
54
|
* Validate and parse a numeric string value.
|
|
55
|
-
* Throws
|
|
55
|
+
* Throws InvalidOptionArgumentError with descriptive message on failure.
|
|
56
56
|
*
|
|
57
57
|
* Uses Number() (not parseInt) to reject partial parses like "12abc".
|
|
58
58
|
*/
|
|
59
59
|
export function validateNumeric(value, name, constraints = {}) {
|
|
60
60
|
if (value.trim() === "") {
|
|
61
|
-
throw new
|
|
61
|
+
throw new InvalidOptionArgumentError(`Invalid value for --${name}: "${value}" is not a number`);
|
|
62
62
|
}
|
|
63
63
|
const parsed = Number(value);
|
|
64
64
|
if (Number.isNaN(parsed)) {
|
|
65
|
-
throw new
|
|
65
|
+
throw new InvalidOptionArgumentError(`Invalid value for --${name}: "${value}" is not a number`);
|
|
66
66
|
}
|
|
67
67
|
if (constraints.integer && !Number.isInteger(parsed)) {
|
|
68
|
-
throw new
|
|
68
|
+
throw new InvalidOptionArgumentError(`Invalid value for --${name}: "${value}" must be an integer`);
|
|
69
69
|
}
|
|
70
70
|
if (constraints.min !== undefined && parsed < constraints.min) {
|
|
71
|
-
throw new
|
|
71
|
+
throw new InvalidOptionArgumentError(`Invalid value for --${name}: ${parsed} is below minimum ${constraints.min}`);
|
|
72
72
|
}
|
|
73
73
|
if (constraints.max !== undefined && parsed > constraints.max) {
|
|
74
|
-
throw new
|
|
74
|
+
throw new InvalidOptionArgumentError(`Invalid value for --${name}: ${parsed} exceeds maximum ${constraints.max}`);
|
|
75
75
|
}
|
|
76
76
|
return parsed;
|
|
77
77
|
}
|
|
@@ -80,20 +80,20 @@ export function validateNumeric(value, name, constraints = {}) {
|
|
|
80
80
|
// ---------------------------------------------------------------------------
|
|
81
81
|
/**
|
|
82
82
|
* Validate a string value against an allowed set.
|
|
83
|
-
* Throws
|
|
83
|
+
* Throws InvalidOptionArgumentError with "Did you mean?" suggestion on typos.
|
|
84
84
|
*/
|
|
85
85
|
export function validateEnum(value, name, allowed) {
|
|
86
86
|
if (allowed.includes(value))
|
|
87
87
|
return value;
|
|
88
88
|
const suggestion = closestMatch(value, allowed);
|
|
89
89
|
const hint = suggestion ? ` Did you mean "${suggestion}"?` : "";
|
|
90
|
-
throw new
|
|
90
|
+
throw new InvalidOptionArgumentError(`Unknown value "${value}" for --${name}.${hint} Valid values: ${allowed.join(", ")}`);
|
|
91
91
|
}
|
|
92
92
|
// ---------------------------------------------------------------------------
|
|
93
93
|
// Convenience Commander parser factories
|
|
94
94
|
// ---------------------------------------------------------------------------
|
|
95
95
|
// These are used as the 3rd argument to Commander's .option() method.
|
|
96
|
-
// Commander catches
|
|
96
|
+
// Commander catches InvalidOptionArgumentError and routes it through configureOutput.
|
|
97
97
|
export function parseTimeout(value) {
|
|
98
98
|
return validateNumeric(value, "timeout", { min: 1, max: 300000, integer: true });
|
|
99
99
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vertaaux/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "VertaaUX CLI for UX audits, accessibility checks, and CI gating.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,8 +24,10 @@
|
|
|
24
24
|
],
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
27
|
-
"url": "https://github.com/
|
|
27
|
+
"url": "https://github.com/PetriLahdelma/vertaa",
|
|
28
|
+
"directory": "cli"
|
|
28
29
|
},
|
|
30
|
+
"homepage": "https://github.com/PetriLahdelma/vertaa/tree/main/cli#readme",
|
|
29
31
|
"license": "MIT",
|
|
30
32
|
"publishConfig": {
|
|
31
33
|
"access": "public"
|