All files / lib/utils escape-exec-path.js

100% Statements 8/8
100% Branches 6/6
100% Functions 3/3
100% Lines 5/5

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 222x 2x                           3x 2x   5x      
const { normalize } = require('path')
const isWindows = require('./is-windows.js')
 
/*
Escape the name of an executable suitable for passing to the system shell.
 
Windows is easy, wrap in double quotes and you're done, as there's no
facility to create files with quotes in their names.
 
Unix-likes are a little more complicated, wrap in single quotes and escape
any single quotes in the filename.  The '"'"' construction ends the quoted
block, creates a new " quoted string with ' in it.  So, `foo'bar` becomes
`'foo'"'"'bar'`, which is the bash way of saying `'foo' + "'" + 'bar'`.
*/
 
const winQuote = str => !/ /.test(str) ? str : '"' + str + '"'
const winEsc = str => normalize(str).split(/\\/).map(winQuote).join('\\')
 
module.exports = str => isWindows ? winEsc(str)
  : /[^-_.~/\w]/.test(str) ? "'" + str.replace(/'/g, '\'"\'"\'') + "'"
  : str