Skip to content

Commit

Permalink
only replace process.env variable if value is defined
Browse files Browse the repository at this point in the history
This fixes goatandsheep#251 (comment)

react-native sets the `NODE_ENV` **after** this transformation happens.
Code that directly access `process.env.NODE_ENV` was replaced by `babelMode` during transformation (if latest babel was used) or by `undefined`.

With this commit, any access to a `process.env` variable is only replaced by the corresponding value if its value is set.
  • Loading branch information
schiller-manuel committed Jun 7, 2022
1 parent 3a940cb commit 9f3cffd
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 4 deletions.
8 changes: 8 additions & 0 deletions __tests__/__fixtures__/process-env-propagate/.babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"plugins": [
["../../../", {
"path": "__tests__/__fixtures__/process-env-propagate/.env",
"moduleName": "process.env"
}]
]
}
1 change: 1 addition & 0 deletions __tests__/__fixtures__/process-env-propagate/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# empty on purpose
1 change: 1 addition & 0 deletions __tests__/__fixtures__/process-env-propagate/source.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log(process.env.NODE_ENV)
8 changes: 8 additions & 0 deletions __tests__/__fixtures__/process-env-undefined/.babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"plugins": [
["../../../", {
"path": "__tests__/__fixtures__/process-env-undefined/.env",
"moduleName": "process.env"
}]
]
}
1 change: 1 addition & 0 deletions __tests__/__fixtures__/process-env-undefined/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# empty on purpose
1 change: 1 addition & 0 deletions __tests__/__fixtures__/process-env-undefined/source.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
console.log(process.env.UNDEFINED_VAR)
14 changes: 14 additions & 0 deletions __tests__/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,20 @@ describe('react-native-dotenv', () => {
expect(code).toBe('console.log("abc123");\nconsole.log("username");\nconsole.log("test");')
})

it('should not change undefined process.env variables', () => {
const {code} = transformFileSync(FIXTURES + 'process-env-undefined/source.js')
expect(code).toBe('console.log(process.env.UNDEFINED_VAR);')
})

it('should propagate process.env variables from node process', () => {
const customEnv = 'my-custom-env'
const backupNodeEnv = process.env.NODE_ENV
process.env.NODE_ENV = customEnv
const {code} = transformFileSync(FIXTURES + 'process-env-propagate/source.js')
expect(code).toBe(`console.log("${customEnv}");`)
process.env.NODE_ENV = backupNodeEnv
})

it('should allow specifying the package module name', () => {
const {code} = transformFileSync(FIXTURES + 'module-name/source.js')
expect(code).toBe('// eslint-disable-next-line import/no-unresolved\nconsole.log("abc123");\nconsole.log("username");')
Expand Down
7 changes: 3 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ module.exports = (api, options) => {
const modeLocalParsed = parseDotenvFile(modeLocalFilePath, options.verbose)

this.env = safeObjectAssign(Object.assign(Object.assign(Object.assign(parsed, modeParsed), localParsed), modeLocalParsed), dotenvTemporary, ['NODE_ENV', 'BABEL_ENV', options.envName])
this.env.NODE_ENV = process.env.NODE_ENV || babelMode
} else {
dotenv.config({
path: modeLocalFilePath,
Expand Down Expand Up @@ -132,7 +131,6 @@ module.exports = (api, options) => {
const modeParsed = parseDotenvFile(modeFilePath)
const modeLocalParsed = parseDotenvFile(modeLocalFilePath)
this.env = safeObjectAssign(Object.assign(Object.assign(Object.assign(parsed, modeParsed), localParsed), modeLocalParsed), dotenvTemporary, ['NODE_ENV', 'BABEL_ENV', options.envName])
this.env.NODE_ENV = process.env.NODE_ENV || babelMode
} else {
dotenv.config({
path: modeLocalFilePath,
Expand Down Expand Up @@ -204,8 +202,9 @@ module.exports = (api, options) => {
if (t.isStringLiteral(key)) {
const importedId = key.value
const value = (opts.env && importedId in opts.env) ? opts.env[importedId] : process.env[importedId]

path.replaceWith(t.valueToNode(value))
if (value !== undefined) {
path.replaceWith(t.valueToNode(value))
}
}
}
},
Expand Down

0 comments on commit 9f3cffd

Please sign in to comment.