12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- '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
- };
|