@dotenvx/dotenvx 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -114
- package/package.json +1 -1
- package/src/cli/dotenvx.js +29 -22
- package/src/shared/logger.js +1 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
*a better dotenv*–from the creator of [`dotenv`](https://github.com/motdotla/dotenv).
|
|
4
4
|
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* run anywhere (cross-platform)
|
|
6
|
+
* multi-environment
|
|
7
|
+
* encrypted envs
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
@@ -62,6 +62,16 @@ More examples
|
|
|
62
62
|
Hello World
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
+
</details>
|
|
66
|
+
* <details><summary>Go 🐹</summary><br>
|
|
67
|
+
|
|
68
|
+
```sh
|
|
69
|
+
$ echo "HELLO=World" > .env && echo 'package main; import ("fmt"; "os"); func main() { fmt.Printf("Hello %s\n", os.Getenv("HELLO")) }' > main.go
|
|
70
|
+
|
|
71
|
+
$ dotenvx run -- go run main.go
|
|
72
|
+
Hello World
|
|
73
|
+
```
|
|
74
|
+
|
|
65
75
|
</details>
|
|
66
76
|
* <details><summary>Rust 🦀</summary><br>
|
|
67
77
|
|
|
@@ -169,7 +179,7 @@ More examples
|
|
|
169
179
|
> start
|
|
170
180
|
> ./node_modules/.bin/dotenvx run -- node index.js
|
|
171
181
|
|
|
172
|
-
[dotenvx][
|
|
182
|
+
[dotenvx][info] loading env (1) from .env
|
|
173
183
|
Hello World
|
|
174
184
|
```
|
|
175
185
|
|
|
@@ -192,9 +202,11 @@ More examples
|
|
|
192
202
|
|
|
193
203
|
> Create a `.env.production` file and use `--env-file` to load it. It's straightforward, yet flexible.
|
|
194
204
|
```sh
|
|
195
|
-
$ echo "HELLO=production" > .env.production
|
|
205
|
+
$ echo "HELLO=production" > .env.production
|
|
206
|
+
$ echo "console.log('Hello ' + process.env.HELLO)" > index.js
|
|
196
207
|
|
|
197
208
|
$ dotenvx run --env-file=.env.production -- node index.js
|
|
209
|
+
[dotenvx][info] loading env (1) from .env.production
|
|
198
210
|
Hello production
|
|
199
211
|
> ^^
|
|
200
212
|
```
|
|
@@ -209,6 +221,7 @@ More examples
|
|
|
209
221
|
$ echo "HELLO=World" > .env
|
|
210
222
|
|
|
211
223
|
$ dotenvx run --env-file=.env.local --env-file=.env -- node index.js
|
|
224
|
+
[dotenvx][info] loading env (1) from .env.local,.env
|
|
212
225
|
Hello local
|
|
213
226
|
```
|
|
214
227
|
|
|
@@ -222,6 +235,7 @@ More examples
|
|
|
222
235
|
$ echo "HELLO=World" > .env
|
|
223
236
|
|
|
224
237
|
$ dotenvx run --env-file=.env.local --env-file=.env --overload -- node index.js
|
|
238
|
+
[dotenvx][info] loading env (1) from .env.local,.env
|
|
225
239
|
Hello World
|
|
226
240
|
```
|
|
227
241
|
|
|
@@ -231,9 +245,9 @@ More examples
|
|
|
231
245
|
$ echo "HELLO=production" > .env.production
|
|
232
246
|
|
|
233
247
|
$ dotenvx run --env-file=.env.production --verbose -- node index.js
|
|
234
|
-
[dotenvx][
|
|
235
|
-
[dotenvx][
|
|
236
|
-
[dotenvx][
|
|
248
|
+
[dotenvx][verbose] injecting env from /path/to/.env.production
|
|
249
|
+
[dotenvx][verbose] HELLO set
|
|
250
|
+
[dotenvx][info] loading env (1) from .env.production
|
|
237
251
|
Hello production
|
|
238
252
|
```
|
|
239
253
|
|
|
@@ -243,16 +257,16 @@ More examples
|
|
|
243
257
|
$ echo "HELLO=production" > .env.production
|
|
244
258
|
|
|
245
259
|
$ dotenvx run --env-file=.env.production --debug -- node index.js
|
|
246
|
-
[dotenvx][
|
|
247
|
-
[dotenvx][
|
|
248
|
-
[dotenvx][
|
|
249
|
-
[dotenvx][
|
|
250
|
-
[dotenvx][
|
|
251
|
-
[dotenvx][
|
|
252
|
-
[dotenvx][
|
|
253
|
-
[dotenvx][
|
|
254
|
-
[dotenvx][
|
|
255
|
-
[dotenvx][
|
|
260
|
+
[dotenvx][debug] configuring options
|
|
261
|
+
[dotenvx][debug] {"envFile":[".env.production"]}
|
|
262
|
+
[dotenvx][verbose] injecting env from /path/to/.env.production
|
|
263
|
+
[dotenvx][debug] reading env from /path/to/.env.production
|
|
264
|
+
[dotenvx][debug] parsing env from /path/to/.env.production
|
|
265
|
+
[dotenvx][debug] {"HELLO":"production"}
|
|
266
|
+
[dotenvx][debug] writing env from /path/to/.env.production
|
|
267
|
+
[dotenvx][verbose] HELLO set
|
|
268
|
+
[dotenvx][debug] HELLO set to production
|
|
269
|
+
[dotenvx][info] loading env (1) from .env.production
|
|
256
270
|
Hello production
|
|
257
271
|
```
|
|
258
272
|
|
|
@@ -269,24 +283,8 @@ $ echo "HELLO=World" > .env && echo "console.log('Hello ' + process.env.HELLO)"
|
|
|
269
283
|
$ echo "HELLO=production" > .env.production
|
|
270
284
|
|
|
271
285
|
$ dotenvx encrypt
|
|
272
|
-
[dotenvx][
|
|
273
|
-
[dotenvx][
|
|
274
|
-
[dotenvx][INFO] try it out:
|
|
275
|
-
[dotenvx][INFO]
|
|
276
|
-
[dotenvx][INFO] DOTENV_KEY='<DOTENV_KEY_ENVIRONMENT>' dotenvx run -- node index.js
|
|
277
|
-
[dotenvx][INFO]
|
|
278
|
-
[dotenvx][INFO] next:
|
|
279
|
-
[dotenvx][INFO]
|
|
280
|
-
[dotenvx][INFO] 1. commit .env.vault safely to code
|
|
281
|
-
[dotenvx][INFO] 2. set DOTENV_KEY on server (or ci)
|
|
282
|
-
[dotenvx][INFO] 3. push your code
|
|
283
|
-
[dotenvx][INFO]
|
|
284
|
-
[dotenvx][INFO] tips:
|
|
285
|
-
[dotenvx][INFO]
|
|
286
|
-
[dotenvx][INFO] * .env.keys file holds your decryption DOTENV_KEYs
|
|
287
|
-
[dotenvx][INFO] * DO NOT commit .env.keys to code
|
|
288
|
-
[dotenvx][INFO] * share .env.keys file over secure channels only
|
|
289
|
-
> :-]
|
|
286
|
+
[dotenvx][info] encrypted to .env.vault (.env,.env.production)
|
|
287
|
+
[dotenvx][info] key added to .env.keys (DOTENV_KEY_PRODUCTION)
|
|
290
288
|
```
|
|
291
289
|
|
|
292
290
|
|
|
@@ -294,11 +292,10 @@ $ dotenvx encrypt
|
|
|
294
292
|
> Then load env from encrypted `.env.vault` file
|
|
295
293
|
|
|
296
294
|
```sh
|
|
297
|
-
$ DOTENV_KEY='
|
|
298
|
-
[dotenvx][
|
|
295
|
+
$ DOTENV_KEY='<dotenv_key_production>' dotenvx run -- node index.js
|
|
296
|
+
[dotenvx][info] loading env (1) from encrypted .env.vault
|
|
299
297
|
Hello production
|
|
300
|
-
|
|
301
|
-
> :-]
|
|
298
|
+
^ :-]
|
|
302
299
|
```
|
|
303
300
|
|
|
304
301
|
More examples
|
|
@@ -402,81 +399,10 @@ More examples
|
|
|
402
399
|
|
|
403
400
|
|
|
404
401
|
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
## Usage
|
|
408
|
-
|
|
409
|
-
### Guide
|
|
410
|
-
|
|
411
|
-
Begin by creating a simple 'hello world' program.
|
|
412
|
-
|
|
413
|
-
```js
|
|
414
|
-
// index.js
|
|
415
|
-
console.log(`Hello ${process.env.HELLO}`)
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
Run it.
|
|
419
|
-
|
|
420
|
-
```js
|
|
421
|
-
$ node index.js
|
|
422
|
-
Hello undefined
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
Run it with `dotenvx`.
|
|
426
|
-
|
|
427
|
-
```sh
|
|
428
|
-
$ dotenvx run -- node index.js
|
|
429
|
-
[dotenvx][WARN] ENOENT: no such file or directory, open '/../../.env'
|
|
430
|
-
Hello undefined
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
It warns you when there is no `.env` file (pass the `--quiet` flag to suppress these warnings).
|
|
402
|
+
## Guides
|
|
434
403
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
```ini
|
|
438
|
-
# env
|
|
439
|
-
JELLO="World"
|
|
440
|
-
```
|
|
441
|
-
|
|
442
|
-
Run it again.
|
|
443
|
-
|
|
444
|
-
```sh
|
|
445
|
-
$ dotenvx run -- node index.js
|
|
446
|
-
[dotenvx][INFO] injecting 0 environment variables from .env
|
|
447
|
-
Hello undefined
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
Hrm, still undefined. Pass the `--debug` flag to debug the issue. I'll give you a hint: 🍮
|
|
451
|
-
|
|
452
|
-
```sh
|
|
453
|
-
$ dotenvx run --debug -- node index.js
|
|
454
|
-
[dotenvx][VERBOSE] Loading env from /../../.env
|
|
455
|
-
[dotenvx][DEBUG] Reading env from /../../.env
|
|
456
|
-
[dotenvx][DEBUG] Parsing env from /../../.env
|
|
457
|
-
[dotenvx][DEBUG] {"JELLO":"World"}
|
|
458
|
-
|
|
459
|
-
# Oops, HELLO not JELLO ^^
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
Fix your `.env` file.
|
|
463
|
-
|
|
464
|
-
```ini
|
|
465
|
-
# .env
|
|
466
|
-
HELLO="World"
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
One last time. [Le tired](https://youtu.be/kCpjgl2baLs?t=45).
|
|
470
|
-
|
|
471
|
-
```sh
|
|
472
|
-
$ dotenvx run -- node index.js
|
|
473
|
-
[dotenvx][INFO] injecting 1 environment variable from .env
|
|
474
|
-
Hello World
|
|
475
|
-
```
|
|
476
|
-
|
|
477
|
-
🎉 It worked!
|
|
478
|
-
|
|
479
|
-
|
|
404
|
+
* [dotenvx/docs](https://dotenvx.com/docs)
|
|
405
|
+
* [quickstart guide](https://dotenvx.com/docs/quickstart)
|
|
480
406
|
|
|
481
407
|
## Contributing
|
|
482
408
|
|
package/package.json
CHANGED
package/src/cli/dotenvx.js
CHANGED
|
@@ -53,7 +53,7 @@ program
|
|
|
53
53
|
|
|
54
54
|
// dotenvx run -- node index.js
|
|
55
55
|
program.command('run')
|
|
56
|
-
.description('
|
|
56
|
+
.description('load env into your application process')
|
|
57
57
|
.option('-f, --env-file <paths...>', 'path(s) to your env file(s)', '.env')
|
|
58
58
|
.option('-o, --overload', 'override existing env variables')
|
|
59
59
|
.action(function () {
|
|
@@ -68,7 +68,7 @@ program.command('run')
|
|
|
68
68
|
if (!fs.existsSync(filepath)) {
|
|
69
69
|
logger.error(`you set DOTENV_KEY but your .env.vault file is missing: ${filepath}`)
|
|
70
70
|
} else {
|
|
71
|
-
logger.verbose(`
|
|
71
|
+
logger.verbose(`loading env from encrypted ${filepath}`)
|
|
72
72
|
|
|
73
73
|
try {
|
|
74
74
|
logger.debug(`reading encrypted env from ${filepath}`)
|
|
@@ -112,7 +112,7 @@ program.command('run')
|
|
|
112
112
|
logger.debug(`writing decrypted env from ${filepath}`)
|
|
113
113
|
const result = main.write(process.env, parsed, options.overload)
|
|
114
114
|
|
|
115
|
-
logger.info(`
|
|
115
|
+
logger.info(`loading env (${result.written.size}) from encrypted .env.vault`)
|
|
116
116
|
} catch (e) {
|
|
117
117
|
logger.error(e)
|
|
118
118
|
}
|
|
@@ -130,7 +130,7 @@ program.command('run')
|
|
|
130
130
|
for (const envFilepath of optionEnvFile) {
|
|
131
131
|
const filepath = helpers.resolvePath(envFilepath)
|
|
132
132
|
|
|
133
|
-
logger.verbose(`
|
|
133
|
+
logger.verbose(`loading env from ${filepath}`)
|
|
134
134
|
|
|
135
135
|
try {
|
|
136
136
|
logger.debug(`reading env from ${filepath}`)
|
|
@@ -150,7 +150,7 @@ program.command('run')
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
if (readableFilepaths.size > 0) {
|
|
153
|
-
logger.info(`
|
|
153
|
+
logger.info(`loading env (${written.size}) from ${[...readableFilepaths]}`)
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
|
|
@@ -180,6 +180,8 @@ program.command('encrypt')
|
|
|
180
180
|
optionEnvFile = [optionEnvFile]
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
+
const addedKeys = new Set()
|
|
184
|
+
|
|
183
185
|
try {
|
|
184
186
|
logger.verbose(`generating .env.keys from ${optionEnvFile}`)
|
|
185
187
|
|
|
@@ -203,6 +205,8 @@ program.command('encrypt')
|
|
|
203
205
|
logger.debug(`generating ${key} as ${value}`)
|
|
204
206
|
|
|
205
207
|
dotenvKeys[key] = value
|
|
208
|
+
|
|
209
|
+
addedKeys.add(key) // for info logging to user
|
|
206
210
|
} else {
|
|
207
211
|
logger.verbose(`existing ${key}`)
|
|
208
212
|
logger.debug(`existing ${key} as ${value}`)
|
|
@@ -269,23 +273,26 @@ program.command('encrypt')
|
|
|
269
273
|
process.exit(1)
|
|
270
274
|
}
|
|
271
275
|
|
|
272
|
-
logger.info(`encrypted
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
logger.
|
|
277
|
-
logger.
|
|
278
|
-
logger.
|
|
279
|
-
logger.
|
|
280
|
-
logger.
|
|
281
|
-
logger.
|
|
282
|
-
logger.
|
|
283
|
-
logger.
|
|
284
|
-
logger.
|
|
285
|
-
logger.
|
|
286
|
-
logger.
|
|
287
|
-
logger.
|
|
288
|
-
logger.
|
|
276
|
+
logger.info(`encrypted to .env.vault (${optionEnvFile})`)
|
|
277
|
+
if (addedKeys.size > 0) {
|
|
278
|
+
logger.info(`${helpers.pluralize('key', addedKeys.size)} added to .env.keys (${[...addedKeys]})`)
|
|
279
|
+
}
|
|
280
|
+
logger.verbose('')
|
|
281
|
+
logger.verbose('try it out:')
|
|
282
|
+
logger.verbose('')
|
|
283
|
+
logger.verbose(' DOTENV_KEY=\'<DOTENV_KEY_ENVIRONMENT>\' dotenvx run -- node index.js')
|
|
284
|
+
logger.verbose('')
|
|
285
|
+
logger.verbose('next:')
|
|
286
|
+
logger.verbose('')
|
|
287
|
+
logger.verbose(' 1. commit .env.vault safely to code')
|
|
288
|
+
logger.verbose(' 2. set DOTENV_KEY on server (or ci)')
|
|
289
|
+
logger.verbose(' 3. push your code')
|
|
290
|
+
logger.verbose('')
|
|
291
|
+
logger.verbose('tips:')
|
|
292
|
+
logger.verbose('')
|
|
293
|
+
logger.verbose(' * .env.keys file holds your decryption DOTENV_KEYs')
|
|
294
|
+
logger.verbose(' * DO NOT commit .env.keys to code')
|
|
295
|
+
logger.verbose(' * share .env.keys file over secure channels only')
|
|
289
296
|
})
|
|
290
297
|
|
|
291
298
|
program.parse(process.argv)
|
package/src/shared/logger.js
CHANGED
|
@@ -10,7 +10,7 @@ const packageJson = require('./packageJson')
|
|
|
10
10
|
const dotenvxFormat = printf(({ level, message, label, timestamp }) => {
|
|
11
11
|
const formattedMessage = typeof message === 'object' ? JSON.stringify(message) : message
|
|
12
12
|
|
|
13
|
-
return `[dotenvx@${packageJson.version}][${level.
|
|
13
|
+
return `[dotenvx@${packageJson.version}][${level.toLowerCase()}] ${formattedMessage}`
|
|
14
14
|
})
|
|
15
15
|
|
|
16
16
|
const logger = createLogger({
|