behind one '-' delimiter. * @example * isShortOptionGroup('-a', {}) // returns false * isShortOptionGroup('-ab', {}) // returns true * // -fb is an option and a value, not a short option group * isShortOptionGroup('-fb', { * options: { f: { type: 'string' } } * }) // returns false * isShortOptionGroup('-bf', { * options: { f: { type: 'string' } } * }) // returns true * // -bfb is an edge case, return true and caller sorts it out * isShortOptionGroup('-bfb', { * options: { f: { type: 'string' } } * }) // returns true */ function isShortOptionGroup(arg, options) { if (arg.length <= 2) return false; if (StringPrototypeCharAt(arg, 0) !== '-') return false; if (StringPrototypeCharAt(arg, 1) === '-') return false; const firstShort = StringPrototypeCharAt(arg, 1); const longOption = findLongOptionForShort(firstShort, options); return optionsGetOwn(options, longOption, 'type') !== 'string'; } /** * Determine if arg is a short string option followed by its value. * @example * isShortOptionAndValue('-a', {}); // returns false * isShortOptionAndValue('-ab', {}); // returns false * isShortOptionAndValue('-fFILE', { * options: { foo: { short: 'f', type: 'string' }} * }) // returns true */ function isShortOptionAndValue(arg, options) { validateObject(options, 'options'); if (arg.length <= 2) return false; if (StringPrototypeCharAt(arg, 0) !== '-') return false; if (StringPrototypeCharAt(arg, 1) === '-') return false; const shortOption = StringPrototypeCharAt(arg, 1); const longOption = findLongOptionForShort(shortOption, options); return optionsGetOwn(options, longOption, 'type') === 'string'; } /** * Find the long option associated with a short option. Looks for a configured * `short` and returns the short option itself if a long option is not found. * @example * findLongOptionForShort('a', {}) // returns 'a' * findLongOptionForShort('b', { * options: { bar: { short: 'b' } } * }) // returns 'bar' */ function findLongOptionForShort(shortOption, options) { validateObject(options, 'options'); const longOptionEntry = ArrayPrototypeFind( ObjectEntries(options), ({ 1: optionConfig }) => objectGetOwn(optionConfig, 'short') === shortOption, ); return longOptionEntry?.[0] ?? shortOption; } /** * Check if the given option includes a default value * and that option has not been set by the input args. * @param {string} longOption - long option name e.g. 'foo' * @param {object} optionConfig - the option configuration properties * @param {object} values - option values returned in `values` by parseArgs */ function useDefaultValueOption(longOption, optionConfig, values) { return objectGetOwn(optionConfig, 'default') !== undefined && values[longOption] === undefined; } module.exports = { findLongOptionForShort, isLoneLongOption, isLoneShortOption, isLongOptionAndValue, isOptionValue, isOptionLikeValue, isShortOptionAndValue, isShortOptionGroup, useDefaultValueOption, objectGetOwn, optionsGetOwn, };