@jondotsoy/flags
Version:
A Javascript arguments processor
193 lines • 18.5 kB
JavaScript
import { render, componentModules } from "@jondotsoy/console-draw";
export { FlagsError } from "./src/common/errors/flags.error.js";
import { UnknownArgumentError } from "./src/common/errors/unknown-argument.error.js";
const h = componentModules.createElement.bind(componentModules);
export const rule = (test, handler, ...specs) => [describe(test, ...specs), handler];
export const flag = (...flags) => describe((arg, ctx) => flags.some((flag) => {
if (flag === arg)
return true;
if (arg.startsWith(`${flag}=`)) {
ctx.argValue = arg.substring(`${flag}=`.length);
return true;
}
}), { category: "flag", names: flags });
export const command = (command) => describe((arg, ctx) => {
if (arg === command) {
ctx.index += 1;
return true;
}
return false;
}, { category: "command", names: [command] });
/** @deprecated prefer {@link argument} */
export const commandOption = (optionName) => (arg, ctx) => {
if (ctx.flags[optionName] === undefined) {
ctx.argValue = arg;
return true;
}
return false;
};
/**
* Creates a handler function for processing command-line flags and updating a property on the flags object.
*
* @template T - The type of the flags object.
* @param propName - The property name on the flags object to update.
* @param reducer - A function that receives the current context, the accumulated value, and the flag value (as a string or null),
* and returns the next value to set for the property.
* @param requireValue - Optional. If `true` (default), the handler expects a value for the flag; if `false`, the flag is treated as a boolean.
* @returns A handler function that processes the flag and updates the specified property on the flags object.
*
* @remarks
* The handler uses the provided reducer to determine the next value for the property.
* If `requireValue` is enabled and no value is provided, the handler advances the argument index.
*/
export const flagHandler = (propName, reducer, requireValue) => {
return (ctx) => {
const { flags, argValue, args, nextIndex } = ctx;
const isValueMissing = !argValue;
const isRequireValueEnabled = requireValue ?? true;
const currentFlagValue = Reflect.get(flags, propName);
if (isValueMissing && isRequireValueEnabled) {
ctx.nextIndex += 1;
}
const value = isRequireValueEnabled
? (argValue ?? args.at(nextIndex) ?? null)
: null;
const nextFlagValue = reducer(ctx, currentFlagValue, value);
Reflect.set(flags, propName, nextFlagValue);
};
};
export const isBooleanAt = (propName) => ({ flags }) => Reflect.set(flags, propName, true);
export const isStringAt = (propName) => flagHandler(propName, (_ctx, _, value) => value);
export const isNumberAt = (propName) => flagHandler(propName, (_ctx, _, value) => Number(value));
export const isArrayStringAt = (propName) => flagHandler(propName, (_ctx, accumulate = [], value) => [
...(Array.isArray(accumulate) ? accumulate : [accumulate]),
value,
]);
export const isArrayNumberAt = (propName) => flagHandler(propName, (_ctx, accumulate = [], value) => [
...(Array.isArray(accumulate) ? accumulate : [accumulate]),
Number(value),
]);
export const any = () => () => true;
export const restArgumentsAt = (propName) => (ctx) => {
const restArgs = ctx.args.slice(ctx.index, ctx.args.length);
ctx.nextIndex = ctx.args.length;
Reflect.set(ctx.flags, propName, restArgs);
};
export const describe = (test, ...specs) => {
const { description, category, names } = Object.assign({}, ...specs);
if (description) {
test.description = description;
}
if (category) {
test.category = category;
}
if (names) {
test.names = names;
}
return test;
};
export function* getSpecs(rules) {
for (const [test] of rules) {
yield {
names: test.names,
category: test.category,
description: test.description,
};
}
}
export const makeHelpMessage = (command, rules, samples) => {
const terminalWidth = parseInt(process.env.COLUMNS ?? "80");
const byCategory = {};
const specNames = new Map();
const lengthPerCategory = new Map();
for (const spec of getSpecs(rules)) {
if (spec.category) {
byCategory[spec.category] = [...(byCategory[spec.category] ?? []), spec];
if (spec.names && !specNames.has(spec.names)) {
const namesLiteral = spec.names.join(", ");
specNames.set(spec.names, namesLiteral);
const currentLength = lengthPerCategory.get(spec.category) ?? 0;
if (namesLiteral.length > currentLength) {
lengthPerCategory.set(spec.category, namesLiteral.length);
}
}
}
}
const lines = [];
const w = (str, callbackfn) => str ? callbackfn(str) : undefined;
const usageSection = h("columns", { columns: 2, gap: 1, columnsTemplate: [{ width: 6 }] }, [
h("text", "Usage:"),
h("div", [
h("text", w(samples?.at(0), (e) => `${command} ${e}`) ?? command),
...Array.from(samples?.slice(1).map((e) => `${command} ${e}`) ?? [], (e) => h("text", e)),
]),
]);
const otherComponents = [];
for (const [categoryName, specs] of Object.entries(byCategory)) {
const sectionComponents = [];
sectionComponents.push(h("text", `${categoryName}:`));
let widthFlags = 0;
const linesOptions = [];
for (const spec of specs) {
if (spec.names) {
const flags = specNames.get(spec.names) ?? "";
const description = spec.description ?? "";
widthFlags = Math.max(widthFlags, flags.length);
linesOptions.push([h("text", flags), h("text", description)]);
}
}
for (const [flags, desc] of linesOptions) {
sectionComponents.push(h("columns", {
gap: 3,
columns: 3,
columnsTemplate: [{ width: 0 }, { width: widthFlags }],
}, [h("text"), flags, desc]));
}
otherComponents.push(...sectionComponents, h("text"));
}
return render(h("div", [usageSection, h("text"), ...otherComponents]), {
width: terminalWidth,
});
};
export const flags = (args, init, parses) => {
let index = 0;
while (index < args.length) {
const arg = args[index];
const ctx = {
arg,
argValue: null,
args,
flags: init,
index,
nextIndex: index + 1,
};
const rule = parses.find(([test]) => {
return test(ctx.arg, ctx);
});
if (!rule)
throw new UnknownArgumentError(arg);
const [, handler] = rule;
handler(ctx);
index = ctx.nextIndex;
}
return init;
};
/**
* Catch the next argument.
*
* @example
* const options = flags(["foo"],{}, [rule(argument(), isStringAt("arg"))])
* options.arg // => "foo"
*/
export const argument = () => {
const uniqueInvocation = Symbol();
return (arg, ctx) => {
if (argument.visited.has(uniqueInvocation))
return false;
argument.visited.add(uniqueInvocation);
ctx.argValue = arg;
return true;
};
};
argument.visited = new Set();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXJGLE1BQU0sQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQXlCaEUsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQ2xCLElBQWEsRUFDYixPQUFtQixFQUNuQixHQUFHLEtBQWEsRUFDUCxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUksR0FBRyxLQUFlLEVBQVcsRUFBRSxDQUNyRCxRQUFRLENBQ04sQ0FBQyxHQUFHLEVBQUUsR0FBZSxFQUFFLEVBQUUsQ0FDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO0lBQ2xCLElBQUksSUFBSSxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM5QixJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLEVBQ0osRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDbkMsQ0FBQztB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