import os from "node:os"; import path from "node:path"; /** * @param {unknown} value * @returns {value is Record} */ export function isObject(value) { return typeof value === "object" && value !== null; } /** * @param {string} value * @returns {string} */ export function normalizeSkillName(value) { return String(value ?? "") .trim() .toLowerCase(); } /** * @param {string[]} values * @returns {string[]} */ export function uniqueStrings(values) { return Array.from(new Set(values)); } function detectHomeDirectory(env = process.env) { if (typeof env.HOME === "string" && env.HOME.trim()) return env.HOME.trim(); if (typeof env.USERPROFILE === "string" && env.USERPROFILE.trim()) return env.USERPROFILE.trim(); if ( typeof env.HOMEDRIVE === "string" && env.HOMEDRIVE.trim() && typeof env.HOMEPATH === "string" && env.HOMEPATH.trim() ) { return `${env.HOMEDRIVE.trim()}${env.HOMEPATH.trim()}`; } return os.homedir(); } const UNEXPANDED_HOME_TOKEN_PATTERN = /(?:^|[\\/])(?:\\?\$HOME|\\?\$\{HOME\}|\\?\$USERPROFILE|\\?\$\{USERPROFILE\}|%HOME%|%USERPROFILE%|\$env:HOME|\$env:USERPROFILE)(?:$|[\\/])/i; /** * @param {string} value * @returns {string} */ function expandKnownHomeTokens(value) { const homeDir = detectHomeDirectory(process.env); if (!homeDir) return value; let expanded = String(value ?? ""); if (expanded === "~") { expanded = homeDir; } else if (expanded.startsWith("~/") || expanded.startsWith("~\\")) { expanded = path.join(homeDir, expanded.slice(2)); } expanded = expanded .replace(/(? void}} [options] * @returns {string} */ export function resolveConfiguredPath( explicitPath, fallbackPath, { label = "path", onInvalid } = {}, ) { const explicit = typeof explicitPath === "string" ? explicitPath.trim() : ""; if (!explicit) { return resolveUserPath(fallbackPath, { label }); } try { return resolveUserPath(explicit, { label }); } catch (error) { if (typeof onInvalid === "function") { onInvalid(error, explicit); } return resolveUserPath(fallbackPath, { label }); } }