@dotenvx/dotenvx 1.69.1 → 1.69.2
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/CHANGELOG.md +7 -1
- package/README.md +7 -7
- package/package.json +1 -1
- package/src/cli/actions/decrypt.js +3 -1
- package/src/cli/actions/encrypt.js +4 -10
- package/src/cli/actions/rotate.js +1 -7
- package/src/cli/actions/run.js +4 -4
- package/src/cli/actions/set.js +2 -6
- package/src/cli/dotenvx.js +11 -10
- package/src/lib/helpers/cryptography/mutateKeysSrc.js +1 -1
- package/src/lib/helpers/cryptography/mutateKeysSrcSync.js +1 -1
- package/src/lib/helpers/executeDynamic.js +28 -19
- package/src/lib/helpers/keyResolution/keyValues.js +8 -1
- package/src/lib/helpers/keyResolution/keyValuesFromEnvSrc.js +8 -1
- package/src/lib/helpers/keyResolution/keyValuesSync.js +8 -1
- package/src/lib/main.js +1 -5
- package/src/lib/services/decrypt.js +3 -1
- package/src/lib/services/run.js +16 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
-
[Unreleased](https://github.com/dotenvx/dotenvx/compare/v1.69.
|
|
5
|
+
[Unreleased](https://github.com/dotenvx/dotenvx/compare/v1.69.2...main)
|
|
6
|
+
|
|
7
|
+
## [1.69.2](https://github.com/dotenvx/dotenvx/compare/v1.69.1...v1.69.2) (2026-05-29)
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
* Minor messaging improvements, especially if using armored keys ([#825](https://github.com/dotenvx/dotenvx/pull/825))
|
|
6
12
|
|
|
7
13
|
## [1.69.1](https://github.com/dotenvx/dotenvx/compare/v1.69.0...v1.69.1) (2026-05-25)
|
|
8
14
|
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[](https://dotenvx.com)
|
|
1
|
+
[](https://dotenvx.com)
|
|
2
2
|
|
|
3
3
|
*a secure dotenv*–from the creator of [`dotenv`](https://github.com/motdotla/dotenv).
|
|
4
4
|
|
|
@@ -1289,7 +1289,7 @@ $ dotenvx run -fk .env.keys -f apps/app1/.env -- yourcommand
|
|
|
1289
1289
|
</details>
|
|
1290
1290
|
<details><summary>`run --no-vlt`</summary><br>
|
|
1291
1291
|
|
|
1292
|
-
Turn off [Dotenvx
|
|
1292
|
+
Turn off [Dotenvx VLT ⛨](https://dotenvx.com/vlt) features.
|
|
1293
1293
|
|
|
1294
1294
|
```sh
|
|
1295
1295
|
$ dotenvx run --no-vlt -- yourcommand
|
|
@@ -1624,7 +1624,7 @@ $ dotenvx encrypt -f .env.production
|
|
|
1624
1624
|
</details>
|
|
1625
1625
|
<details><summary>`encrypt --no-vlt`</summary><br>
|
|
1626
1626
|
|
|
1627
|
-
Turn off [Dotenvx
|
|
1627
|
+
Turn off [Dotenvx VLT ⛨](https://dotenvx.com/vlt) features for encrypt.
|
|
1628
1628
|
|
|
1629
1629
|
```sh
|
|
1630
1630
|
$ dotenvx encrypt --no-vlt
|
|
@@ -2550,7 +2550,7 @@ $ dotenvx run --convention=nextjs -- node index.js
|
|
|
2550
2550
|
</details>
|
|
2551
2551
|
<details><summary>`config(noVlt:)` - noVlt</summary><br>
|
|
2552
2552
|
|
|
2553
|
-
Turn off [Dotenvx
|
|
2553
|
+
Turn off [Dotenvx VLT ⛨](https://dotenvx.com/vlt) features.
|
|
2554
2554
|
|
|
2555
2555
|
```js
|
|
2556
2556
|
// index.js
|
|
@@ -2650,14 +2650,14 @@ This is known as *Decryption at Access* and is written about in [the whitepaper]
|
|
|
2650
2650
|
|
|
2651
2651
|
|
|
2652
2652
|
|
|
2653
|
-
##
|
|
2653
|
+
## VLT ⛨
|
|
2654
2654
|
|
|
2655
|
-
[](https://dotenvx.com/vlt)
|
|
2655
|
+
[](https://dotenvx.com/vlt)
|
|
2656
2656
|
|
|
2657
2657
|
```
|
|
2658
2658
|
⛨ ARMORED KEYS: Harden your private keys.
|
|
2659
2659
|
⮕ install [curl -sfS https://dotenvx.sh/vlt | sh]
|
|
2660
|
-
⮕ then run [dotenvx
|
|
2660
|
+
⮕ then run [dotenvx vlt login]
|
|
2661
2661
|
```
|
|
2662
2662
|
|
|
2663
2663
|
[Learn more](https://dotenvx.com/vlt)
|
package/package.json
CHANGED
|
@@ -63,8 +63,10 @@ async function decrypt () {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
if (spinner) spinner.stop()
|
|
66
|
+
const armoredPrivateKeyUsed = processedEnvs.some((processedEnv) => processedEnv.armoredPrivateKeyUsed)
|
|
67
|
+
const keyUsedSuffix = armoredPrivateKeyUsed ? ' · armored ⛨' : ''
|
|
66
68
|
if (changedFilepaths.length > 0) {
|
|
67
|
-
logger.success(`◇ decrypted (${changedFilepaths.join(',')})`)
|
|
69
|
+
logger.success(`◇ decrypted (${changedFilepaths.join(',')})${keyUsedSuffix}`)
|
|
68
70
|
} else if (unchangedFilepaths.length > 0) {
|
|
69
71
|
logger.info(`○ no change (${unchangedFilepaths})`)
|
|
70
72
|
} else {
|
|
@@ -4,7 +4,6 @@ const { logger } = require('./../../shared/logger')
|
|
|
4
4
|
const Encrypt = require('./../../lib/services/encrypt')
|
|
5
5
|
|
|
6
6
|
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
|
7
|
-
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
|
8
7
|
const createSpinner = require('../../lib/helpers/createSpinner')
|
|
9
8
|
const prompts = require('../../lib/helpers/prompts')
|
|
10
9
|
const Session = require('../../db/session')
|
|
@@ -37,10 +36,10 @@ function keyStorageSelector (spinner) {
|
|
|
37
36
|
|
|
38
37
|
if (spinner) spinner.stop()
|
|
39
38
|
selected = await prompts.select({
|
|
40
|
-
message: '
|
|
39
|
+
message: 'Choose private key storage',
|
|
41
40
|
choices: [
|
|
42
|
-
{ name: '
|
|
43
|
-
{ name: '
|
|
41
|
+
{ name: '◫ File (.env.keys)', value: 'file' },
|
|
42
|
+
{ name: '⛨ Armor (vlt.dotenvx.com)', value: 'armored' }
|
|
44
43
|
]
|
|
45
44
|
}, {
|
|
46
45
|
input: process.stdin,
|
|
@@ -108,15 +107,10 @@ async function encrypt () {
|
|
|
108
107
|
|
|
109
108
|
if (spinner) spinner.stop()
|
|
110
109
|
if (changedFilepaths.length > 0) {
|
|
111
|
-
const localKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.localPrivateKeyAdded)
|
|
112
110
|
const remoteKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.remotePrivateKeyAdded)
|
|
113
111
|
let msg = `◈ encrypted (${changedFilepaths.join(',')})`
|
|
114
|
-
if (localKeyAddedEnv) {
|
|
115
|
-
const envKeysFilepath = localDisplayPath(localKeyAddedEnv.envKeysFilepath)
|
|
116
|
-
msg += ` + local key (${envKeysFilepath})`
|
|
117
|
-
}
|
|
118
112
|
if (remoteKeyAddedEnv) {
|
|
119
|
-
msg += '
|
|
113
|
+
msg += ' · armored ⛨'
|
|
120
114
|
}
|
|
121
115
|
logger.success(msg)
|
|
122
116
|
} else if (unchangedFilepaths.length > 0) {
|
|
@@ -5,7 +5,6 @@ const Rotate = require('./../../lib/services/rotate')
|
|
|
5
5
|
|
|
6
6
|
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
|
7
7
|
const createSpinner = require('../../lib/helpers/createSpinner')
|
|
8
|
-
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
|
9
8
|
const Session = require('../../db/session')
|
|
10
9
|
const normalizeVltOptions = require('./normalizeVltOptions')
|
|
11
10
|
|
|
@@ -59,16 +58,11 @@ async function rotate () {
|
|
|
59
58
|
|
|
60
59
|
if (spinner) spinner.stop()
|
|
61
60
|
if (changedFilepaths.length > 0) {
|
|
62
|
-
const localKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.localPrivateKeyAdded)
|
|
63
61
|
const remoteKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.remotePrivateKeyAdded)
|
|
64
62
|
|
|
65
63
|
let msg = `⟳ rotated (${changedFilepaths.join(',')})`
|
|
66
|
-
if (localKeyAddedEnv) {
|
|
67
|
-
const envKeysFilepath = localDisplayPath(localKeyAddedEnv.envKeysFilepath)
|
|
68
|
-
msg += ` + local key (${envKeysFilepath})`
|
|
69
|
-
}
|
|
70
64
|
if (remoteKeyAddedEnv) {
|
|
71
|
-
msg += '
|
|
65
|
+
msg += ' · armored ⛨'
|
|
72
66
|
}
|
|
73
67
|
logger.success(msg)
|
|
74
68
|
} else if (unchangedFilepaths.length > 0) {
|
package/src/cli/actions/run.js
CHANGED
|
@@ -56,9 +56,6 @@ async function run () {
|
|
|
56
56
|
uniqueInjectedKeys
|
|
57
57
|
} = await new Run(envs, options.overload, process.env, options.envKeysFile, noVlt, {
|
|
58
58
|
keypairHooks: {
|
|
59
|
-
before: () => {
|
|
60
|
-
if (spinner) spinner.start('retrieving')
|
|
61
|
-
},
|
|
62
59
|
after: () => {
|
|
63
60
|
if (spinner) spinner.start('injecting')
|
|
64
61
|
}
|
|
@@ -114,8 +111,11 @@ async function run () {
|
|
|
114
111
|
msg += ` from --env flag${readableStrings.length > 1 ? 's' : ''}`
|
|
115
112
|
}
|
|
116
113
|
|
|
114
|
+
const armoredPrivateKeyUsed = processedEnvs.some((processedEnv) => processedEnv.armoredPrivateKeyUsed)
|
|
115
|
+
const keyUsedSuffix = armoredPrivateKeyUsed ? ' · armored ⛨' : ''
|
|
116
|
+
|
|
117
117
|
if (spinner) spinner.stop()
|
|
118
|
-
logger.
|
|
118
|
+
logger.success(`⟐ ${msg}${keyUsedSuffix}`)
|
|
119
119
|
} catch (error) {
|
|
120
120
|
if (spinner) spinner.stop()
|
|
121
121
|
catchAndLog(error)
|
package/src/cli/actions/set.js
CHANGED
|
@@ -3,7 +3,6 @@ const { logger } = require('./../../shared/logger')
|
|
|
3
3
|
|
|
4
4
|
const catchAndLog = require('../../lib/helpers/catchAndLog')
|
|
5
5
|
const createSpinner = require('../../lib/helpers/createSpinner')
|
|
6
|
-
const localDisplayPath = require('../../lib/helpers/localDisplayPath')
|
|
7
6
|
const Session = require('../../db/session')
|
|
8
7
|
const Sets = require('./../../lib/services/sets')
|
|
9
8
|
const normalizeVltOptions = require('./normalizeVltOptions')
|
|
@@ -59,11 +58,8 @@ async function set (key, value) {
|
|
|
59
58
|
const localKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.localPrivateKeyAdded)
|
|
60
59
|
const remoteKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.remotePrivateKeyAdded)
|
|
61
60
|
let keyAddedSuffix = ''
|
|
62
|
-
if (localKeyAddedEnv) {
|
|
63
|
-
keyAddedSuffix = ` + local key (${localDisplayPath(localKeyAddedEnv.envKeysFilepath)})`
|
|
64
|
-
}
|
|
65
61
|
if (remoteKeyAddedEnv) {
|
|
66
|
-
keyAddedSuffix = '
|
|
62
|
+
keyAddedSuffix = ' · armored ⛨'
|
|
67
63
|
}
|
|
68
64
|
|
|
69
65
|
if (spinner) spinner.stop()
|
|
@@ -73,7 +69,7 @@ async function set (key, value) {
|
|
|
73
69
|
} else {
|
|
74
70
|
logger.success(`◇ set ${key} (${changedFilepaths.join(',')})`)
|
|
75
71
|
}
|
|
76
|
-
} else if (encrypt && localKeyAddedEnv) {
|
|
72
|
+
} else if (encrypt && localKeyAddedEnv) {
|
|
77
73
|
const localKeyAddedEnvFilepath = localKeyAddedEnv.envFilepath || changedFilepaths[0] || '.env'
|
|
78
74
|
logger.success(`◈ encrypted ${key} (${localKeyAddedEnvFilepath})${keyAddedSuffix}`)
|
|
79
75
|
} else if (unchangedFilepaths.length > 0) {
|
package/src/cli/dotenvx.js
CHANGED
|
@@ -202,12 +202,12 @@ program.command('doctor', { hidden: true })
|
|
|
202
202
|
})
|
|
203
203
|
|
|
204
204
|
// dotenvx login
|
|
205
|
-
program.command('login')
|
|
206
|
-
.description('
|
|
205
|
+
program.command('login', { hidden: true })
|
|
206
|
+
.description('')
|
|
207
207
|
.allowUnknownOption()
|
|
208
208
|
.action(() => {
|
|
209
|
-
const rawArgs = ['
|
|
210
|
-
executeDynamic(program, '
|
|
209
|
+
const rawArgs = ['vlt', 'login', ...process.argv.slice(3)]
|
|
210
|
+
executeDynamic(program, 'vlt', rawArgs)
|
|
211
211
|
})
|
|
212
212
|
|
|
213
213
|
// dotenvx logout
|
|
@@ -215,8 +215,8 @@ program.command('logout', { hidden: true })
|
|
|
215
215
|
.description('log out of your dotenvx account')
|
|
216
216
|
.allowUnknownOption()
|
|
217
217
|
.action(() => {
|
|
218
|
-
const rawArgs = ['
|
|
219
|
-
executeDynamic(program, '
|
|
218
|
+
const rawArgs = ['vlt', 'logout', ...process.argv.slice(3)]
|
|
219
|
+
executeDynamic(program, 'vlt', rawArgs)
|
|
220
220
|
})
|
|
221
221
|
|
|
222
222
|
// dotenvx armor
|
|
@@ -224,8 +224,8 @@ program.command('armor', { hidden: true })
|
|
|
224
224
|
.description('ARMORED KEYS ⛨')
|
|
225
225
|
.allowUnknownOption()
|
|
226
226
|
.action((args) => {
|
|
227
|
-
const rawArgs = ['
|
|
228
|
-
executeDynamic(program, '
|
|
227
|
+
const rawArgs = ['vlt', 'armor', ...process.argv.slice(3)]
|
|
228
|
+
executeDynamic(program, 'vlt', rawArgs)
|
|
229
229
|
})
|
|
230
230
|
|
|
231
231
|
// dotenvx help
|
|
@@ -247,8 +247,9 @@ program.command('help [command]')
|
|
|
247
247
|
// dotenvx vlt ops
|
|
248
248
|
program.addHelpText('after', ' ')
|
|
249
249
|
program.addHelpText('after', 'Advanced: ')
|
|
250
|
-
program.addHelpText('after', '
|
|
251
|
-
program.addHelpText('after', '
|
|
250
|
+
program.addHelpText('after', ' login')
|
|
251
|
+
program.addHelpText('after', ' vlt ⛨ ARMORED KEYS [www.dotenvx.com/vlt]')
|
|
252
|
+
program.addHelpText('after', ' ext ⊕ extensions')
|
|
252
253
|
|
|
253
254
|
// dotenvx ext
|
|
254
255
|
program.addCommand(require('./commands/ext'))
|
|
@@ -2,7 +2,7 @@ const FIRST_TIME_KEYS_SRC = [
|
|
|
2
2
|
'#/------------------!DOTENV_PRIVATE_KEYS!-------------------/',
|
|
3
3
|
'#/ private decryption keys. DO NOT commit to source control /',
|
|
4
4
|
'#/ [how it works](https://dotenvx.com/encryption) /',
|
|
5
|
-
'#/
|
|
5
|
+
'#/ ⛨ ARMORED KEYS: `dotenvx armor up` /',
|
|
6
6
|
'#/----------------------------------------------------------/'
|
|
7
7
|
].join('\n')
|
|
8
8
|
|
|
@@ -2,7 +2,7 @@ const FIRST_TIME_KEYS_SRC = [
|
|
|
2
2
|
'#/------------------!DOTENV_PRIVATE_KEYS!-------------------/',
|
|
3
3
|
'#/ private decryption keys. DO NOT commit to source control /',
|
|
4
4
|
'#/ [how it works](https://dotenvx.com/encryption) /',
|
|
5
|
-
'#/
|
|
5
|
+
'#/ ⛨ ARMORED KEYS: `dotenvx armor up` /',
|
|
6
6
|
'#/----------------------------------------------------------/'
|
|
7
7
|
].join('\n')
|
|
8
8
|
|
|
@@ -2,23 +2,28 @@ const path = require('path')
|
|
|
2
2
|
const childProcess = require('child_process')
|
|
3
3
|
const { logger } = require('../../shared/logger')
|
|
4
4
|
|
|
5
|
-
function
|
|
6
|
-
return 'curl -sfS https://dotenvx.sh/vlt | sh'
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
function vltBanner (installCommand) {
|
|
5
|
+
function vltBanner () {
|
|
10
6
|
const lines = [
|
|
7
|
+
' [www.dotenvx.com/vlt]',
|
|
8
|
+
'–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––',
|
|
9
|
+
'',
|
|
10
|
+
' Dotenvx + VLT ⛨',
|
|
11
|
+
'',
|
|
12
|
+
' ARMORED KEYS',
|
|
13
|
+
' Private keys. Off device. Under guard.',
|
|
11
14
|
'',
|
|
12
|
-
'
|
|
13
|
-
' ██║ ██║██║ ╚══██╔══╝',
|
|
14
|
-
' ██║ ██║██║ ██║ ',
|
|
15
|
-
' ╚██╗ ██╔╝██║ ██║ [www.dotenvx.com/vlt]',
|
|
16
|
-
' ╚████╔╝ ███████╗██║ ',
|
|
17
|
-
' ╚═══╝ ╚══════╝╚═╝ ',
|
|
15
|
+
' -',
|
|
18
16
|
'',
|
|
19
|
-
'
|
|
20
|
-
|
|
21
|
-
'
|
|
17
|
+
' Install one',
|
|
18
|
+
' [curl -sfS https://dotenvx.sh/vlt | sh]',
|
|
19
|
+
' [npm i @dotenvx/dotenvx --save]',
|
|
20
|
+
'',
|
|
21
|
+
' -',
|
|
22
|
+
'',
|
|
23
|
+
' Then',
|
|
24
|
+
' [dotenvx armor up]',
|
|
25
|
+
' (sign in when prompted)',
|
|
26
|
+
''
|
|
22
27
|
]
|
|
23
28
|
|
|
24
29
|
const innerWidth = Math.max(67, ...lines.map((line) => line.length))
|
|
@@ -47,14 +52,18 @@ function executeDynamic (program, command, rawArgs) {
|
|
|
47
52
|
const newPath = `${binPath}:${process.env.PATH}`
|
|
48
53
|
const env = { ...process.env, PATH: newPath }
|
|
49
54
|
|
|
50
|
-
|
|
55
|
+
let spawnCommand = `dotenvx-${command}`
|
|
56
|
+
let result = childProcess.spawnSync(spawnCommand, forwardedArgs, { stdio: 'inherit', env })
|
|
57
|
+
if (command === 'ops' && result.error) {
|
|
58
|
+
spawnCommand = 'dotenvx-vlt'
|
|
59
|
+
result = childProcess.spawnSync(spawnCommand, forwardedArgs, { stdio: 'inherit', env })
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
if (result.error) {
|
|
52
63
|
if (command === 'vlt') {
|
|
53
|
-
|
|
54
|
-
console.log(vltBanner(installCommand))
|
|
64
|
+
console.log(vltBanner())
|
|
55
65
|
} else if (command === 'ops') {
|
|
56
|
-
|
|
57
|
-
console.log(vltBanner(installCommand))
|
|
66
|
+
console.log(vltBanner())
|
|
58
67
|
} else {
|
|
59
68
|
logger.info(`error: unknown command '${command}'`)
|
|
60
69
|
}
|
|
@@ -41,6 +41,7 @@ async function keyValues (filepath, opts = {}) {
|
|
|
41
41
|
|
|
42
42
|
let publicKey = null
|
|
43
43
|
let privateKey = null
|
|
44
|
+
let privateKeySource = null
|
|
44
45
|
|
|
45
46
|
// public key: process.env first, then .env*
|
|
46
47
|
publicKey = readProcessKey(publicKeyName)
|
|
@@ -74,12 +75,18 @@ async function keyValues (filepath, opts = {}) {
|
|
|
74
75
|
if (!noVlt && !privateKey && publicKey && publicKey.length > 0) {
|
|
75
76
|
const kp = await vltKeypair(publicKey, { envFilepath: filepath, hooks: opts.keypairHooks })
|
|
76
77
|
privateKey = kp.privateKey
|
|
78
|
+
privateKeySource = 'vlt'
|
|
77
79
|
}
|
|
78
80
|
|
|
79
|
-
|
|
81
|
+
const result = {
|
|
80
82
|
publicKeyValue: publicKey || null, // important to make sure name is rendered
|
|
81
83
|
privateKeyValue: privateKey || null // important to make sure name is rendered
|
|
82
84
|
}
|
|
85
|
+
if (privateKeySource) {
|
|
86
|
+
result.privateKeySource = privateKeySource
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return result
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
module.exports = keyValues
|
|
@@ -37,6 +37,7 @@ function keyValuesFromEnvSrc (src, privateKeyName = null, opts = {}) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
let privateKeyValue = null
|
|
40
|
+
let privateKeySource = null
|
|
40
41
|
if (privateKeyName) {
|
|
41
42
|
privateKeyValue = readProcessKey(processEnv, privateKeyName)
|
|
42
43
|
|
|
@@ -54,13 +55,19 @@ function keyValuesFromEnvSrc (src, privateKeyName = null, opts = {}) {
|
|
|
54
55
|
if (!noVlt && !privateKeyValue && publicKeyValue && publicKeyValue.length > 0) {
|
|
55
56
|
const kp = vltKeypairSync(publicKeyValue)
|
|
56
57
|
privateKeyValue = kp.privateKey
|
|
58
|
+
privateKeySource = 'vlt'
|
|
57
59
|
}
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
const result = {
|
|
60
62
|
publicKeyValue: publicKeyValue || null,
|
|
61
63
|
privateKeyValue: privateKeyValue || null,
|
|
62
64
|
privateKeyName: privateKeyName || null
|
|
63
65
|
}
|
|
66
|
+
if (privateKeySource) {
|
|
67
|
+
result.privateKeySource = privateKeySource
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result
|
|
64
71
|
}
|
|
65
72
|
|
|
66
73
|
module.exports = keyValuesFromEnvSrc
|
|
@@ -41,6 +41,7 @@ function keyValuesSync (filepath, opts = {}) {
|
|
|
41
41
|
|
|
42
42
|
let publicKey = null
|
|
43
43
|
let privateKey = null
|
|
44
|
+
let privateKeySource = null
|
|
44
45
|
|
|
45
46
|
// public key: process.env first, then .env*
|
|
46
47
|
publicKey = readProcessKey(publicKeyName)
|
|
@@ -79,12 +80,18 @@ function keyValuesSync (filepath, opts = {}) {
|
|
|
79
80
|
|
|
80
81
|
const kp = vltKeypairSync(publicKey, vltOptions)
|
|
81
82
|
privateKey = kp.privateKey
|
|
83
|
+
privateKeySource = 'vlt'
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
|
|
86
|
+
const result = {
|
|
85
87
|
publicKeyValue: publicKey || null, // important to make sure name is rendered
|
|
86
88
|
privateKeyValue: privateKey || null // important to make sure name is rendered
|
|
87
89
|
}
|
|
90
|
+
if (privateKeySource) {
|
|
91
|
+
result.privateKeySource = privateKeySource
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return result
|
|
88
95
|
}
|
|
89
96
|
|
|
90
97
|
module.exports = keyValuesSync
|
package/src/lib/main.js
CHANGED
|
@@ -20,7 +20,6 @@ const buildEnvs = require('./helpers/buildEnvs')
|
|
|
20
20
|
const { determine } = require('./helpers/envResolution')
|
|
21
21
|
const Parse = require('./helpers/parse')
|
|
22
22
|
const fsx = require('./helpers/fsx')
|
|
23
|
-
const localDisplayPath = require('./helpers/localDisplayPath')
|
|
24
23
|
|
|
25
24
|
/** @type {import('./main').config} */
|
|
26
25
|
const config = function (options = {}) {
|
|
@@ -213,11 +212,8 @@ const set = function (key, value, options = {}) {
|
|
|
213
212
|
const localKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.localPrivateKeyAdded)
|
|
214
213
|
const remoteKeyAddedEnv = processedEnvs.find((processedEnv) => processedEnv.remotePrivateKeyAdded)
|
|
215
214
|
|
|
216
|
-
if (localKeyAddedEnv) {
|
|
217
|
-
keyAddedSuffix = ` + local key (${localDisplayPath(localKeyAddedEnv.envKeysFilepath)})`
|
|
218
|
-
}
|
|
219
215
|
if (remoteKeyAddedEnv) {
|
|
220
|
-
keyAddedSuffix = '
|
|
216
|
+
keyAddedSuffix = ' · armored ⛨'
|
|
221
217
|
}
|
|
222
218
|
|
|
223
219
|
if (changedFilepaths.length > 0) {
|
|
@@ -77,9 +77,11 @@ class Decrypt {
|
|
|
77
77
|
const envParsed = dotenvParse(envSrc, false, false, true)
|
|
78
78
|
|
|
79
79
|
const { privateKeyName } = keyNames(envFilepath)
|
|
80
|
-
const { privateKeyValue } = await keyValues(envFilepath, { keysFilepath: this.envKeysFilepath, noVlt: this.noVlt })
|
|
80
|
+
const { privateKeyValue, privateKeySource } = await keyValues(envFilepath, { keysFilepath: this.envKeysFilepath, noVlt: this.noVlt })
|
|
81
81
|
|
|
82
82
|
row.privateKey = privateKeyValue
|
|
83
|
+
row.privateKeySource = privateKeySource
|
|
84
|
+
row.armoredPrivateKeyUsed = privateKeySource === 'vlt'
|
|
83
85
|
row.privateKeyName = privateKeyName
|
|
84
86
|
row.changed = false // track possible changes
|
|
85
87
|
|
package/src/lib/services/run.js
CHANGED
|
@@ -93,7 +93,8 @@ class Run {
|
|
|
93
93
|
try {
|
|
94
94
|
const {
|
|
95
95
|
privateKeyName: resolvedPrivateKeyName,
|
|
96
|
-
privateKeyValue
|
|
96
|
+
privateKeyValue,
|
|
97
|
+
privateKeySource
|
|
97
98
|
} = keyValuesFromEnvSrc(env, privateKeyName, { keysFilepath: this.envKeysFilepath, noVlt: this.noVlt, processEnv: this.processEnv })
|
|
98
99
|
|
|
99
100
|
const {
|
|
@@ -105,6 +106,10 @@ class Run {
|
|
|
105
106
|
|
|
106
107
|
row.privateKeyName = resolvedPrivateKeyName
|
|
107
108
|
row.privateKey = privateKeyValue
|
|
109
|
+
if (privateKeySource) {
|
|
110
|
+
row.privateKeySource = privateKeySource
|
|
111
|
+
row.armoredPrivateKeyUsed = privateKeySource === 'vlt'
|
|
112
|
+
}
|
|
108
113
|
row.parsed = parsed
|
|
109
114
|
row.errors = errors
|
|
110
115
|
row.injected = injected
|
|
@@ -136,7 +141,7 @@ class Run {
|
|
|
136
141
|
this.readableFilepaths.add(envFilepath)
|
|
137
142
|
|
|
138
143
|
const { privateKeyName } = keyNames(filepath)
|
|
139
|
-
const { privateKeyValue } = keyValuesSync(filepath, {
|
|
144
|
+
const { privateKeyValue, privateKeySource } = keyValuesSync(filepath, {
|
|
140
145
|
keysFilepath: this.envKeysFilepath,
|
|
141
146
|
noVlt: this.noVlt,
|
|
142
147
|
noSpinner: this.noSpinner
|
|
@@ -151,6 +156,10 @@ class Run {
|
|
|
151
156
|
|
|
152
157
|
row.privateKeyName = privateKeyName
|
|
153
158
|
row.privateKey = privateKeyValue
|
|
159
|
+
if (privateKeySource) {
|
|
160
|
+
row.privateKeySource = privateKeySource
|
|
161
|
+
row.armoredPrivateKeyUsed = privateKeySource === 'vlt'
|
|
162
|
+
}
|
|
154
163
|
row.src = src
|
|
155
164
|
row.parsed = parsed
|
|
156
165
|
row.errors = errors
|
|
@@ -185,7 +194,7 @@ class Run {
|
|
|
185
194
|
this.readableFilepaths.add(envFilepath)
|
|
186
195
|
|
|
187
196
|
const { privateKeyName } = keyNames(filepath)
|
|
188
|
-
const { privateKeyValue } = await keyValues(filepath, {
|
|
197
|
+
const { privateKeyValue, privateKeySource } = await keyValues(filepath, {
|
|
189
198
|
keysFilepath: this.envKeysFilepath,
|
|
190
199
|
noVlt: this.noVlt,
|
|
191
200
|
keypairHooks: this.keypairHooks
|
|
@@ -200,6 +209,10 @@ class Run {
|
|
|
200
209
|
|
|
201
210
|
row.privateKeyName = privateKeyName
|
|
202
211
|
row.privateKey = privateKeyValue
|
|
212
|
+
if (privateKeySource) {
|
|
213
|
+
row.privateKeySource = privateKeySource
|
|
214
|
+
row.armoredPrivateKeyUsed = privateKeySource === 'vlt'
|
|
215
|
+
}
|
|
203
216
|
row.src = src
|
|
204
217
|
row.parsed = parsed
|
|
205
218
|
row.errors = errors
|