UNPKG

@jondotsoy/flags

Version:

A Javascript arguments processor

143 lines 11.4 kB
"use strict"; 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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