mirror of
https://github.com/ivabus/gui
synced 2025-04-24 14:37:11 +03:00
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import { spawn, exec } from 'child_process';
|
|
import { clean } from 'semver';
|
|
import { promisify } from 'util';
|
|
|
|
const execPromise = promisify(exec);
|
|
|
|
export async function installPackage(full_name: string) {
|
|
return await new Promise((resolve, reject) => {
|
|
let version = '';
|
|
let lastError = '';
|
|
const teaInstallation = spawn('tea', [`+${full_name}`, 'true']);
|
|
|
|
teaInstallation.stdout.on('data', (data) => {
|
|
console.log('stdout:', data);
|
|
});
|
|
|
|
teaInstallation.stderr.on('data', (err) => {
|
|
lastError = err.toString();
|
|
if (lastError && lastError.includes('installed') && lastError.includes(full_name)) {
|
|
version = lastError.split('/').pop() || '';
|
|
}
|
|
});
|
|
|
|
teaInstallation.on('exit', (code) => {
|
|
if (code === 0) {
|
|
resolve({ version: clean(version) });
|
|
} else {
|
|
reject(new Error(lastError));
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
export async function openTerminal(cmd: string) {
|
|
try {
|
|
// TODO SECURITY: escape the cmd if possible or create whitelist of acceptable commands
|
|
return await exec(open(cmd));
|
|
} catch (error) {
|
|
console.error('root:', error);
|
|
}
|
|
}
|
|
|
|
const open = (cmd) => `osascript -e '
|
|
if application "iTerm" is running then
|
|
tell application "iTerm"
|
|
tell current window
|
|
create tab with default profile
|
|
tell current session
|
|
write text "${cmd.replace(/"/g, '\\"')}"
|
|
end tell
|
|
end tell
|
|
end tell
|
|
else
|
|
activate application "iTerm"
|
|
delay 3
|
|
tell application "iTerm"
|
|
tell current window
|
|
tell current session
|
|
write text "${cmd.replace(/"/g, '\\"')}"
|
|
end tell
|
|
end tell
|
|
end tell
|
|
end if
|
|
'`;
|