-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Allow token replacement of .npmrc configuration with env vars (#1207)
* test IGNORE ME * Update npm-registry to inject env vars into npm configuration the same way npm does * Add type annotation to config object iteration * Update envReplace function * Move env-replace function to a separate util module. Add unit tests * Correct the env-replace tests * Updates per @kittens' comments
- Loading branch information
1 parent
42dc14e
commit b4e42e3
Showing
4 changed files
with
55 additions
and
0 deletions.
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 |
---|---|---|
|
@@ -9,3 +9,4 @@ end_of_line = lf | |
[*.{js,json}] | ||
indent_style = space | ||
indent_size = 2 | ||
|
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 |
---|---|---|
@@ -0,0 +1,32 @@ | ||
/* @flow */ | ||
import envReplace from '../../src/util/env-replace'; | ||
import assert from 'assert'; | ||
|
||
describe('environment variable replacement', () => { | ||
it('will replace a token that exists in the environment', () => { | ||
let result = envReplace('test ${a} replacement', {a: 'token'}); | ||
assert(result === 'test token replacement', `result: ${result}`); | ||
|
||
result = envReplace('${a} replacement', {a: 'token'}); | ||
assert(result === 'token replacement', `result: ${result}`); | ||
|
||
result = envReplace('${a}', {a: 'token'}); | ||
assert(result === 'token', `result: ${result}`); | ||
}); | ||
|
||
it('will not replace a token that does not exist in the environment', () => { | ||
let thrown = false; | ||
try { | ||
envReplace('${a} replacement', {b: 'token'}); | ||
} catch (err) { | ||
thrown = true; | ||
assert(err.message === 'Failed to replace env in config: ${a}', `error message: ${err.message}`); | ||
} | ||
assert(thrown); | ||
}); | ||
|
||
it('will not replace a token when a the token-replacement mechanism is prefixed a backslash literal', () => { | ||
const result = envReplace('\\${a} replacement', {a: 'token'}); | ||
assert(result === '\\${a} replacement', `result: ${result}`); | ||
}); | ||
}); |
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
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 |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* @flow */ | ||
const ENV_EXPR = /(\\*)\$\{([^}]+)\}/g; | ||
|
||
export default function envReplace(value: string, env: {[key: string]: ?string} = process.env): string { | ||
if (typeof value !== 'string' || !value) { | ||
return value; | ||
} | ||
|
||
return value.replace(ENV_EXPR, (match: string, esc: string, envVarName: string) => { | ||
if (esc.length && esc.length % 2) { | ||
return match; | ||
} | ||
if (undefined === env[envVarName]) { | ||
throw new Error('Failed to replace env in config: ' + match); | ||
} | ||
return env[envVarName] || ''; | ||
}); | ||
} |