UNPKG

@xec-sh/core

Version:

Universal shell execution engine

118 lines 3.56 kB
import { platform } from 'node:os'; import shellEscape from 'shell-escape'; export function escapeArg(arg) { if (typeof arg === 'number' || typeof arg === 'boolean') { return String(arg); } if (platform() === 'win32') { return escapeWindowsArg(arg); } return shellEscape([arg]); } export function escapeCommand(cmd, args = []) { if (args.length === 0) { return cmd; } const escapedArgs = args.map(arg => escapeArg(arg)); return `${cmd} ${escapedArgs.join(' ')}`; } function escapeWindowsArg(arg) { const needsEscaping = /[\s"\\&|<>^()@!%]/.test(arg); if (!needsEscaping) { return arg; } let escaped = arg; escaped = escaped.replace(/"/g, '\\"'); escaped = escaped.replace(/(\\+)\\"/g, (match, backslashes) => backslashes + backslashes + '\\"'); escaped = escaped.replace(/(\\+)$/, (match, backslashes) => backslashes + backslashes); return `"${escaped}"`; } export function interpolate(strings, ...values) { return interpolateWithQuote(strings, undefined, ...values); } export function interpolateRaw(strings, ...values) { let result = ''; for (let i = 0; i < strings.length; i++) { result += strings[i]; if (i < values.length) { const value = values[i]; if (value === null || value === undefined) { } else if (Array.isArray(value)) { result += value.map(v => valueToString(v)).join(' '); } else { result += valueToString(value); } } } return result; } export function interpolateWithQuote(strings, quoteFn, ...values) { let result = ''; for (let i = 0; i < strings.length; i++) { result += strings[i]; if (i < values.length) { const value = values[i]; if (value === null || value === undefined) { } else if (Array.isArray(value)) { result += value.map(v => { const str = valueToString(v); return quoteFn ? quoteFn(str) : escapeArg(str); }).join(' '); } else { const str = valueToString(value); result += quoteFn ? quoteFn(str) : escapeArg(str); } } } return result; } function valueToString(value) { if (value === null || value === undefined) { return ''; } else if (typeof value === 'string') { return value; } else if (typeof value === 'number' || typeof value === 'boolean') { return String(value); } else if (value instanceof Date) { return value.toISOString(); } else if (typeof value === 'object') { if ('stdout' in value && typeof value.text === 'function') { return value.text(); } try { return JSON.stringify(value); } catch (_) { return String(value); } } else { return String(value); } } export function quote(arg) { if (arg === '') return `$''`; if (/^[\w/.\-@:=]+$/.test(arg)) return arg; return (`$'` + arg .replace(/\\/g, '\\\\') .replace(/'/g, "\\'") .replace(/\f/g, '\\f') .replace(/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t') .replace(/\v/g, '\\v') .replace(/\0/g, '\\0') + `'`); } //# sourceMappingURL=shell-escape.js.map