UNPKG

@gmjs/cli-wrapper

Version:
111 lines (110 loc) 5.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = void 0; const messages_1 = require("./messages"); const parse_util_1 = require("./parse-util"); const special_options_1 = require("./special-options"); function parse(args, config) { const specialOptionsResult = (0, special_options_1.handleSpecialOptions)(args); if (specialOptionsResult) { return specialOptionsResult; } const usedOptionsSet = new Set(); const optionNameMap = (0, parse_util_1.getOptionNameMap)(config.options); const optionShortToLongNameMap = (0, parse_util_1.getOptionShortToLongNameMap)(config.options); const options = []; let index = 0; while (index < args.length) { const optionStr = args[index]; if (!(0, parse_util_1.isValidOptionString)(optionStr)) { return (0, parse_util_1.createErrorParseResult)((0, messages_1.getErrorMessageInvalidOptionFormat)(optionStr)); } const optionNames = (0, parse_util_1.getOptionsFromString)(optionStr); if (optionNames.length === 1) { const optionName = optionNames[0]; const { unknownOption, name, negated } = (0, parse_util_1.normalizeOptionName)(optionName, optionShortToLongNameMap); if (unknownOption) { return (0, parse_util_1.createErrorParseResult)(`Unknown option '${name}'.`); } const option = optionNameMap.get(name); if (!option) { return (0, parse_util_1.createErrorParseResult)(`Unknown option '${name}'.`); } if (negated && option.type !== 'boolean') { return (0, parse_util_1.createErrorParseResult)(`'${name}' is not a boolean option. Only boolean options can be negated.`); } if (usedOptionsSet.has(name)) { return (0, parse_util_1.createErrorParseResult)(`Option '${name}' is used more than once.`); } usedOptionsSet.add(name); if (option.type === 'string') { if (index >= args.length - 1 || args[index + 1].startsWith('-')) { return (0, parse_util_1.createErrorParseResult)(`Option '${name}' requires a value.`); } index++; const value = args[index]; const resultOption = option.multiple ? { type: 'string', name, multiple: true, value: value.split(','), } : { type: 'string', name, multiple: false, value, }; options.push(resultOption); } else if (option.type === 'boolean') { if (index < args.length - 1 && !args[index + 1].startsWith('-')) { return (0, parse_util_1.createErrorParseResult)(`Boolean option '${name}' does not take a value.`); } const resultOption = { type: 'boolean', name, value: !negated, }; options.push(resultOption); } } else { for (const optionName of optionNames) { const { unknownOption, name, negated } = (0, parse_util_1.normalizeOptionName)(optionName, optionShortToLongNameMap); if (unknownOption) { return (0, parse_util_1.createErrorParseResult)(`Unknown option '${name}'.`); } const option = optionNameMap.get(name); if (!option) { return (0, parse_util_1.createErrorParseResult)(`Unknown option '${name}'.`); } if (negated && option.type !== 'boolean') { return (0, parse_util_1.createErrorParseResult)(`'${name}' is not a boolean option. Only boolean options can be negated.`); } if (usedOptionsSet.has(name)) { return (0, parse_util_1.createErrorParseResult)(`Option '${name}' is used more than once.`); } usedOptionsSet.add(name); if (option.type === 'string') { return (0, parse_util_1.createErrorParseResult)(`'${name}' is not a boolean option. Only boolean options can be part of options list.`); } else if (option.type === 'boolean') { const resultOption = { type: 'boolean', name, value: !negated, }; options.push(resultOption); } } if (index < args.length - 1 && !args[index + 1].startsWith('-')) { return (0, parse_util_1.createErrorParseResult)(`Option list '${optionNames.join('')}' does not take a value.`); } } index++; } return (0, parse_util_1.createSuccessParseResult)(options); } exports.parse = parse;