@jondotsoy/flags
Version:
A Javascript arguments processor
216 lines • 20.6 kB
JavaScript
;
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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