@jondotsoy/flags
Version:
A Javascript arguments processor
143 lines • 11.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlagsParser = void 0;
const UnexpectedArgumentError_js_1 = require("./errors/UnexpectedArgumentError.js");
const help_message_js_1 = require("./utils/help-message.js");
// NewFlagsParser implementation
class FlagsParser {
constructor(schema, metadata = {
program: "cli",
}) {
this.schema = schema;
this.metadata = metadata;
this.helpMessage = (options) => (0, help_message_js_1.helpMessage)(this, this.schema, options);
}
program(name) {
return new FlagsParser(this.schema, {
...this.metadata,
program: name,
});
}
describe(description) {
return new FlagsParser(this.schema, {
...this.metadata,
description,
});
}
version(version) {
return new FlagsParser(this.schema, {
...this.metadata,
version,
});
}
combineShortFlags() {
return new FlagsParser(this.schema, {
...this.metadata,
combineShortFlags: true,
});
}
parse(args) {
// Expand combined short flags if option is enabled
const expandedArgs = this.metadata.combineShortFlags
? this.expandCombinedShortFlags(args)
: args;
const result = {};
const usedIndices = new Set();
// Initialize result with initial values from each builder's spec
for (const [key, builder] of Object.entries(this.schema)) {
result[key] = builder.spec.getInitial();
}
// Try to parse each flag in the schema
for (const [key, builder] of Object.entries(this.schema)) {
let parsedValue = null;
let currentValue = undefined;
// Try to parse at each index in expandedArgs
for (let i = 0; i < expandedArgs.length; i++) {
if (usedIndices.has(i))
continue;
const parseResult = builder.parse(i, expandedArgs, currentValue !== undefined ? { current: currentValue } : undefined);
if (parseResult !== null) {
// Mark consumed indices as used
const consumedCount = parseResult.args.length;
for (let j = 0; j < consumedCount; j++) {
usedIndices.add(i + j);
}
parsedValue = parseResult.value;
currentValue = parseResult.value;
// If there's an accumulate function, continue looking for more matches
if (!builder.spec.getAccumulate()) {
break;
}
}
}
// Set the result: use parsed value if found
if (parsedValue !== null) {
result[key] = parsedValue;
}
}
// Check for unrecognized arguments
for (let i = 0; i < expandedArgs.length; i++) {
if (!usedIndices.has(i)) {
throw new UnexpectedArgumentError_js_1.UnexpectedArgumentError(expandedArgs[i]);
}
}
return result;
}
formatError(error) {
const message = error instanceof Error ? error.message : String(error);
return `${message}\n\nRun '${this.metadata.program} --help' for more information\n`;
}
safeParse(args) {
try {
const output = this.parse(args);
return [true, undefined, output];
}
catch (error) {
return [false, error, undefined];
}
}
expandCombinedShortFlags(args) {
const expanded = [];
// Collect all short flag aliases from the schema
const shortFlags = new Set();
for (const builder of Object.values(this.schema)) {
if (builder.spec.hasMetadata("matches")) {
const matches = builder.spec.getMetadata("matches");
for (const match of matches) {
// Short flags are single dash followed by single character
if (match.startsWith("-") &&
!match.startsWith("--") &&
match.length === 2) {
shortFlags.add(match[1]); // Store just the character
}
}
}
}
for (const arg of args) {
// Check if this looks like combined short flags: starts with single dash,
// not followed by another dash, and has multiple characters
if (arg.startsWith("-") &&
!arg.startsWith("--") &&
arg.length > 2 &&
!arg.includes("=")) {
// Check if all characters after the dash are valid short flags
const chars = arg.slice(1);
const allAreShortFlags = chars
.split("")
.every((c) => shortFlags.has(c));
if (allAreShortFlags) {
// Expand into individual flags
for (const char of chars) {
expanded.push(`-${char}`);
}
continue;
}
}
// Not a combined short flag, keep as is
expanded.push(arg);
}
return expanded;
}
}
exports.FlagsParser = FlagsParser;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxhZ3NQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvRmxhZ3NQYXJzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsb0ZBQThFO0FBQzlFLDZEQUErRTtBQVUvRSxnQ0FBZ0M7QUFFaEMsTUFBYSxXQUFXO0lBQ3RCLFlBQ1UsTUFBUyxFQUNSLFdBS0w7UUFDRixPQUFPLEVBQUUsS0FBSztLQUNmO1FBUk8sV0FBTSxHQUFOLE1BQU0sQ0FBRztRQUNSLGFBQVEsR0FBUixRQUFRLENBT2hCO1FBK0JILGdCQUFXLEdBQUcsQ0FBQyxPQUE0QixFQUFFLEVBQUUsQ0FDN0MsSUFBQSw2QkFBVyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBL0J2QyxDQUFDO0lBRUosT0FBTyxDQUFDLElBQVk7UUFDbEIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2xDLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDaEIsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUSxDQUFDLFdBQW1CO1FBQzFCLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNsQyxHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ2hCLFdBQVc7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLE9BQWU7UUFDckIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2xDLEdBQUcsSUFBSSxDQUFDLFFBQVE7WUFDaEIsT0FBTztTQUNSLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbEMsR0FBRyxJQUFJLENBQUMsUUFBUTtZQUNoQixpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENB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