This repository has been archived by the owner on Jan 6, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 247
feat(args): convert embedded and braced variables in command args #86
Merged
Merged
Changes from 2 commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,8 +2,8 @@ import isWindows from 'is-windows' | |
|
||
export default commandConvert | ||
|
||
const envUseUnixRegex = /\$(\w+)/ // $my_var | ||
const envUseWinRegex = /%(.*?)%/ // %my_var% | ||
const envUseUnixRegex = /\$(\w+)|\${(\w+)}/g // $my_var or ${my_var} | ||
const envUseWinRegex = /%(.*?)%/g // %my_var% | ||
|
||
/** | ||
* Converts an environment variable usage to be appropriate for the current OS | ||
|
@@ -13,9 +13,5 @@ const envUseWinRegex = /%(.*?)%/ // %my_var% | |
function commandConvert(command) { | ||
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') | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice! |
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,3 +30,30 @@ 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', | ||
) | ||
}) | ||
|
||
test(` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm guessing you had to do this because of linting? How about instead you just make it one line and add:
On the line above this one. Would that be ok? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure. |
||
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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%') | ||
}) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we need to be concerned about the
g
here based on your last PR? Perhaps we could just inline these regex declarations within thecommandConvert
function. I'm sure there's no relevant perf issues with that, and we could avoid the stateful nature ofg
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The issue from my last PR arises from the use of
g
andRegExp.prototype.exec
. So here it is OK to useg
becauseexec
is not used anymore, and the test I added ensures the problem does not return in the future. That said, I also think inlining would be even safer, so I'll do that. Would you prefer that I keep them as variable insidecommandConvert
or that I inline them directly in the ternary on line 15?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Keep them as a variable. That'll help it be self-documenting 👏