UNPKG

@jondotsoy/flags

Version:

A Javascript arguments processor

216 lines 20.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.argument = exports.flags = exports.makeHelpMessage = exports.describe = exports.restArgumentsAt = exports.any = exports.isArrayNumberAt = exports.isArrayStringAt = exports.isNumberAt = exports.isStringAt = exports.isBooleanAt = exports.flagHandler = exports.commandOption = exports.command = exports.flag = exports.rule = exports.FlagsError = void 0; exports.getSpecs = getSpecs; const console_draw_1 = require("@jondotsoy/console-draw"); var flags_error_js_1 = require("./src/common/errors/flags.error.js"); Object.defineProperty(exports, "FlagsError", { enumerable: true, get: function () { return flags_error_js_1.FlagsError; } }); const unknown_argument_error_js_1 = require("./src/common/errors/unknown-argument.error.js"); const h = console_draw_1.componentModules.createElement.bind(console_draw_1.componentModules); const rule = (test, handler, ...specs) => [(0, exports.describe)(test, ...specs), handler]; exports.rule = rule; const flag = (...flags) => (0, exports.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 }); exports.flag = flag; const command = (command) => (0, exports.describe)((arg, ctx) => { if (arg === command) { ctx.index += 1; return true; } return false; }, { category: "command", names: [command] }); exports.command = command; /** @deprecated prefer {@link argument} */ const commandOption = (optionName) => (arg, ctx) => { if (ctx.flags[optionName] === undefined) { ctx.argValue = arg; return true; } return false; }; exports.commandOption = commandOption; /** * 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. */ const flagHandler = (propName, reducer, requireValue) => { return (ctx) => { var _a; const { flags, argValue, args, nextIndex } = ctx; const isValueMissing = !argValue; const isRequireValueEnabled = requireValue !== null && requireValue !== void 0 ? requireValue : true; const currentFlagValue = Reflect.get(flags, propName); if (isValueMissing && isRequireValueEnabled) { ctx.nextIndex += 1; } const value = isRequireValueEnabled ? ((_a = argValue !== null && argValue !== void 0 ? argValue : args.at(nextIndex)) !== null && _a !== void 0 ? _a : null) : null; const nextFlagValue = reducer(ctx, currentFlagValue, value); Reflect.set(flags, propName, nextFlagValue); }; }; exports.flagHandler = flagHandler; const isBooleanAt = (propName) => ({ flags }) => Reflect.set(flags, propName, true); exports.isBooleanAt = isBooleanAt; const isStringAt = (propName) => (0, exports.flagHandler)(propName, (_ctx, _, value) => value); exports.isStringAt = isStringAt; const isNumberAt = (propName) => (0, exports.flagHandler)(propName, (_ctx, _, value) => Number(value)); exports.isNumberAt = isNumberAt; const isArrayStringAt = (propName) => (0, exports.flagHandler)(propName, (_ctx, accumulate = [], value) => [ ...(Array.isArray(accumulate) ? accumulate : [accumulate]), value, ]); exports.isArrayStringAt = isArrayStringAt; const isArrayNumberAt = (propName) => (0, exports.flagHandler)(propName, (_ctx, accumulate = [], value) => [ ...(Array.isArray(accumulate) ? accumulate : [accumulate]), Number(value), ]); exports.isArrayNumberAt = isArrayNumberAt; const any = () => () => true; exports.any = any; 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); }; exports.restArgumentsAt = restArgumentsAt; 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; }; exports.describe = describe; function* getSpecs(rules) { for (const [test] of rules) { yield { names: test.names, category: test.category, description: test.description, }; } } const makeHelpMessage = (command, rules, samples) => { var _a, _b, _c, _d, _e, _f, _g; const terminalWidth = parseInt((_a = process.env.COLUMNS) !== null && _a !== void 0 ? _a : "80"); const byCategory = {}; const specNames = new Map(); const lengthPerCategory = new Map(); for (const spec of getSpecs(rules)) { if (spec.category) { byCategory[spec.category] = [...((_b = byCategory[spec.category]) !== null && _b !== void 0 ? _b : []), spec]; if (spec.names && !specNames.has(spec.names)) { const namesLiteral = spec.names.join(", "); specNames.set(spec.names, namesLiteral); const currentLength = (_c = lengthPerCategory.get(spec.category)) !== null && _c !== void 0 ? _c : 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", (_d = w(samples === null || samples === void 0 ? void 0 : samples.at(0), (e) => `${command} ${e}`)) !== null && _d !== void 0 ? _d : command), ...Array.from((_e = samples === null || samples === void 0 ? void 0 : samples.slice(1).map((e) => `${command} ${e}`)) !== null && _e !== void 0 ? _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 = (_f = specNames.get(spec.names)) !== null && _f !== void 0 ? _f : ""; const description = (_g = spec.description) !== null && _g !== void 0 ? _g : ""; 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 (0, console_draw_1.render)(h("div", [usageSection, h("text"), ...otherComponents]), { width: terminalWidth, }); }; exports.makeHelpMessage = makeHelpMessage; 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 unknown_argument_error_js_1.UnknownArgumentError(arg); const [, handler] = rule; handler(ctx); index = ctx.nextIndex; } return init; }; exports.flags = flags; /** * Catch the next argument. * * @example * const options = flags(["foo"],{}, [rule(argument(), isStringAt("arg"))]) * options.arg // => "foo" */ const argument = () => { const uniqueInvocation = Symbol(); return (arg, ctx) => { if (exports.argument.visited.has(uniqueInvocation)) return false; exports.argument.visited.add(uniqueInvocation); ctx.argValue = arg; return true; }; }; exports.argument = argument; exports.argument.visited = new Set(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1S0EsNEJBVUM7QUFqTEQsMERBQW1FO0FBQ25FLHFFQUFnRTtBQUF2RCw0R0FBQSxVQUFVLE9BQUE7QUFDbkIsNkZBQXFGO0FBRXJGLE1BQU0sQ0FBQyxHQUFHLCtCQUFnQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsK0JBQWdCLENBQUMsQ0FBQztBQXlCekQsTUFBTSxJQUFJLEdBQUcsQ0FDbEIsSUFBYSxFQUNiLE9BQW1CLEVBQ25CLEdBQUcsS0FBYSxFQUNQLEVBQUUsQ0FBQyxDQUFDLElBQUEsZ0JBQVEsRUFBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUpyQyxRQUFBLElBQUksUUFJaUM7QUFFM0MsTUFBTSxJQUFJLEdBQUcsQ0FBSSxHQUFHLEtBQWUsRUFBVyxFQUFFLENBQ3JELElBQUEsZ0JBQVEsRUFDTixDQUFDLEdBQUcsRUFBRSxHQUFlLEVBQUUsRUFBRSxDQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDbEIsSUFBSSxJQUFJLEtBQUssR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDLENBQUMsRUFDSixFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUNuQyxDQUFDO0FBWFMsUUFBQSxJQUFJLFFBV2I7QUFFRyxNQUFNLE9BQU8sR0FBRyxDQUFJLE9BQWUsRUFB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