{"version":3,"sources":["../src/utils/index.js","../src/utils/date-utils.js","../src/utils/fs-utils.js","../src/utils/os-utils.js","../src/utils/format-utils.js","../src/utils/crypto-utils.js","../src/utils/core-utils.js"],"sourcesContent":["/**\n * Utilities Index\n * \n * Central export point for all utility modules\n */\n\n// Date/time utilities\nexport * from \"./date-utils.js\";\n\n// File system utilities\nexport * from \"./fs-utils.js\";\n\n// Operating system utilities\nexport * from \"./os-utils.js\";\n\n// Formatting utilities\nexport * from \"./format-utils.js\";\n\n// Cryptography utilities\nexport * from \"./crypto-utils.js\";\n\n// Core utilities\nexport * from \"./core-utils.js\";\n\n","/**\n * Date/time utility functions for timestamp formatting and timezone conversions\n */\n\n\n\n\n\n\n/**\n * Format a date string or Date object to ISO8601 format in specified timezone\n * Always returns UTC-based ISO strings (YYYY-MM-DDTHH:mm:ssZ) as internal representation\n * \n * @param value - Date object, ISO string, or timestamp\n * @param options - Formatting options\n * @returns ISO8601 formatted string\n */\nexport function formatDate(value, options = {}) {\n    if (value === undefined || value === null) {\n        return \"\";\n    }\n\n    const { timezone = \"UTC\", format = \"iso\" } = options;\n    \n    let date;\n    if (value instanceof Date) {\n        date = value;\n    } else if (typeof value === \"string\") {\n        date = new Date(value);\n    } else if (typeof value === \"number\") {\n        date = new Date(value);\n    } else {\n        return \"\";\n    }\n\n    if (isNaN(date.getTime())) {\n        return \"\";\n    }\n\n    // Format based on requested format\n    switch (format) {\n        case \"iso\":\n            // Full ISO8601: 2025-01-01T01:01:01Z\n            return date.toISOString();\n        \n        case \"iso-date\":\n            // Date only: 2025-01-01\n            return date.toISOString().split(\"T\")[0];\n        \n        case \"iso-time\":\n            // Time only: 01:01:01Z\n            return date.toISOString().split(\"T\")[1];\n        \n        case \"human\":\n            // Human-readable: Jan 1, 2025 01:01:01 UTC\n            if (timezone === \"user\") {\n                return date.toLocaleString();\n            }\n            return date.toUTCString();\n        \n        default:\n            return date.toISOString();\n    }\n}\n\n/**\n * Parse a date value and return ISO8601 string in UTC\n * This is the canonical format for internal storage\n * \n * @param value - Date object or string\n * @returns ISO8601 string in UTC timezone\n */\nexport function toISOString(value) {\n    return formatDate(value, { timezone: \"UTC\", format: \"iso\" });\n}\n\n/**\n * Get current timestamp as ISO8601 string in UTC\n * @returns Current time as ISO8601 string\n */\nexport function nowISO() {\n    return new Date().toISOString();\n}\n\n/**\n * Parse ISO8601 string to Date object\n * @param isoString - ISO8601 formatted string\n * @returns Date object\n */\nexport function fromISOString(isoString) {\n    return new Date(isoString);\n}\n\n/**\n * Calculate difference between two dates in various units\n * @param start - Start date (ISO string or Date)\n * @param end - End date (ISO string or Date)\n * @returns Object with duration in multiple units\n */\nexport function dateDiff(\n    start,\n    end\n)\n\n\n\n\n\n{\n    const startDate = start instanceof Date ? start : new Date(start);\n    const endDate = end instanceof Date ? end : new Date(end);\n    \n    const diffMs = endDate.getTime() - startDate.getTime();\n    \n    return {\n        milliseconds: diffMs,\n        seconds: Math.floor(diffMs / 1000),\n        minutes: Math.floor(diffMs / (1000 * 60)),\n        hours: Math.floor(diffMs / (1000 * 60 * 60)),\n        days: Math.floor(diffMs / (1000 * 60 * 60 * 24))\n    };\n}\n\n/**\n * Check if a folder name looks like an ISO8601 timestamp\n * Used to identify version folders vs regular folders\n * @param folderName - Folder name to check\n * @returns true if the folder name is a valid ISO8601 timestamp\n */\nexport function isTimestampFolder(folderName) {\n    // Match ISO8601 format: YYYY-MM-DDTHH:mm:ssZ\n    const isoRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|\\.\\d{3}Z)$/;\n    \n    if (!isoRegex.test(folderName)) {\n        return false;\n    }\n    \n    const date = new Date(folderName);\n    return !isNaN(date.getTime()) && date.getTime() > 0;\n}\n\n/**\n * Generate a new version name (ISO8601 timestamp)\n * If existingVersions provided, ensures the new version is later than all existing ones\n * @param existingVersions - Array of existing version timestamps\n * @returns New version timestamp that is unique and later than existing ones\n */\nexport function generateVersionName(existingVersions = []) {\n    if (existingVersions.length === 0) {\n        // No existing versions, use current timestamp\n        const now = new Date();\n        return now.toISOString().split(\".\")[0] + \"Z\";\n    }\n    \n    // Find the maximum timestamp among all existing versions\n    const maxTimestamp = existingVersions.reduce((max, version) => {\n        const versionDate = new Date(version);\n        const maxDate = new Date(max);\n        return versionDate > maxDate ? version : max;\n    });\n    \n    // Increment by 1 second to ensure uniqueness\n    const maxDate = new Date(maxTimestamp);\n    const nextDate = new Date(maxDate.getTime() + 1000);\n    \n    return nextDate.toISOString().split(\".\")[0] + \"Z\";\n}\n\n","/**\n * File System Utilities\n * \n * Helper functions for file system operations like path management,\n * directory creation, and file type detection\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n/**\n * Ensure a directory path exists, creating it if necessary\n * Returns the absolute path\n */\nexport async function ensurePath(...pathParts) {\n    const fullPath = path.resolve(...pathParts);\n    \n    if (!fs.existsSync(fullPath)) {\n        await fs.promises.mkdir(fullPath, { recursive: true });\n    }\n    \n    return fullPath;\n}\n\n/**\n * Synchronous version of ensurePath\n */\nexport function ensurePathSync(...pathParts) {\n    const fullPath = path.resolve(...pathParts);\n    \n    if (!fs.existsSync(fullPath)) {\n        fs.mkdirSync(fullPath, { recursive: true });\n    }\n    \n    return fullPath;\n}\n\n/**\n * Get file extension for a given data type\n */\nexport function getFileExtension(dataType) {\n    switch (dataType) {\n        case \"json-array\":\n        case \"json-object\":\n            return \"json\";\n        case \"text\":\n            return \"txt\";\n        case \"xml\":\n            return \"xml\";\n        default:\n            return \"json\";\n    }\n}\n\n/**\n * Get __dirname equivalent for ES modules\n * \n * Returns the directory path of the module file\n * Useful for resolving relative paths in ES modules where __dirname is not available\n * \n * @param metaUrl - The import.meta.url from the calling module (must be passed from calling module)\n * @returns The directory path of the module\n * \n * @example\n * ```typescript\n * import { getDirname } from \"@nmakarov/cli-toolkit/utils\";\n * const __dirname = getDirname(import.meta.url);\n * ```\n */\nexport function getDirname(metaUrl) {\n    return path.dirname(fileURLToPath(metaUrl));\n}\n\n","/**\n * Operating System Utilities\n * \n * Helper functions for interacting with the operating system\n * to get system statistics and information\n */\n\nimport fs from \"fs\";\nimport path from \"path\";\nimport { execSync } from \"child_process\";\n\n/**\n * Get free disk space for a given path (in bytes)\n * Returns null if unable to determine\n * Uses `df` command on Unix-like systems\n */\nexport function getFreeDiskSpace(targetPath) {\n    try {\n        // If the target path doesn't exist, use its parent directory\n        let pathToCheck = targetPath;\n        if (!fs.existsSync(targetPath)) {\n            const parentDir = path.dirname(targetPath);\n            if (fs.existsSync(parentDir)) {\n                pathToCheck = parentDir;\n            } else {\n                // If parent doesn't exist either, use the root directory\n                pathToCheck = process.platform === \"win32\" ? \"C:\\\\\" : \"/\";\n            }\n        }\n\n        if (process.platform === \"win32\") {\n            // Windows: use wmic command\n            // Note: This is a simplified implementation, may need adjustments\n            return null; // TODO: Implement robust Windows support\n        } else {\n            // Unix-like systems: use df command\n            const stdout = execSync(`df -k \"${pathToCheck}\"`, { encoding: \"utf8\" });\n            const lines = stdout.trim().split(\"\\n\");\n            const parts = lines[1].split(/\\s+/); // second line, split on whitespace\n            const freeKb = parseInt(parts[3], 10); // 4th column is \"Available\"\n            return freeKb * 1024; // Convert to bytes\n        }\n    } catch (error) {\n        // Silently fail and return null\n        return null;\n    }\n}\n\n/**\n * Free / total bytes for the volume that holds `targetPath` (Node `fs.statfs`).\n * Returns null when the call is unavailable or fails.\n *\n * @param {string} targetPath\n * @returns {Promise<{ free: number, total: number, freeRatio: number } | null>}\n */\nexport async function getDiskUsage(targetPath) {\n    const fsPromises = await import(\"node:fs/promises\");\n    try {\n        let pathToCheck = targetPath;\n        if (!fs.existsSync(pathToCheck)) {\n            const parentDir = path.dirname(pathToCheck);\n            pathToCheck = fs.existsSync(parentDir)\n                ? parentDir\n                : process.platform === \"win32\"\n                  ? \"C:\\\\\"\n                  : \"/\";\n        }\n        if (typeof fsPromises.statfs !== \"function\") return null;\n        const stats = await fsPromises.statfs(pathToCheck);\n        const total = Number(stats.bsize) * Number(stats.blocks);\n        const free = Number(stats.bsize) * Number(stats.bavail);\n        if (!Number.isFinite(total) || total <= 0) return null;\n        return { free, total, freeRatio: free / total };\n    } catch {\n        return null;\n    }\n}\n\n","/**\n * Formatting Utilities\n * \n * Helper functions for converting between different data formats\n * and human-readable representations\n */\n\n/**\n * Convert bytes to human-readable format (e.g., \"1.5 MB\")\n */\nexport function bytesToHumanReadable(bytes) {\n    if (bytes === 0) return \"0 B\";\n    \n    const k = 1024;\n    const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n    const i = Math.floor(Math.log(bytes) / Math.log(k));\n    \n    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\n/**\n * Convert human-readable format to bytes (e.g., \"1.5 MB\" -> 1572864)\n */\nexport function humanReadableToBytes(humanString) {\n    const units = {\n        \"B\": 1,\n        \"KB\": 1024,\n        \"MB\": 1024 * 1024,\n        \"GB\": 1024 * 1024 * 1024,\n        \"TB\": 1024 * 1024 * 1024 * 1024,\n        \"PB\": 1024 * 1024 * 1024 * 1024 * 1024,\n    };\n    \n    const match = humanString.trim().match(/^([\\d.]+)\\s*([A-Z]+)$/i);\n    if (!match) {\n        throw new Error(`Invalid format: ${humanString}. Expected format like \"2MB\" or \"1.5 GB\"`);\n    }\n    \n    const value = parseFloat(match[1]);\n    const unit = match[2].toUpperCase();\n    \n    if (!units[unit]) {\n        throw new Error(`Unknown unit: ${unit}. Supported units: ${Object.keys(units).join(\", \")}`);\n    }\n    \n    return Math.round(value * units[unit]);\n}\n\n","/**\n * Cryptography Utilities\n * \n * Helper functions for hashing, encryption, and data masking\n */\n\nimport crypto from \"crypto\";\n\n/**\n * Calculate MD5 hash of a string (useful for content fingerprinting)\n */\nexport function md5(value) {\n    return crypto.createHash(\"md5\").update(value).digest(\"hex\");\n}\n\n/**\n * Sanitize sensitive data by replacing with MD5 hash\n * Useful for logging sensitive information while maintaining traceability\n */\nexport function maskValue(value) {\n    return `[md5:${md5(value)}]`;\n}\n\n","/**\n * Core lightweight utilities\n */\n\nexport function sleepMs(ms) {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function toJsonColumn(value) {\n    if (value === undefined || value === null) return null;\n    return JSON.stringify(value);\n}\n"],"mappings":"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","names":["maxDate","path","fs","import_fs","import_path","fs","path","crypto"]}