mono/packages/vfs/ref/utils/open.ts

60 lines
1.7 KiB
TypeScript

import * as childProcess from 'child_process';
/**
* open a file or uri using the default application for the file type.
*
* @return {ChildProcess} - the child process object.
* @param {string} target - the file/uri to open.
* @param {string} appName - (optional) the application to be used to open the
* file (for example, "chrome", "firefox")
* @param {function(Error)} callback - called with null on success, or
* an error object that contains a property 'code' with the exit
* code of the process.
*/
export default function (target: string, appName: string | Function, callback?: Function) {
let opener: string;
if (typeof appName === 'function') {
callback = appName;
appName = null;
}
switch (process.platform) {
case 'darwin':
if (typeof appName === 'string') {
opener = 'open -a "' + escape(appName) + '"';
} else {
opener = 'open';
}
break;
case 'win32':
// if the first parameter to start is quoted, it uses that as the title
// so we pass a blank title so we can quote the file we are opening
if (typeof appName === 'string') {
opener = 'start "" "' + escape(appName) + '"';
} else {
opener = 'start ""';
}
break;
default:
if (typeof appName === 'string') {
opener = escape(appName);
} else {
// use system installed Portlands xdg-open everywhere else
opener = 'xdg-open';
}
break;
}
if (process.env.SUDO_USER) {
opener = 'sudo -u ' + process.env.SUDO_USER + ' ' + opener;
}
console.log('open ' + opener + ' "' + escape(target) + '"');
return childProcess.exec(opener + ' "' + escape(target) + '"');
}
function escape(s: string) {
return s.replace(/"/g, '\\\"');
}