UNPKG

@clerc/utils

Version:
65 lines (61 loc) 2.19 kB
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 };