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

Dont change non path on win32 #107

Merged
merged 6 commits into from Apr 13, 2017
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/index.js
Expand Up @@ -52,7 +52,7 @@ function getEnvVars(envSetters) {
envVars.APPDATA = process.env.APPDATA
}
Object.keys(envSetters).forEach(varName => {
envVars[varName] = varValueConvert(envSetters[varName])
envVars[varName] = varValueConvert(envSetters[varName], varName)
})
return envVars
}
18 changes: 15 additions & 3 deletions src/variable.js
@@ -1,14 +1,26 @@
import isWindows from 'is-windows'

const pathLikeEnvVarWhitelist = ['PATH', 'NODE_PATH'].reduce(
Copy link
Contributor

Choose a reason for hiding this comment

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

This seems overly complicated. What about simply new Set(['PATH', 'NODE_PATH'])?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

TIL

(acc, x) => {
acc.add(x)
return acc
},
new Set(),
)

/**
* This will transform UNIX-style list values to Windows-style.
* For example, the value of the $PATH variable "/usr/bin:/usr/local/bin:."
* will become "/usr/bin;/usr/local/bin;." on Windows.
* @param {String} varValue Original value of the env variable
* @returns {String} Converted value
*/
function replaceListDelimiters(varValue) {
function replaceListDelimiters(varValue, varName = '') {
const targetSeparator = isWindows() ? ';' : ':'
if (!pathLikeEnvVarWhitelist.has(varName)) {
return varValue
}

return varValue.replace(/(\\*):/g, (match, backslashes) => {
if (backslashes.length % 2) {
// Odd number of backslashes preceding it means it's escaped,
Expand Down Expand Up @@ -44,6 +56,6 @@ function resolveEnvVars(varValue) {
* @param {String} originalValue Original value of the env variable
* @returns {String} Converted value
*/
export default function varValueConvert(originalValue) {
return resolveEnvVars(replaceListDelimiters(originalValue))
export default function varValueConvert(originalValue, originalName) {
return resolveEnvVars(replaceListDelimiters(originalValue, originalName))
}
30 changes: 20 additions & 10 deletions src/variable.test.js
Expand Up @@ -19,37 +19,47 @@ test(`doesn't affect simple variable values`, () => {

test(`doesn't convert a ; into a : on UNIX`, () => {
isWindowsMock.__mock.returnValue = false
expect(varValueConvert('foo;bar')).toBe('foo;bar')
expect(varValueConvert('foo;bar', 'PATH')).toBe('foo;bar')
})

test(`converts a : into a ; on Windows`, () => {
test(`doesn't convert a ; into a : for non-PATH on UNIX`, () => {
isWindowsMock.__mock.returnValue = false
expect(varValueConvert('foo;bar', 'FOO')).toBe('foo;bar')
})

test(`doesn't convert a ; into a : for non-PATH on Windows`, () => {
isWindowsMock.__mock.returnValue = true
expect(varValueConvert('foo;bar', 'FOO')).toBe('foo;bar')
})

test(`converts a : into a ; on Windows if PATH`, () => {
isWindowsMock.__mock.returnValue = true
expect(varValueConvert('foo:bar')).toBe('foo;bar')
expect(varValueConvert('foo:bar', 'PATH')).toBe('foo;bar')
})

test(`doesn't convert already valid separators`, () => {
isWindowsMock.__mock.returnValue = false
expect(varValueConvert('foo:bar')).toBe('foo:bar')
})

test(`doesn't convert escaped separators on Windows`, () => {
test(`doesn't convert escaped separators on Windows if PATH`, () => {
isWindowsMock.__mock.returnValue = true
expect(varValueConvert('foo\\:bar')).toBe('foo:bar')
expect(varValueConvert('foo\\:bar', 'PATH')).toBe('foo:bar')
})

test(`doesn't convert escaped separators on UNIX`, () => {
isWindowsMock.__mock.returnValue = false
expect(varValueConvert('foo\\:bar')).toBe('foo:bar')
expect(varValueConvert('foo\\:bar', 'PATH')).toBe('foo:bar')
})

test(`converts a separator even if preceded by an escaped backslash`, () => {
test(`converts a separator even if preceded by an escaped backslash if PATH`, () => {
isWindowsMock.__mock.returnValue = true
expect(varValueConvert('foo\\\\:bar')).toBe('foo\\\\;bar')
expect(varValueConvert('foo\\\\:bar', 'PATH')).toBe('foo\\\\;bar')
})

test(`converts multiple separators`, () => {
test(`converts multiple separators if PATH`, () => {
isWindowsMock.__mock.returnValue = true
expect(varValueConvert('foo:bar:baz')).toBe('foo;bar;baz')
expect(varValueConvert('foo:bar:baz', 'PATH')).toBe('foo;bar;baz')
})

test(`resolves an env variable value`, () => {
Expand Down