@xec-sh/core
Version:
Universal shell execution engine
118 lines • 3.56 kB
JavaScript
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