146 lines
3.3 KiB
JavaScript
146 lines
3.3 KiB
JavaScript
![]() |
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.executeCommand = void 0;
|
||
|
|
||
|
function _fs() {
|
||
|
const data = require("fs");
|
||
|
|
||
|
_fs = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _os() {
|
||
|
const data = require("os");
|
||
|
|
||
|
_os = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _path() {
|
||
|
const data = require("path");
|
||
|
|
||
|
_path = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _execa() {
|
||
|
const data = _interopRequireDefault(require("execa"));
|
||
|
|
||
|
_execa = function () {
|
||
|
return data;
|
||
|
};
|
||
|
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
|
|
||
|
/** Runs a command requestion permission to run elevated. */
|
||
|
const runElevated = command => {
|
||
|
// TODO: escape double quotes in args
|
||
|
// https://www.winhelponline.com/blog/vbscripts-and-uac-elevation/
|
||
|
|
||
|
/**
|
||
|
* Need to use a couple of intermediary files to make this work as
|
||
|
* `ShellExecute` only accepts a command so
|
||
|
*/
|
||
|
// prettier-ignore
|
||
|
const script = `If WScript.Arguments.length = 0 Then
|
||
|
Set objShell = CreateObject("Shell.Application")
|
||
|
'Pass a bogus argument, say [ uac]
|
||
|
objShell.ShellExecute "wscript.exe", Chr(34) & _
|
||
|
WScript.ScriptFullName & Chr(34) & " uac", "", "runas", 1
|
||
|
Else
|
||
|
Dim oShell
|
||
|
Set oShell = WScript.CreateObject ("WSCript.shell")
|
||
|
oShell.run "${command}"
|
||
|
Set oShell = Nothing
|
||
|
End If`;
|
||
|
const elevatedPath = (0, _path().join)((0, _os().tmpdir)(), `elevated-${Math.random()}.vbs`);
|
||
|
(0, _fs().writeFileSync)(elevatedPath, script, 'utf-8');
|
||
|
return (0, _execa().default)(elevatedPath);
|
||
|
};
|
||
|
/**
|
||
|
* Groups all string arguments into a single one. E.g.:
|
||
|
* ```js
|
||
|
* ['-m', '"Upgrade:', 'to', 'latest', 'version"'] --> ['-m', '"Upgrade: to latest version"']`
|
||
|
* ```
|
||
|
* @param args The arguments
|
||
|
* © webhint project
|
||
|
* (https://github.com/webhintio/hint/blob/30b8ba74f122d8b66fc5596d788dd1c7738f2d83/release/lib/utils.ts#L82)
|
||
|
* License: Apache-2
|
||
|
*/
|
||
|
|
||
|
|
||
|
const groupArgs = args => {
|
||
|
let isStringArgument = false;
|
||
|
const newArgs = args.reduce((acum, current) => {
|
||
|
if (isStringArgument) {
|
||
|
const last = acum[acum.length - 1];
|
||
|
acum[acum.length - 1] = `${last} ${current}`;
|
||
|
|
||
|
if (current.endsWith('"')) {
|
||
|
isStringArgument = false;
|
||
|
}
|
||
|
|
||
|
return acum;
|
||
|
}
|
||
|
|
||
|
if (current.startsWith('"')) {
|
||
|
/**
|
||
|
* Argument is split. I.e.: `['"part1', 'part2"'];`
|
||
|
*/
|
||
|
if (!current.endsWith('"')) {
|
||
|
isStringArgument = true;
|
||
|
acum.push(current);
|
||
|
return acum;
|
||
|
}
|
||
|
/**
|
||
|
* Argument is surrounded by "" that need to be removed.
|
||
|
* We just remove all the quotes because we don't escape any in our commands
|
||
|
*/
|
||
|
|
||
|
|
||
|
acum.push(current.replace(/"/g, ''));
|
||
|
return acum;
|
||
|
}
|
||
|
|
||
|
acum.push(current);
|
||
|
return acum;
|
||
|
}, []);
|
||
|
return newArgs;
|
||
|
};
|
||
|
/**
|
||
|
* Executes the given `command` on a shell taking care of slicing the parameters
|
||
|
* if needed.
|
||
|
*/
|
||
|
|
||
|
|
||
|
const executeShellCommand = (command, elevated = false) => {
|
||
|
const args = groupArgs(command.split(' '));
|
||
|
const program = args.shift();
|
||
|
|
||
|
if (elevated) {
|
||
|
return runElevated(command);
|
||
|
}
|
||
|
|
||
|
return (0, _execa().default)(program, args, {
|
||
|
shell: true
|
||
|
});
|
||
|
};
|
||
|
|
||
|
exports.executeCommand = executeShellCommand;
|
||
|
|
||
|
//# sourceMappingURL=executeWinCommand.js.map
|