UNPKG

@jondotsoy/flags

Version:

A Javascript arguments processor

193 lines 18.5 kB
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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