Skip to content
This repository has been archived by the owner on Jan 6, 2021. It is now read-only.

feat(args): convert embedded and braced variables in command args #86

Merged
merged 4 commits into from
Mar 14, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions src/command.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice!

}
26 changes: 26 additions & 0 deletions src/command.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Haha, one of the few cases where this rule needs to be disable 😆

expect(commandConvert('${test}')).toBe('%test%')
})