@gmjs/cli-wrapper
Version:
111 lines (110 loc) • 5.21 kB
JavaScript
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;
;