diff --git a/src/command.js b/src/command.js index b42faa2..6e95daf 100644 --- a/src/command.js +++ b/src/command.js @@ -2,20 +2,15 @@ import isWindows from 'is-windows' export default commandConvert -const envUseUnixRegex = /\$(\w+)/ // $my_var -const envUseWinRegex = /%(.*?)%/ // %my_var% - /** * Converts an environment variable usage to be appropriate for the current OS * @param {String} command Command to convert * @returns {String} Converted command */ function commandConvert(command) { + const envUseUnixRegex = /\$(\w+)|\${(\w+)}/g // $my_var or ${my_var} + const envUseWinRegex = /%(.*?)%/g // %my_var% const isWin = isWindows() const envExtract = isWin ? envUseUnixRegex : envUseWinRegex - const match = envExtract.exec(command) - if (match) { - command = isWin ? `%${match[1]}%` : `$${match[1]}` - } - return command + return command.replace(envExtract, isWin ? '%$1$2%' : '$$$1') } diff --git a/src/command.test.js b/src/command.test.js index 1c9f1f8..96d25a6 100644 --- a/src/command.test.js +++ b/src/command.test.js @@ -30,3 +30,29 @@ test(`is stateless`, () => { isWindowsMock.__mock.returnValue = true expect(commandConvert('$test')).toBe(commandConvert('$test')) }) + +test(`converts embedded unix-style env variables usage for windows`, () => { + isWindowsMock.__mock.returnValue = true + expect(commandConvert('$test1/$test2/$test3')).toBe( + '%test1%/%test2%/%test3%', + ) +}) + +test(`converts embedded windows-style env variables usage for linux`, () => { + isWindowsMock.__mock.returnValue = false + expect(commandConvert('%test1%/%test2%/%test3%')).toBe( + '$test1/$test2/$test3', + ) +}) + +// eslint-disable-next-line max-len +test(`leaves embedded variables unchanged when using correct operating system`, () => { + isWindowsMock.__mock.returnValue = false + expect(commandConvert('$test1/$test2/$test3')).toBe('$test1/$test2/$test3') +}) + +test(`converts braced unix-style env variable usage for windows`, () => { + isWindowsMock.__mock.returnValue = true + // eslint-disable-next-line no-template-curly-in-string + expect(commandConvert('${test}')).toBe('%test%') +})