1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- 'use strict'
- // eslint-disable-next-line max-len
- // this code adapted from: https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/
- const cmd = (input, doubleEscape) => {
- if (!input.length) {
- return '""'
- }
- let result
- if (!/[ \t\n\v"]/.test(input)) {
- result = input
- } else {
- result = '"'
- for (let i = 0; i <= input.length; ++i) {
- let slashCount = 0
- while (input[i] === '\\') {
- ++i
- ++slashCount
- }
- if (i === input.length) {
- result += '\\'.repeat(slashCount * 2)
- break
- }
- if (input[i] === '"') {
- result += '\\'.repeat(slashCount * 2 + 1)
- result += input[i]
- } else {
- result += '\\'.repeat(slashCount)
- result += input[i]
- }
- }
- result += '"'
- }
- // and finally, prefix shell meta chars with a ^
- result = result.replace(/[ !%^&()<>|"]/g, '^$&')
- if (doubleEscape) {
- result = result.replace(/[ !%^&()<>|"]/g, '^$&')
- }
- return result
- }
- const sh = (input) => {
- if (!input.length) {
- return `''`
- }
- if (!/[\t\n\r "#$&'()*;<>?\\`|~]/.test(input)) {
- return input
- }
- // replace single quotes with '\'' and wrap the whole result in a fresh set of quotes
- const result = `'${input.replace(/'/g, `'\\''`)}'`
- // if the input string already had single quotes around it, clean those up
- .replace(/^(?:'')+(?!$)/, '')
- .replace(/\\'''/g, `\\'`)
- return result
- }
- module.exports = {
- cmd,
- sh,
- }
|