aboutsummaryrefslogtreecommitdiff
path: root/deps/node/deps/npm/node_modules/opener/lib/opener.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/node/deps/npm/node_modules/opener/lib/opener.js')
-rw-r--r--deps/node/deps/npm/node_modules/opener/lib/opener.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/deps/node/deps/npm/node_modules/opener/lib/opener.js b/deps/node/deps/npm/node_modules/opener/lib/opener.js
new file mode 100644
index 00000000..5fa88f37
--- /dev/null
+++ b/deps/node/deps/npm/node_modules/opener/lib/opener.js
@@ -0,0 +1,66 @@
+"use strict";
+var childProcess = require("child_process");
+var os = require("os");
+
+module.exports = function opener(args, options, callback) {
+ var platform = process.platform;
+
+ // Attempt to detect Windows Subystem for Linux (WSL). WSL itself as Linux (which works in most cases), but in
+ // this specific case we need to treat it as actually being Windows. The "Windows-way" of opening things through
+ // cmd.exe works just fine here, whereas using xdg-open does not, since there is no X Windows in WSL.
+ if (platform === "linux" && os.release().indexOf("Microsoft") !== -1) {
+ platform = "win32";
+ }
+
+ // http://stackoverflow.com/q/1480971/3191, but see below for Windows.
+ var command;
+ switch (platform) {
+ case "win32": {
+ command = "cmd.exe";
+ break;
+ }
+ case "darwin": {
+ command = "open";
+ break;
+ }
+ default: {
+ command = "xdg-open";
+ break;
+ }
+ }
+
+ if (typeof args === "string") {
+ args = [args];
+ }
+
+ if (typeof options === "function") {
+ callback = options;
+ options = {};
+ }
+
+ if (options && typeof options === "object" && options.command) {
+ if (platform === "win32") {
+ // *always* use cmd on windows
+ args = [options.command].concat(args);
+ } else {
+ command = options.command;
+ }
+ }
+
+ if (platform === "win32") {
+ // On Windows, we really want to use the "start" command. But, the rules regarding arguments with spaces, and
+ // escaping them with quotes, can get really arcane. So the easiest way to deal with this is to pass off the
+ // responsibility to "cmd /c", which has that logic built in.
+ //
+ // Furthermore, if "cmd /c" double-quoted the first parameter, then "start" will interpret it as a window title,
+ // so we need to add a dummy empty-string window title: http://stackoverflow.com/a/154090/3191
+ //
+ // Additionally, on Windows ampersand needs to be escaped when passed to "start"
+ args = args.map(function (value) {
+ return value.replace(/&/g, "^&");
+ });
+ args = ["/c", "start", "\"\""].concat(args);
+ }
+
+ return childProcess.execFile(command, args, options, callback);
+};