| 'use strict'; | |
| 
 | |
| // See http://www.robvanderwoude.com/escapechars.php | |
| const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; | |
| 
 | |
| function escapeCommand(arg) { | |
|     // Escape meta chars | |
|     arg = arg.replace(metaCharsRegExp, '^$1'); | |
| 
 | |
|     return arg; | |
| } | |
| 
 | |
| function escapeArgument(arg, doubleEscapeMetaChars) { | |
|     // Convert to string | |
|     arg = `${arg}`; | |
| 
 | |
|     // Algorithm below is based on https://qntm.org/cmd | |
|     // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input | |
|     // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information | |
|  | |
|     // Sequence of backslashes followed by a double quote: | |
|     // double up all the backslashes and escape the double quote | |
|     arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"'); | |
| 
 | |
|     // Sequence of backslashes followed by the end of the string | |
|     // (which will become a double quote later): | |
|     // double up all the backslashes | |
|     arg = arg.replace(/(?=(\\+?)?)\1$/, '$1$1'); | |
| 
 | |
|     // All other backslashes occur literally | |
|  | |
|     // Quote the whole thing: | |
|     arg = `"${arg}"`; | |
| 
 | |
|     // Escape meta chars | |
|     arg = arg.replace(metaCharsRegExp, '^$1'); | |
| 
 | |
|     // Double escape meta chars if necessary | |
|     if (doubleEscapeMetaChars) { | |
|         arg = arg.replace(metaCharsRegExp, '^$1'); | |
|     } | |
| 
 | |
|     return arg; | |
| } | |
| 
 | |
| module.exports.command = escapeCommand; | |
| module.exports.argument = escapeArgument;
 |