aboutsummaryrefslogtreecommitdiff
path: root/node_modules/execa/lib/command.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/execa/lib/command.js')
-rw-r--r--node_modules/execa/lib/command.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/node_modules/execa/lib/command.js b/node_modules/execa/lib/command.js
new file mode 100644
index 0000000..859b006
--- /dev/null
+++ b/node_modules/execa/lib/command.js
@@ -0,0 +1,52 @@
+'use strict';
+const normalizeArgs = (file, args = []) => {
+ if (!Array.isArray(args)) {
+ return [file];
+ }
+
+ return [file, ...args];
+};
+
+const NO_ESCAPE_REGEXP = /^[\w.-]+$/;
+const DOUBLE_QUOTES_REGEXP = /"/g;
+
+const escapeArg = arg => {
+ if (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) {
+ return arg;
+ }
+
+ return `"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\"')}"`;
+};
+
+const joinCommand = (file, args) => {
+ return normalizeArgs(file, args).join(' ');
+};
+
+const getEscapedCommand = (file, args) => {
+ return normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' ');
+};
+
+const SPACES_REGEXP = / +/g;
+
+// Handle `execa.command()`
+const parseCommand = command => {
+ const tokens = [];
+ for (const token of command.trim().split(SPACES_REGEXP)) {
+ // Allow spaces to be escaped by a backslash if not meant as a delimiter
+ const previousToken = tokens[tokens.length - 1];
+ if (previousToken && previousToken.endsWith('\\')) {
+ // Merge previous token with current one
+ tokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`;
+ } else {
+ tokens.push(token);
+ }
+ }
+
+ return tokens;
+};
+
+module.exports = {
+ joinCommand,
+ getEscapedCommand,
+ parseCommand
+};