args-json
Version:
Zero-dependency descriptively typed command-line argument parser
88 lines (72 loc) • 2.25 kB
text/typescript
import { getDefaultInput } from "./getDefaultInput.ts";
import { isExplicitlyOff } from "./isExplicitlyOff.ts";
import { isKey } from "./isKey.ts";
import { isOff } from "./isOff.ts";
import { isOn } from "./isOn.ts";
function normalizeInput(input?: string[]) {
let source = input ?? getDefaultInput();
let result = [];
for (let s of source) {
// Split `"--key=value"` into "--key" and "value"
if (s.startsWith("-") && s.includes("=")) {
let key = s.slice(0, s.indexOf("="));
if (isKey(key)) {
result.push(key, s.slice(key.length + 1));
continue;
}
}
result.push(s);
}
return result;
}
export class Args {
_input: string[];
constructor(input?: string[]) {
this._input = normalizeInput(input);
}
hasKey(x: string) {
return isKey(x) && this._input.includes(x);
}
isOn(key: string) {
let args = this._input;
let k = args.indexOf(key);
return (
k !== -1 &&
(k === args.length - 1 || isKey(args[k + 1]) || isOn(args[k + 1]))
);
}
isOff(key: string) {
let args = this._input;
let k = args.indexOf(key);
return k === -1 || isOff(args[k + 1]);
}
isExplicitlyOff(key: string) {
let args = this._input;
let k = args.indexOf(key);
return k !== -1 && isExplicitlyOff(args[k + 1]);
}
getValue(key: string | string[], fallback: string): string;
getValue(key: string | string[]): string | undefined;
getValue(key: string | string[], fallback?: string) {
let args = this._input;
let keys = Array.isArray(key) ? key : [key];
for (let k of keys) {
let i = args.indexOf(k);
if (i !== -1 && args[i + 1] && !isKey(args[i + 1])) return args[i + 1];
}
return fallback;
}
getValues(key: string | string[], fallback: string[]): string[];
getValues(key: string | string[]): string[] | undefined;
getValues(key: string | string[], fallback?: string[]) {
let args = this._input;
let keys = Array.isArray(key) ? key : [key];
let values: string[] = [];
for (let k of keys) {
let i = args.indexOf(k);
while (i !== -1 && args[i + 1] && !isKey(args[i + 1]))
values.push(args[++i]);
}
return values.length === 0 ? fallback : values;
}
}