@clerc/utils
Version:
65 lines (61 loc) • 2.19 kB
JavaScript
import { Root, resolveFlattenCommands } from '@clerc/core';
const locales = {
"en": {
"utils.and": "%s and %s"
},
"zh-CN": {
"utils.and": "%s \u548C %s"
}
};
const toArray = (a) => Array.isArray(a) ? a : [a];
const camelCase = (word) => word.replace(/[\W_]([a-z\d])?/gi, (_, c) => c ? c.toUpperCase() : "");
const kebabCase = (s) => s.replace(/([A-Z])/g, (_, c) => `-${c.toLowerCase()}`);
const gracefulFlagName = (n) => n.length <= 1 ? `-${n}` : `--${kebabCase(n)}`;
const gracefulVersion = (v) => v.length === 0 ? "" : v.startsWith("v") ? v : `v${v}`;
function arrayEquals(arr1, arr2) {
if (arr2.length !== arr1.length) {
return false;
}
return arr1.every((item, i) => item === arr2[i]);
}
function arrayStartsWith(arr, start) {
if (start.length > arr.length) {
return false;
}
return arrayEquals(arr.slice(0, start.length), start);
}
function semanticArray(arr, { add, t }) {
add(locales);
if (arr.length <= 1) {
return arr[0];
}
return t("utils.and", arr.slice(0, -1).join(", "), arr[arr.length - 1]);
}
function resolveCommandStrict(commands, name, t) {
if (name === Root) {
return [commands[Root], Root];
}
const nameArr = toArray(name);
const commandsMap = resolveFlattenCommands(commands, t);
let current;
let currentName;
for (const [k, v] of commandsMap.entries()) {
if (k === Root || currentName === Root) {
continue;
}
if (arrayEquals(nameArr, k)) {
current = v;
currentName = k;
}
}
return [current, currentName];
}
function resolveSubcommandsByParent(commands, parent, depth = Infinity) {
const parentArr = parent === "" ? [] : Array.isArray(parent) ? parent : parent.split(" ");
return Object.values(commands).filter((c) => {
const commandNameArr = c.name.split(" ");
return arrayStartsWith(commandNameArr, parentArr) && commandNameArr.length - parentArr.length <= depth;
});
}
const resolveRootCommands = (commands) => resolveSubcommandsByParent(commands, "", 1);
export { arrayEquals, arrayStartsWith, camelCase, gracefulFlagName, gracefulVersion, kebabCase, resolveCommandStrict, resolveRootCommands, resolveSubcommandsByParent, semanticArray, toArray };