cmrd
Version:
A tiny utility for building command-line strings with clean and simple syntax.
43 lines (42 loc) • 1.22 kB
JavaScript
// src/cmrd.ts
function getMaxArgPlaceholder(expressions) {
return Math.max(...expressions.filter((exp) => typeof exp === "number"));
}
function isNil(value) {
return value == null;
}
function isCmdArgIndex(exp) {
return typeof exp === "number";
}
function isCmdIf(exp) {
return Array.isArray(exp) && exp.length === 2 && isCmdArgIndex(exp[0]) && typeof exp[1] === "string";
}
function cmrd(strings, ...exprs) {
const highestArgKey = getMaxArgPlaceholder(exprs);
return (...args) => {
const getExprValue = (expr) => {
if (isNil(expr))
return "";
if (isCmdArgIndex(expr))
return args[expr] || "";
if (isCmdIf(expr))
return args[expr[0]] == null ? "" : expr[1];
return expr;
};
const parsedCmd = strings.reduce((acc, str, i) => {
const arg = getExprValue(exprs[i])?.trim();
const part = `${str}${arg}`;
if (acc.endsWith(" ") && part.startsWith(" ")) {
return `${acc}${part.trimStart()}`;
}
return `${acc}${part}`;
}, "");
const extraArgs = args.slice(highestArgKey + 1).join(" ");
return `${parsedCmd} ${extraArgs}`.trim();
};
}
var cmrd_default = cmrd;
export {
cmrd_default as default,
cmrd
};