about-system 0.0.18 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +128 -67
- package/dist/about-system-cli.js +113 -205
- package/dist/about-system-cli.js.map +1 -1
- package/dist/index.d.ts +3 -9
- package/dist/index.js +4 -4
- package/dist/system-info-api-Bc0iSNdN.js +837 -0
- package/dist/system-info-api-Bc0iSNdN.js.map +1 -0
- package/dist/system-info-api.d.ts +313 -194
- package/dist/system-info-api.js +9 -791
- package/dist/system-info-api.js.map +1 -1
- package/package.json +4 -4
- package/src/about-system-cli.ts +124 -221
- package/src/cache/cache-config.ts +68 -0
- package/src/cache/cache.ts +95 -0
- package/src/info/hardware.ts +173 -0
- package/src/info/memory.ts +215 -0
- package/src/info/network.ts +213 -0
- package/src/info/platform.ts +145 -0
- package/src/info/process.ts +72 -0
- package/src/info/settings.ts +209 -0
- package/src/info/software.ts +192 -0
- package/src/info/system-status.ts +152 -0
- package/src/system-info-api.ts +78 -1117
- package/src/types/internal-types.ts +21 -0
- package/src/utils/command.ts +47 -0
- package/src/utils/network.ts +58 -0
- package/src/utils/platform.ts +13 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-info-api.js","sources":["../src/system-info-api.ts"],"sourcesContent":["/**\n * @fileoverview System Information API\n *\n * A comprehensive cross-platform system information collection API.\n * Provides clean JSON data without formatting, suitable for programmatic use.\n *\n * @module system-info-api\n * @author vtempest\n * @license rights.institute/prosper\n *\n * @example\n * ```typescript\n * import { getSystemInfo } from 'about-system';\n *\n * const info = await getSystemInfo();\n * console.log(info.cpu); // \"AMD Ryzen 9 5900HX\"\n * console.log(info.ram_used); // \"8/16GB\"\n * console.log(info.platform); // \"linux\"\n * ```\n */\n\nimport os from \"os\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\nimport https from \"https\";\nimport type { SystemInfo, SystemInfoOptions } from \"./systeminfo-types.js\";\n\n/**\n * Cache file location in system's temporary directory\n * @constant\n */\nconst CACHE_FILE = path.join(os.tmpdir(), \"systeminfo-cache.json\");\n\n/**\n * Cache duration configuration for different system information types\n * Values are in milliseconds\n *\n * @constant\n * @property {number} ip - IP information cache (5 minutes)\n * @property {number} cpu - CPU information cache (24 hours)\n * @property {number} gpu - GPU information cache (24 hours)\n * @property {number} os - OS information cache (24 hours)\n * @property {number} device - Device information cache (24 hours)\n * @property {number} kernel - Kernel information cache (1 hour)\n * @property {number} pacman - Package managers cache (10 minutes)\n * @property {number} ports - Open ports cache (5 minutes)\n * @property {number} containers - Docker containers cache (5 minutes)\n * @property {number} top_process - Top process cache (5 seconds)\n * @property {number} disk_used - Disk usage cache (1 minute)\n * @property {number} ram_used - RAM usage cache (10 seconds)\n * @property {number} services_running - Services cache (5 minutes)\n * @property {number} temperature - Temperature cache (30 seconds)\n * @property {number} battery - Battery status cache (1 minute)\n * @property {number} network_interfaces - Network interfaces cache (5 minutes)\n * @property {number} mount_points - Mount points cache (10 minutes)\n */\nconst CACHE_DURATION = {\n ip: 5 * 60 * 1000,\n cpu: 24 * 60 * 60 * 1000,\n gpu: 24 * 60 * 60 * 1000,\n os: 24 * 60 * 60 * 1000,\n device: 24 * 60 * 60 * 1000,\n kernel: 60 * 60 * 1000,\n pacman: 10 * 60 * 1000,\n ports: 5 * 60 * 1000,\n containers: 5 * 60 * 1000,\n top_process: 5 * 1000,\n disk_used: 60 * 1000,\n ram_used: 10 * 1000,\n services_running: 5 * 60 * 1000,\n temperature: 30 * 1000,\n battery: 60 * 1000,\n network_interfaces: 5 * 60 * 1000,\n mount_points: 10 * 60 * 1000,\n};\n\n/**\n * Platform detection constants\n */\nconst IS_WINDOWS = os.platform() === \"win32\";\nconst IS_MAC = os.platform() === \"darwin\";\nconst IS_LINUX = os.platform() === \"linux\";\n\n/**\n * Default IPInfo.io API token for geolocation\n * @constant\n */\nconst DEFAULT_IPINFO_TOKEN = \"da2d6cc4baa5d1\";\n\n/**\n * Default network request timeout in milliseconds\n * @constant\n */\nconst DEFAULT_NETWORK_TIMEOUT = 5000;\n\n/**\n * Represents a cached value with timestamp\n * @interface CacheEntry\n */\ninterface CacheEntry {\n /** The cached value */\n value: any;\n /** Unix timestamp when the value was cached */\n timestamp: number;\n}\n\n/**\n * Cache storage structure\n * @interface Cache\n */\ninterface Cache {\n [key: string]: CacheEntry;\n}\n\n/**\n * IP information from ipinfo.io API\n * @interface IPInfo\n */\ninterface IPInfo {\n /** Public IP address */\n ip?: string;\n /** City location */\n city?: string;\n /** Reverse DNS hostname */\n hostname?: string;\n /** ISP organization string (includes AS number) */\n org?: string;\n}\n\n/**\n * Context object passed to info collection functions\n * @interface InfoContext\n */\ninterface InfoContext {\n /** Cache storage */\n cache: Cache;\n /** IP information from external API */\n ipInfo?: IPInfo;\n}\n\n/**\n * Loads cache from disk\n * @returns {Cache} Cached data or empty object if cache doesn't exist or is corrupted\n */\nfunction loadCache(): Cache {\n try {\n if (fs.existsSync(CACHE_FILE)) {\n return JSON.parse(fs.readFileSync(CACHE_FILE, \"utf8\"));\n }\n } catch (error) {\n // Corrupted cache - return empty object\n }\n return {};\n}\n\n/**\n * Saves cache to disk\n * @param {Cache} cache - Cache object to save\n */\nfunction saveCache(cache: Cache): void {\n try {\n fs.writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch (error) {\n // Silently fail if can't write cache\n }\n}\n\n/**\n * Checks if a cache entry is still valid based on configured duration\n * @param {CacheEntry} cacheEntry - The cache entry to validate\n * @param {string} key - The key name to determine cache duration\n * @returns {boolean} True if cache is still valid\n */\nfunction isCacheValid(cacheEntry: CacheEntry, key: string): boolean {\n if (!cacheEntry || !cacheEntry.timestamp) return false;\n const age = Date.now() - cacheEntry.timestamp;\n const maxAge = CACHE_DURATION[key as keyof typeof CACHE_DURATION] || 60000;\n return age < maxAge;\n}\n\n/**\n * Retrieves a value from cache if valid\n * @param {Cache} cache - Cache object\n * @param {string} key - Key to retrieve\n * @returns {any} Cached value or null if not found/expired\n */\nfunction getCachedValue(cache: Cache, key: string): any {\n if (!cache[key]) return null;\n const cacheEntry = cache[key];\n if (!isCacheValid(cacheEntry, key)) {\n delete cache[key];\n return null;\n }\n return cacheEntry.value;\n}\n\n/**\n * Stores a value in cache with current timestamp\n * @param {Cache} cache - Cache object\n * @param {string} key - Key to store under\n * @param {any} value - Value to cache\n */\nfunction setCachedValue(cache: Cache, key: string, value: any): void {\n cache[key] = {\n value,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Executes a shell command safely with timeout\n * @param {string} command - Command to execute\n * @param {object} options - Additional options for execSync\n * @returns {string} Command output or empty string on error\n */\nfunction execCommand(command: string, options = {}): string {\n try {\n const cmd = IS_WINDOWS ? `cmd /c ${command}` : command;\n return execSync(cmd, {\n encoding: \"utf8\",\n timeout: 10000,\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n ...options,\n })\n .toString()\n .trim();\n } catch (error) {\n return \"\";\n }\n}\n\n/**\n * Checks if a command exists in the system PATH\n * @param {string} command - Command name to check\n * @returns {boolean} True if command exists\n */\nfunction commandExists(command: string): boolean {\n try {\n if (IS_WINDOWS) {\n execSync(`where ${command}`, { stdio: \"ignore\" });\n } else {\n execSync(`which ${command}`, { stdio: \"ignore\" });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Fetches IP geolocation information from ipinfo.io API\n * @param {string} token - IPInfo.io API token\n * @param {number} timeout - Request timeout in milliseconds\n * @returns {Promise<IPInfo>} IP information object or empty object on error\n */\nasync function fetchIPInfo(\n token: string = DEFAULT_IPINFO_TOKEN,\n timeout: number = DEFAULT_NETWORK_TIMEOUT\n): Promise<IPInfo> {\n return new Promise((resolve) => {\n const url = `https://ipinfo.io/json${token ? `?token=${token}` : \"\"}`;\n\n const req = https.get(url, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk));\n res.on(\"end\", () => {\n try {\n resolve(JSON.parse(data));\n } catch {\n resolve({});\n }\n });\n });\n\n req.on(\"error\", () => resolve({}));\n req.setTimeout(timeout, () => {\n req.destroy();\n resolve({});\n });\n });\n}\n\n/**\n * System information collection functions\n * Each function returns a clean string value without formatting\n * @namespace infoFunctions\n */\nexport const infoFunctions = {\n /**\n * Gets the current username\n * @returns Current system username\n */\n user(): string {\n return os.userInfo().username;\n },\n\n /**\n * Gets the system hostname\n * @returns Computer hostname/network name\n */\n hostname(): string {\n return os.hostname();\n },\n\n /**\n * Gets public IP address from ipinfo.io\n * @param context - Info context with cache and IP info\n * @returns Public IPv4 address or empty string\n * @example \"203.0.113.42\"\n */\n async ip(context: InfoContext): Promise<string> {\n const cached = getCachedValue(context.cache, \"ip\");\n if (cached) return cached;\n\n if (!context.ipInfo) {\n setCachedValue(context.cache, \"ip\", \"\");\n return \"\";\n }\n const ip = context.ipInfo.ip || \"\";\n setCachedValue(context.cache, \"ip\", ip);\n return ip;\n },\n\n /**\n * Gets local/private IP address(es)\n * Tries ifconfig and ip commands on Linux, falls back to Node.js API\n * @returns Space-separated local IP addresses (RFC 1918 ranges)\n * @example \"192.168.1.100\" or \"10.0.0.50 192.168.1.100\"\n */\n iplocal(): string {\n if (IS_LINUX) {\n try {\n const ifconfig = execCommand(\"ifconfig 2>/dev/null\");\n const wlanMatch = ifconfig.match(\n /wlan0[\\s\\S]*?inet (\\d+\\.\\d+\\.\\d+\\.\\d+)/\n );\n if (wlanMatch) {\n return wlanMatch[1];\n }\n } catch {}\n\n try {\n const ipAddr = execCommand(\"ip addr show 2>/dev/null\");\n const addresses: string[] = [];\n const matches = ipAddr.matchAll(/inet (\\d+\\.\\d+\\.\\d+\\.\\d+)\\/\\d+/g);\n for (const match of matches) {\n if (!match[1].startsWith(\"127.\")) {\n addresses.push(match[1]);\n }\n }\n if (addresses.length > 0) {\n return addresses.join(\" \");\n }\n } catch {}\n }\n\n const interfaces = os.networkInterfaces();\n const addresses: string[] = [];\n\n for (const name of Object.keys(interfaces)) {\n for (const device of interfaces[name] || []) {\n if (device.family === \"IPv4\" && !device.internal) {\n addresses.push(device.address);\n }\n }\n }\n\n return addresses.join(\" \");\n },\n\n /**\n * Gets geographic city based on public IP\n * @param context - Info context with IP geolocation data\n * @returns City name or empty string\n * @example \"San Francisco\", \"New York\", \"London\"\n */\n async city(context: InfoContext): Promise<string> {\n const cached = getCachedValue(context.cache, \"city\");\n if (cached !== null) return cached;\n\n if (!context.ipInfo || !context.ipInfo.city) {\n setCachedValue(context.cache, \"city\", \"\");\n return \"\";\n }\n const city = context.ipInfo.city;\n setCachedValue(context.cache, \"city\", city);\n return city;\n },\n\n /**\n * Gets reverse DNS hostname with HTTP prefix\n * @param context - Info context with IP info\n * @returns Domain with http:// prefix or empty string\n * @example \"http://example.com\", \"http://host-203-0-113-42.example.net\"\n */\n async domain(context: InfoContext): Promise<string> {\n const cached = getCachedValue(context.cache, \"domain\");\n if (cached !== null) return cached;\n\n if (!context.ipInfo || !context.ipInfo.hostname) {\n setCachedValue(context.cache, \"domain\", \"\");\n return \"\";\n }\n const domain = `http://${context.ipInfo.hostname}`;\n setCachedValue(context.cache, \"domain\", domain);\n return domain;\n },\n\n /**\n * Gets Internet Service Provider name\n * Strips AS number prefix from organization string\n * @param context - Info context with IP info\n * @returns ISP name or empty string\n * @example \"Comcast Cable\", \"Verizon Business\", \"Cloudflare Inc\"\n */\n async isp(context: InfoContext): Promise<string> {\n const cached = getCachedValue(context.cache, \"isp\");\n if (cached !== null) return cached;\n\n if (!context.ipInfo || !context.ipInfo.org) {\n setCachedValue(context.cache, \"isp\", \"\");\n return \"\";\n }\n const isp = context.ipInfo.org.split(\" \").slice(1).join(\" \");\n setCachedValue(context.cache, \"isp\", isp);\n return isp;\n },\n\n /**\n * Gets operating system name and version\n * Platform-specific detection for Windows, macOS, and Linux\n * @param context - Info context with cache\n * @returns OS name and version string\n * @example \"Windows 11 Pro\", \"macOS Ventura 13.2.1\", \"Ubuntu 22.04.3 LTS\"\n */\n os(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"os\");\n if (cached) return cached;\n\n const platform = os.platform();\n const release = os.release();\n let osName = \"\";\n\n if (IS_WINDOWS) {\n try {\n const version = execCommand(\"ver\");\n const match = version.match(/Microsoft Windows \\[Version ([^\\]]+)\\]/);\n osName = match ? `Windows ${match[1]}` : `Windows ${release}`;\n } catch {\n osName = `Windows ${release}`;\n }\n } else if (IS_MAC) {\n osName = `macOS ${release}`;\n } else if (IS_LINUX) {\n try {\n const osRelease = fs.readFileSync(\"/etc/os-release\", \"utf8\");\n const nameMatch = osRelease.match(/^NAME=\"([^\"]+)\"/m);\n const versionMatch = osRelease.match(/^VERSION_ID=\"([^\"]+)\"/m);\n osName = nameMatch ? nameMatch[1] : \"Linux\";\n if (versionMatch) osName += ` ${versionMatch[1]}`;\n } catch {\n osName = `Linux ${release}`;\n }\n } else {\n osName = `${platform} ${release}`;\n }\n\n setCachedValue(context.cache, \"os\", osName);\n return osName;\n },\n\n /**\n * Gets CPU model name and specifications\n * Uses platform-specific commands (wmic/lscpu/cpuinfo)\n * Automatically strips \"with Radeon Graphics\" and similar suffixes\n * @param context - Info context with cache\n * @returns CPU model string or empty string\n * @example \"Intel Core i7-12700K\", \"AMD Ryzen 9 5900HX\", \"Apple M2 Pro\"\n */\n cpu(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"cpu\");\n if (cached) return cached;\n\n let cpuName = \"\";\n\n if (IS_WINDOWS) {\n try {\n const wmic = execCommand(\"wmic cpu get name /format:list\");\n const nameMatch = wmic.match(/Name=(.+)/);\n if (nameMatch) {\n cpuName = nameMatch[1].trim();\n }\n } catch {}\n\n if (!cpuName) {\n try {\n const ps = execCommand(\n 'powershell.exe -Command \"Get-WmiObject -Class Win32_Processor | Select-Object -ExpandProperty Name\"'\n );\n if (ps.trim()) {\n cpuName = ps.trim();\n }\n } catch {}\n }\n } else if (IS_LINUX) {\n try {\n const lscpu = execCommand(\"lscpu\");\n const modelMatch = lscpu.match(/Model name:\\s*([^\\n,]+)/);\n if (modelMatch) {\n cpuName = modelMatch[1].trim();\n }\n } catch {}\n\n if (!cpuName) {\n try {\n const cpuInfo = fs.readFileSync(\"/proc/cpuinfo\", \"utf8\");\n const modelMatch = cpuInfo.match(/model name\\s*:\\s*([^\\n]+)/);\n const hardwareMatch = cpuInfo.match(/Hardware\\s*:\\s*([^\\n]+)/);\n\n if (modelMatch) {\n cpuName = modelMatch[1].trim();\n } else if (hardwareMatch) {\n cpuName = hardwareMatch[1].trim();\n }\n } catch {}\n }\n } else {\n const cpus = os.cpus();\n if (cpus.length > 0) {\n cpuName = cpus[0].model.trim().replace(/[\\r\\n]+/g, \" \");\n }\n }\n\n if (!cpuName) {\n setCachedValue(context.cache, \"cpu\", \"\");\n return \"\";\n }\n\n cpuName = cpuName.trim().replace(/with .*/, \"\");\n\n setCachedValue(context.cache, \"cpu\", cpuName);\n return cpuName;\n },\n\n /**\n * Gets graphics card model name\n * Extracts GPU info from lspci (Linux) or WMI (Windows)\n * Filters out basic/generic display adapters\n * @param context - Info context with cache\n * @returns GPU model string or empty string\n * @example \"NVIDIA GeForce RTX 4070\", \"AMD Radeon RX 6800 XT\"\n */\n gpu(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"gpu\");\n if (cached !== null) return cached;\n\n if (IS_WINDOWS) {\n try {\n const wmic = execCommand(\n \"wmic path win32_VideoController get name /format:list\"\n );\n const nameMatch = wmic.match(/Name=(.+)/);\n if (nameMatch) {\n const gpu = nameMatch[1].trim();\n if (gpu && gpu !== \"\" && !gpu.includes(\"Microsoft Basic\")) {\n setCachedValue(context.cache, \"gpu\", gpu);\n return gpu;\n }\n }\n } catch {}\n\n try {\n const ps = execCommand(\n \"powershell.exe -Command \\\"Get-WmiObject -Class Win32_VideoController | Where-Object {$_.Name -notlike '*Microsoft Basic*'} | Select-Object -First 1 -ExpandProperty Name\\\"\"\n );\n if (ps.trim()) {\n const gpu = ps.trim();\n setCachedValue(context.cache, \"gpu\", gpu);\n return gpu;\n }\n } catch {}\n } else if (IS_LINUX) {\n try {\n const lspci = execCommand(\"lspci\");\n const gpuMatch = lspci.match(\n /VGA.*?(RTX|GeForce|AMD|Intel|NVIDIA)[^\\n]*/i\n );\n if (gpuMatch) {\n let gpu = gpuMatch[0];\n\n const bracketMatch = gpu.match(/\\[([^\\]]+)\\]/);\n if (bracketMatch) {\n gpu = bracketMatch[1];\n } else {\n gpu = gpu\n .replace(/^.*VGA[^:]*:\\s*/, \"\")\n .replace(/\\s*\\(.*\\)$/, \"\")\n .trim();\n }\n\n if (gpu) {\n setCachedValue(context.cache, \"gpu\", gpu);\n return gpu;\n }\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"gpu\", \"\");\n return \"\";\n },\n\n /**\n * Gets root filesystem disk usage percentage\n * Uses df command on Linux/Android\n * @param context - Info context with cache\n * @returns Percentage string or empty string\n * @example \"45%\", \"78%\"\n */\n disk_used(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"disk_used\");\n if (cached !== null) return cached;\n\n if (IS_LINUX) {\n try {\n const df = execCommand(\"df -h\");\n let diskUsage = \"\";\n\n if (df.includes(\"/storage/emulated\")) {\n const match = df.match(/\\s+(\\d+%)\\s+\\/storage\\/emulated/);\n diskUsage = match ? match[1] : \"\";\n } else {\n const lines = df.split(\"\\n\");\n for (const line of lines) {\n if (line.trim().endsWith(\" /\")) {\n const parts = line.trim().split(/\\s+/);\n const percentIndex = parts.findIndex((part) =>\n part.includes(\"%\")\n );\n if (percentIndex !== -1) {\n diskUsage = parts[percentIndex];\n break;\n }\n }\n }\n\n if (!diskUsage) {\n const rootMatch = df.match(/(\\d+%)\\s+\\/\\s*$/m);\n diskUsage = rootMatch ? rootMatch[1] : \"\";\n }\n }\n\n setCachedValue(context.cache, \"disk_used\", diskUsage);\n return diskUsage;\n } catch {}\n }\n\n setCachedValue(context.cache, \"disk_used\", \"\");\n return \"\";\n },\n\n /**\n * Gets memory usage in gigabytes\n * Reads from /proc/meminfo on Linux, falls back to os.totalmem()\n * @param context - Info context with cache\n * @returns Memory usage as \"used/total GB\"\n * @example \"12/32GB\", \"6/16GB\"\n */\n ram_used(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"ram_used\");\n if (cached) return cached;\n\n if (IS_LINUX) {\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const totalMatch = meminfo.match(/MemTotal:\\s+(\\d+) kB/);\n const freeMatch = meminfo.match(/MemFree:\\s+(\\d+) kB/);\n\n if (totalMatch && freeMatch) {\n const totalMB = Math.round(parseInt(totalMatch[1]) / 1024);\n const freeMB = Math.round(parseInt(freeMatch[1]) / 1024);\n const usedMB = totalMB - freeMB;\n\n const totalGB = Math.round(totalMB / 1024);\n const usedGB = Math.round(usedMB / 1024);\n\n const result = `${usedGB}/${totalGB}GB`;\n setCachedValue(context.cache, \"ram_used\", result);\n return result;\n }\n } catch {}\n }\n\n const totalMem = os.totalmem();\n const freeMem = os.freemem();\n const usedMem = totalMem - freeMem;\n\n const totalGB = Math.round(totalMem / (1024 * 1024 * 1024));\n const usedGB = Math.round(usedMem / (1024 * 1024 * 1024));\n\n const result = `${usedGB}/${totalGB}GB`;\n setCachedValue(context.cache, \"ram_used\", result);\n return result;\n },\n\n /**\n * Gets the highest CPU-consuming process\n * Uses ps command to find top process by CPU usage (Linux only)\n * @param context - Info context with cache\n * @returns Process info as \"percentage processname\" or empty string\n * @example \"8% firefox\", \"15% chrome\", \"3% systemd\"\n */\n top_process(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"top_process\");\n if (cached !== null) return cached;\n\n if (IS_LINUX) {\n try {\n const ps = execCommand(\"ps -eo pcpu,comm --sort=-%cpu --no-headers\");\n const lines = ps.split(\"\\n\");\n if (lines.length > 0) {\n const topProcess = lines[0].trim().replace(/\\s+/, \" \").split(\" \");\n const cpu = topProcess[0].replace(/\\.\\d+/, \"%\");\n const process = topProcess[1].split(\"/\").pop();\n const result = `${cpu} ${process}`;\n setCachedValue(context.cache, \"top_process\", result);\n return result;\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"top_process\", \"\");\n return \"\";\n },\n\n /**\n * Gets system uptime since last boot\n * @returns Uptime formatted as \"Xd Yh Zm\"\n * @example \"2d 14h 23m\", \"0d 3h 45m\"\n */\n uptime(): string {\n const uptimeSeconds = os.uptime();\n const days = Math.floor(uptimeSeconds / 86400);\n const hours = Math.floor((uptimeSeconds % 86400) / 3600);\n const minutes = Math.floor((uptimeSeconds % 3600) / 60);\n return `${days}d ${hours}h ${minutes}m`;\n },\n\n /**\n * Gets device or computer model name\n * Uses WMI on Windows, DMI on Linux, getprop on Android\n * @param context - Info context with cache\n * @returns Device model name or empty string\n * @example \"Dell OptiPlex 7090\", \"MacBook Pro 16-inch\", \"Valve Steam Deck\"\n */\n device(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"device\");\n if (cached !== null) return cached;\n\n if (IS_WINDOWS) {\n try {\n const wmic = execCommand(\"wmic csproduct get name /format:list\");\n const nameMatch = wmic.match(/Name=(.+)/);\n if (nameMatch) {\n const device = nameMatch[1].trim();\n if (device && device !== \"\") {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n } catch {}\n\n try {\n const ps = execCommand(\n 'powershell.exe -Command \"Get-WmiObject -Class Win32_ComputerSystem | Select-Object -ExpandProperty Model\"'\n );\n if (ps.trim()) {\n const device = ps.trim();\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n } catch {}\n } else if (IS_LINUX) {\n try {\n if (commandExists(\"getprop\")) {\n const device = execCommand(\"getprop ro.product.model\");\n if (device) {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n\n const dmiPath = \"/sys/devices/virtual/dmi/id/product_name\";\n if (fs.existsSync(dmiPath)) {\n const device = fs.readFileSync(dmiPath, \"utf8\").trim();\n if (device) {\n setCachedValue(context.cache, \"device\", device);\n return device;\n }\n }\n } catch {}\n }\n\n setCachedValue(context.cache, \"device\", \"\");\n return \"\";\n },\n\n /**\n * Gets kernel version string\n * Returns the operating system kernel version from os.release()\n * @param context - Info context with cache\n * @returns Kernel version string\n * @example \"5.15.0-56-generic\", \"6.11.11-valve12-1-neptune\"\n */\n kernel(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"kernel\");\n if (cached) return cached;\n\n const kernel = os.release();\n setCachedValue(context.cache, \"kernel\", kernel);\n return kernel;\n },\n\n /**\n * Gets the current shell name\n * Uses ps command to find parent process shell (Linux/Unix only)\n * @returns Shell name or empty string on Windows\n * @example \"bash\", \"zsh\", \"fish\", \"nu\"\n */\n shell(): string {\n if (IS_LINUX) {\n try {\n const ppid = process.ppid;\n const shell = execCommand(`ps -p ${ppid} -o comm=`).split(\"/\").pop();\n return shell || \"\";\n } catch {}\n }\n return \"\";\n },\n\n /**\n * Gets available package managers and development tools\n * Checks for package managers (apt, yum, npm, etc.) and editors (nvim, hx)\n * @param context - Info context with cache\n * @returns Space-separated list of available commands\n * @example \"apt npm docker nvim\", \"yay pacman bun hx\"\n */\n pacman(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"pacman\");\n if (cached !== null) return cached;\n\n const commands = [\n \"apt\",\n \"npm\",\n \"uv\",\n \"docker\",\n \"hx\",\n \"nvim\",\n \"bun\",\n \"yay\",\n \"pacman\",\n \"yum\",\n \"dnf\",\n \"zypper\",\n \"emerge\",\n \"apk\",\n \"snap\",\n \"flatpak\",\n ];\n const available = commands.filter((cmd) => commandExists(cmd));\n\n const result = available.join(\" \");\n setCachedValue(context.cache, \"pacman\", result);\n return result;\n },\n\n /**\n * Gets open TCP ports with service names\n * Uses lsof to find listening TCP ports (Linux only)\n * @param context - Info context with cache\n * @returns Space-separated port+process pairs or empty string\n * @example \"80http 443http 22ssh\", \"3000node 5432post\"\n */\n ports(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"ports\");\n if (cached !== null) return cached;\n\n if (IS_LINUX) {\n try {\n const lsof = execCommand(\"lsof -nP -iTCP -sTCP:LISTEN\");\n const lines = lsof.split(\"\\n\").slice(1);\n const ports = new Set<string>();\n\n lines.forEach((line) => {\n const parts = line.split(/\\s+/);\n if (parts.length >= 9) {\n const address = parts[8];\n const portMatch = address.match(/:(\\d+)$/);\n if (portMatch) {\n const port = portMatch[1];\n const process = parts[0].substring(0, 4);\n ports.add(`${port}${process}`);\n }\n }\n });\n\n const result = Array.from(ports).join(\" \");\n setCachedValue(context.cache, \"ports\", result);\n return result;\n } catch {}\n }\n\n setCachedValue(context.cache, \"ports\", \"\");\n return \"\";\n },\n\n /**\n * Gets running Docker container names\n * Lists active Docker containers with their names\n * @param context - Info context with cache\n * @returns Space-separated container names or empty string\n * @example \"nginx redis postgres\", \"web-app db-server\"\n */\n containers(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"containers\");\n if (cached !== null) return cached;\n\n if (!commandExists(\"docker\")) {\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n }\n\n try {\n const containerCount = execCommand(\"docker ps -q\")\n .split(\"\\n\")\n .filter((line) => line.trim()).length;\n if (containerCount === 0) {\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n }\n\n const containers = execCommand(\n 'docker ps --format \"{{.Names}}\\t{{.Ports}}\"'\n );\n const lines = containers.split(\"\\n\").filter((line) => line.trim());\n\n const containerInfo: string[] = [];\n\n lines.forEach((line) => {\n const [name, ports] = line.split(\"\\t\");\n if (name) {\n containerInfo.push(name);\n\n if (ports) {\n const portMatches = ports.match(/->(\\d+(-\\d+)?)\\//g);\n if (portMatches) {\n const uniquePorts = [\n ...new Set(\n portMatches.map((p) => p.replace(/->\\d+(-\\d+)?\\//, \"\"))\n ),\n ];\n containerInfo.push(...uniquePorts);\n }\n }\n }\n });\n\n const result = containerInfo.join(\" \");\n setCachedValue(context.cache, \"containers\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"containers\", \"\");\n return \"\";\n },\n\n /**\n * Gets available memory in gigabytes\n * Reads MemAvailable from /proc/meminfo (Linux only)\n * @returns Available memory with \"GB available\" suffix or empty string\n * @example \"12GB available\", \"4GB available\"\n */\n memory_available(): string {\n if (!IS_LINUX) return \"\";\n\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const availableMatch = meminfo.match(/MemAvailable:\\s+(\\d+) kB/);\n if (availableMatch) {\n const availableGB = Math.round(\n parseInt(availableMatch[1]) / 1024 / 1024\n );\n return `${availableGB}GB available`;\n }\n } catch {}\n return \"\";\n },\n\n /**\n * Gets swap memory usage\n * Calculates swap usage from /proc/meminfo (Linux only)\n * @returns Swap usage as \"percentage (size MB) swap\" or empty string\n * @example \"15% (512MB) swap\", \"0% (0MB) swap\"\n */\n swap_used(): string {\n if (!IS_LINUX) return \"\";\n\n try {\n const meminfo = fs.readFileSync(\"/proc/meminfo\", \"utf8\");\n const swapTotalMatch = meminfo.match(/SwapTotal:\\s+(\\d+) kB/);\n const swapFreeMatch = meminfo.match(/SwapFree:\\s+(\\d+) kB/);\n\n if (swapTotalMatch && swapFreeMatch) {\n const swapTotal = parseInt(swapTotalMatch[1]);\n const swapFree = parseInt(swapFreeMatch[1]);\n const swapUsed = swapTotal - swapFree;\n\n if (swapTotal > 0) {\n const swapUsedPercent = Math.round((swapUsed / swapTotal) * 100);\n const swapUsedMB = Math.round(swapUsed / 1024);\n return `${swapUsedPercent}% (${swapUsedMB}MB) swap`;\n }\n }\n } catch {}\n return \"\";\n },\n\n /**\n * Gets system load averages\n * Reads 1, 5, and 15 minute load averages from /proc/loadavg (Linux only)\n * @returns Space-separated load averages (1m 5m 15m) or empty string\n * @example \"0.52 0.58 0.59\", \"2.10 1.95 1.88\"\n */\n load_average(): string {\n if (!IS_LINUX) return \"\";\n\n try {\n const loadavg = fs.readFileSync(\"/proc/loadavg\", \"utf8\");\n const loads = loadavg.split(\" \").slice(0, 3);\n return loads.join(\" \");\n } catch {}\n return \"\";\n },\n\n /**\n * Gets number of logged in users\n * Uses who command to count active user sessions (Linux only)\n * @returns User count with \"users\" suffix or empty string\n * @example \"3 users\", \"1 users\"\n */\n users_logged_in(): string {\n if (!IS_LINUX) return \"\";\n\n try {\n const who = execCommand(\"who\");\n const users = who.split(\"\\n\").filter((line) => line.trim()).length;\n if (users > 0) {\n return `${users} users`;\n }\n } catch {}\n return \"\";\n },\n\n /**\n * Gets active network interface names\n * Lists non-loopback interfaces with IPv4 addresses (Linux only)\n * @param context - Info context with cache\n * @returns Space-separated interface names or empty string\n * @example \"eth0 wlan0\", \"enp0s3\"\n */\n network_interfaces(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"network_interfaces\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"network_interfaces\", \"\");\n return \"\";\n }\n\n try {\n const interfaces = os.networkInterfaces();\n const activeInterfaces: string[] = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (name !== \"lo\") {\n const ipv4Addr = addrs?.find(\n (addr) => addr.family === \"IPv4\" && !addr.internal\n );\n if (ipv4Addr) {\n activeInterfaces.push(name);\n }\n }\n }\n\n const result = activeInterfaces.join(\" \");\n setCachedValue(context.cache, \"network_interfaces\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"network_interfaces\", \"\");\n return \"\";\n },\n\n mount_points(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"mount_points\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"mount_points\", \"\");\n return \"\";\n }\n\n try {\n const df = execCommand(\"df -h\");\n const lines = df.split(\"\\n\").slice(1);\n const mountPoints: string[] = [];\n\n lines.forEach((line) => {\n const parts = line.trim().split(/\\s+/);\n if (parts.length >= 6) {\n const mountPoint = parts[5];\n const usage = parts[4];\n if (\n !mountPoint.startsWith(\"/dev\") &&\n !mountPoint.startsWith(\"/proc\") &&\n !mountPoint.startsWith(\"/sys\") &&\n mountPoint !== \"/\"\n ) {\n mountPoints.push(`${mountPoint}(${usage})`);\n }\n }\n });\n\n const result = mountPoints.slice(0, 3).join(\" \");\n setCachedValue(context.cache, \"mount_points\", result);\n return result;\n } catch {}\n\n setCachedValue(context.cache, \"mount_points\", \"\");\n return \"\";\n },\n\n services_running(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"services_running\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"services_running\", \"\");\n return \"\";\n }\n\n try {\n let serviceCount = 0;\n\n if (commandExists(\"systemctl\")) {\n const services = execCommand(\n \"systemctl list-units --type=service --state=running --no-pager\"\n );\n serviceCount = services\n .split(\"\\n\")\n .filter((line) => line.includes(\".service\")).length;\n } else if (commandExists(\"service\")) {\n const services = execCommand(\"service --status-all\");\n serviceCount = services\n .split(\"\\n\")\n .filter((line) => line.includes(\"+\")).length;\n }\n\n if (serviceCount > 0) {\n const result = `${serviceCount} services`;\n setCachedValue(context.cache, \"services_running\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"services_running\", \"\");\n return \"\";\n },\n\n temperature(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"temperature\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"temperature\", \"\");\n return \"\";\n }\n\n try {\n const tempSources = [\n \"/sys/class/thermal/thermal_zone0/temp\",\n \"/sys/class/hwmon/hwmon0/temp1_input\",\n \"/sys/class/hwmon/hwmon1/temp1_input\",\n ];\n\n for (const source of tempSources) {\n if (fs.existsSync(source)) {\n const temp = fs.readFileSync(source, \"utf8\").trim();\n const tempC = Math.round(parseInt(temp) / 1000);\n\n if (tempC > 0 && tempC < 150) {\n const result = `${tempC}°C`;\n setCachedValue(context.cache, \"temperature\", result);\n return result;\n }\n }\n }\n } catch {}\n\n setCachedValue(context.cache, \"temperature\", \"\");\n return \"\";\n },\n\n battery(context: InfoContext): string {\n const cached = getCachedValue(context.cache, \"battery\");\n if (cached !== null) return cached;\n\n if (!IS_LINUX) {\n setCachedValue(context.cache, \"battery\", \"\");\n return \"\";\n }\n\n try {\n const batteryPath = \"/sys/class/power_supply/BAT0\";\n const capacityPath = `${batteryPath}/capacity`;\n const statusPath = `${batteryPath}/status`;\n\n if (fs.existsSync(capacityPath)) {\n const capacity = fs.readFileSync(capacityPath, \"utf8\").trim();\n const status = fs.existsSync(statusPath)\n ? fs.readFileSync(statusPath, \"utf8\").trim()\n : \"Unknown\";\n\n const batteryPercent = parseInt(capacity);\n const isCharging = status === \"Charging\";\n const result = `${batteryPercent}%${isCharging ? \"+\" : \"\"}`;\n setCachedValue(context.cache, \"battery\", result);\n return result;\n }\n } catch {}\n\n setCachedValue(context.cache, \"battery\", \"\");\n return \"\";\n },\n\n screen_resolution(): string {\n if (!IS_LINUX) return \"\";\n\n try {\n if (process.env.DISPLAY) {\n const xrandr = execCommand(\"xrandr\");\n const resolutionMatch = xrandr.match(/(\\d+x\\d+)\\+\\d+\\+\\d+/);\n if (resolutionMatch) {\n return resolutionMatch[1];\n }\n }\n } catch {}\n return \"\";\n },\n};\n\n/**\n * Get all system information as a clean JSON object\n * @param options Configuration options\n * @returns Promise resolving to SystemInfo object\n */\nexport async function getSystemInfo(\n options: SystemInfoOptions = {}\n): Promise<SystemInfo> {\n const cache = loadCache();\n const context: InfoContext = { cache };\n\n // Check if we need IP info\n const cachedIPInfo = getCachedValue(cache, \"ipInfo\");\n if (cachedIPInfo) {\n context.ipInfo = cachedIPInfo;\n } else {\n context.ipInfo = await fetchIPInfo();\n setCachedValue(cache, \"ipInfo\", context.ipInfo);\n }\n\n // Collect all system information\n const info: Partial<SystemInfo> = {\n timestamp: new Date().toISOString(),\n platform: IS_WINDOWS\n ? \"windows\"\n : IS_MAC\n ? \"macos\"\n : IS_LINUX\n ? \"linux\"\n : \"unknown\",\n };\n\n // Call all info functions\n for (const [key, fn] of Object.entries(infoFunctions)) {\n try {\n const value = await fn(context);\n info[key as keyof SystemInfo] = value as any;\n } catch (error) {\n info[key as keyof SystemInfo] = \"\" as any;\n }\n }\n\n saveCache(cache);\n\n return info as SystemInfo;\n}\n\nexport { loadCache, saveCache };\n"],"names":["CACHE_FILE","path","os","CACHE_DURATION","IS_WINDOWS","IS_MAC","IS_LINUX","DEFAULT_IPINFO_TOKEN","DEFAULT_NETWORK_TIMEOUT","loadCache","fs","saveCache","cache","isCacheValid","cacheEntry","key","age","maxAge","getCachedValue","setCachedValue","value","execCommand","command","options","cmd","execSync","commandExists","fetchIPInfo","token","timeout","resolve","url","req","https","res","data","chunk","infoFunctions","context","cached","ip","wlanMatch","ipAddr","addresses","matches","match","interfaces","name","device","city","domain","isp","platform","release","osName","osRelease","nameMatch","versionMatch","cpuName","ps","modelMatch","cpuInfo","hardwareMatch","cpus","gpu","gpuMatch","bracketMatch","df","diskUsage","lines","line","parts","percentIndex","part","rootMatch","meminfo","totalMatch","freeMatch","totalMB","freeMB","usedMB","totalGB","result","totalMem","freeMem","usedMem","topProcess","cpu","process","uptimeSeconds","days","hours","minutes","dmiPath","kernel","ppid","ports","portMatch","port","containerInfo","portMatches","uniquePorts","p","availableMatch","swapTotalMatch","swapFreeMatch","swapTotal","swapFree","swapUsed","swapUsedPercent","swapUsedMB","users","activeInterfaces","addrs","addr","mountPoints","mountPoint","usage","serviceCount","tempSources","source","temp","tempC","batteryPath","capacityPath","statusPath","capacity","status","resolutionMatch","getSystemInfo","cachedIPInfo","info","fn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"system-info-api.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "about-system",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.19",
|
|
4
4
|
"description": "A Node.js script to display key system information with emojis. Cross-platform support for Windows, macOS, and Linux with customizable output and caching.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -76,11 +76,11 @@
|
|
|
76
76
|
"bin": "."
|
|
77
77
|
},
|
|
78
78
|
"dependencies": {
|
|
79
|
-
"ora": "^
|
|
79
|
+
"ora": "^9.0.0"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@types/node": "^
|
|
83
|
-
"typescript": "^5.
|
|
82
|
+
"@types/node": "^25.0.3",
|
|
83
|
+
"typescript": "^5.9.3",
|
|
84
84
|
"vite": "^7.3.1",
|
|
85
85
|
"vite-plugin-dts": "^4.5.4"
|
|
86
86
|
}
|