UNPKG

args-json

Version:

Zero-dependency descriptively typed command-line argument parser

82 lines (80 loc) 2.94 kB
function toCamelCase(x) { let s = x.replace(/^[-_.\s~+]|[-_.\s~+]$/g, ""); if (!/[-_.\s~+]/.test(s)) return s.slice(0, 1).toLowerCase() + s.slice(1); return s.toLowerCase().replace(/[-_.\s~+](\S)/g, (_, match) => match.toUpperCase()); } function toKey(x) { if (x) { if (x.startsWith("--") && x.length > 2) return toCamelCase(x.slice(2)); if (x.startsWith("-") && x.length === 2) return toCamelCase(x.slice(1)); } } function split(x) { let words = [], word = ""; let hasOpenSingleQuote = false; let hasOpenDoubleQuote = false; for (let i = 0; i < x.length; i++) { let c = x[i]; if (/^\s/.test(c) && !hasOpenSingleQuote && !hasOpenDoubleQuote) { if (word) words.push(word); word = ""; continue; } if (c === "'" && x[i - 1] !== "\\") hasOpenSingleQuote = !hasOpenSingleQuote; if (c === "\"" && x[i - 1] !== "\\") hasOpenDoubleQuote = !hasOpenDoubleQuote; word += c; } if (word) words.push(word); return words; } function getDefaultInput() { return typeof process === "undefined" ? [] : process.argv; } function parseArgs(input, map) { let normalizedInput; let normalizedMap; if (input === void 0) normalizedInput = getDefaultInput(); else if (typeof input === "string") normalizedInput = split(input); else if (Array.isArray(input)) normalizedInput = input.map((x) => String(x)); else if (input !== null && typeof input === "object") { normalizedInput = getDefaultInput(); normalizedMap = input; } else normalizedInput = []; normalizedInput = normalizedInput.flatMap((item) => { let normalizedItem = item.trim(); let k = normalizedItem.indexOf("="); if (k === -1) return normalizedItem; return [normalizedItem.slice(0, k), normalizedItem.slice(k + 1)]; }); if (map) normalizedMap = map; let key = ""; let parsedArgs = {}; for (let rawValue of normalizedInput) { rawValue = rawValue.trim(); if (rawValue.startsWith("\"") && rawValue.endsWith("\"")) rawValue = rawValue.slice(1, -1); else if (rawValue.startsWith("'") && rawValue.endsWith("'")) rawValue = rawValue.slice(1, -1); let parsedKey = toKey(rawValue); if (parsedKey !== void 0) { let nextKey = normalizedMap?.[parsedKey] ?? parsedKey; if (key && nextKey !== key && parsedArgs[key] === void 0) parsedArgs[key] = true; key = nextKey; continue; } let parsedValue; if (rawValue) try { parsedValue = JSON.parse(rawValue); } catch { parsedValue = rawValue; } else parsedValue = true; let prevValue = parsedArgs[key]; let value; if (prevValue === void 0) value = key === "" ? [parsedValue] : parsedValue; else if (Array.isArray(prevValue)) value = [...prevValue, parsedValue]; else value = [prevValue, parsedValue]; parsedArgs[key] = value; } if (key && parsedArgs[key] === void 0) parsedArgs[key] = true; return parsedArgs; } exports.parseArgs = parseArgs;