@dotenvx/dotenvx 1.31.2 → 1.32.0
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 +21 -1
- package/package.json +1 -1
- package/src/cli/actions/ext/prebuild.js +19 -51
- package/src/cli/actions/ext/precommit.js +3 -3
- package/src/cli/actions/ext/scan.js +1 -1
- package/src/lib/main.d.ts +0 -8
- package/src/lib/services/prebuild.js +81 -0
- package/src/lib/services/precommit.js +16 -9
- package/src/shared/logger.js +0 -33
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,27 @@
|
|
|
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.
|
|
5
|
+
[Unreleased](https://github.com/dotenvx/dotenvx/compare/v1.32.0...main)
|
|
6
|
+
|
|
7
|
+
## [1.32.0](https://github.com/dotenvx/dotenvx/compare/v1.31.3...v1.32.0)
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
* add encrypted check support for `ext prebuild` ([#501](https://github.com/dotenvx/dotenvx/pull/501))
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
* modify `ext precommit` to check git modified state as well as git staged state - useful for using `dotenvx ext precommit` without the `--install` flag in automated scripts and ci. ([#499](https://github.com/dotenvx/dotenvx/pull/499))
|
|
16
|
+
|
|
17
|
+
### Removed
|
|
18
|
+
|
|
19
|
+
* remove internal logger methods `errorvp, errorvpb, warnv, warnvp, warnvpb, successvp, successvpb, help2` ([#501](https://github.com/dotenvx/dotenvx/pull/501))
|
|
20
|
+
|
|
21
|
+
## [1.31.3](https://github.com/dotenvx/dotenvx/compare/v1.31.2...v1.31.3)
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
* adjust wingetcreate to use powershell when parsing version
|
|
6
26
|
|
|
7
27
|
## [1.31.2](https://github.com/dotenvx/dotenvx/compare/v1.31.1...v1.31.2)
|
|
8
28
|
|
package/package.json
CHANGED
|
@@ -1,64 +1,32 @@
|
|
|
1
|
-
const fsx = require('./../../../lib/helpers/fsx')
|
|
2
|
-
|
|
3
|
-
const ignore = require('ignore')
|
|
4
|
-
|
|
5
1
|
const { logger } = require('./../../../shared/logger')
|
|
6
|
-
|
|
2
|
+
|
|
3
|
+
const Prebuild = require('./../../../lib/services/prebuild')
|
|
7
4
|
|
|
8
5
|
function prebuild () {
|
|
9
6
|
const options = this.opts()
|
|
10
7
|
logger.debug(`options: ${JSON.stringify(options)}`)
|
|
11
8
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return
|
|
18
|
-
}
|
|
9
|
+
try {
|
|
10
|
+
const {
|
|
11
|
+
successMessage,
|
|
12
|
+
warnings
|
|
13
|
+
} = new Prebuild(options).run()
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const dotenvFiles = files.filter(file => file.match(/^\.env(\..+)?$/))
|
|
25
|
-
dotenvFiles.forEach(file => {
|
|
26
|
-
// check if that file is being ignored
|
|
27
|
-
if (ig.ignores(file)) {
|
|
28
|
-
switch (file) {
|
|
29
|
-
case '.env.example':
|
|
30
|
-
warningCount += 1
|
|
31
|
-
logger.warnv(`${file} (currently ignored but should not be)`)
|
|
32
|
-
logger.help2(`? add !${file} to .dockerignore with [echo "!${file}" >> .dockerignore]`)
|
|
33
|
-
break
|
|
34
|
-
case '.env.vault':
|
|
35
|
-
warningCount += 1
|
|
36
|
-
logger.warnv(`${file} (currently ignored but should not be)`)
|
|
37
|
-
logger.help2(`? add !${file} to .dockerignore with [echo "!${file}" >> .dockerignore]`)
|
|
38
|
-
break
|
|
39
|
-
default:
|
|
40
|
-
break
|
|
41
|
-
}
|
|
42
|
-
} else {
|
|
43
|
-
switch (file) {
|
|
44
|
-
case '.env.example':
|
|
45
|
-
break
|
|
46
|
-
case '.env.vault':
|
|
47
|
-
break
|
|
48
|
-
default:
|
|
49
|
-
logger.errorvpb(`${file} not properly dockerignored`)
|
|
50
|
-
logger.help2(`? add ${file} to .dockerignore with [echo ".env*" >> .dockerignore]`)
|
|
51
|
-
process.exit(1) // 3.1 exit early with error code
|
|
52
|
-
break
|
|
15
|
+
for (const warning of warnings) {
|
|
16
|
+
logger.warn(warning.message)
|
|
17
|
+
if (warning.help) {
|
|
18
|
+
logger.help(warning.help)
|
|
53
19
|
}
|
|
54
20
|
}
|
|
55
|
-
})
|
|
56
21
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
logger.
|
|
60
|
-
|
|
61
|
-
|
|
22
|
+
logger.success(successMessage)
|
|
23
|
+
} catch (error) {
|
|
24
|
+
logger.error(error.message)
|
|
25
|
+
if (error.help) {
|
|
26
|
+
logger.help(error.help)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
process.exit(1)
|
|
62
30
|
}
|
|
63
31
|
}
|
|
64
32
|
|
|
@@ -13,15 +13,15 @@ function precommit () {
|
|
|
13
13
|
} = new Precommit(options).run()
|
|
14
14
|
|
|
15
15
|
for (const warning of warnings) {
|
|
16
|
-
logger.
|
|
16
|
+
logger.warn(warning.message)
|
|
17
17
|
if (warning.help) {
|
|
18
18
|
logger.help(warning.help)
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
logger.
|
|
22
|
+
logger.success(successMessage)
|
|
23
23
|
} catch (error) {
|
|
24
|
-
logger.
|
|
24
|
+
logger.error(error.message)
|
|
25
25
|
if (error.help) {
|
|
26
26
|
logger.help(error.help)
|
|
27
27
|
}
|
|
@@ -12,7 +12,7 @@ function scan () {
|
|
|
12
12
|
} catch (error) {
|
|
13
13
|
console.error('gitleaks: command not found')
|
|
14
14
|
logger.help('? install gitleaks: [brew install gitleaks]')
|
|
15
|
-
logger.
|
|
15
|
+
logger.help('? other install options: [https://github.com/gitleaks/gitleaks]')
|
|
16
16
|
process.exit(1)
|
|
17
17
|
return
|
|
18
18
|
}
|
package/src/lib/main.d.ts
CHANGED
|
@@ -140,20 +140,12 @@ export interface DotenvConfigOptions {
|
|
|
140
140
|
logLevel?:
|
|
141
141
|
| 'error'
|
|
142
142
|
| 'errorv'
|
|
143
|
-
| 'errorvp'
|
|
144
|
-
| 'errorvpb'
|
|
145
143
|
| 'errornocolor'
|
|
146
144
|
| 'warn'
|
|
147
|
-
| 'warnv'
|
|
148
|
-
| 'warnvp'
|
|
149
|
-
| 'warnvpb'
|
|
150
145
|
| 'success'
|
|
151
146
|
| 'successv'
|
|
152
|
-
| 'successvp'
|
|
153
|
-
| 'successvpb'
|
|
154
147
|
| 'info'
|
|
155
148
|
| 'help'
|
|
156
|
-
| 'help2'
|
|
157
149
|
| 'http'
|
|
158
150
|
| 'verbose'
|
|
159
151
|
| 'debug'
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* istanbul ignore file */
|
|
2
|
+
const fsx = require('./../helpers/fsx')
|
|
3
|
+
const ignore = require('ignore')
|
|
4
|
+
|
|
5
|
+
const Ls = require('../services/ls')
|
|
6
|
+
|
|
7
|
+
const isFullyEncrypted = require('./../helpers/isFullyEncrypted')
|
|
8
|
+
const packageJson = require('./../helpers/packageJson')
|
|
9
|
+
const MISSING_DOCKERIGNORE = '.env.keys' // by default only ignore .env.keys. all other .env* files COULD be included - as long as they are encrypted
|
|
10
|
+
|
|
11
|
+
class Prebuild {
|
|
12
|
+
constructor () {
|
|
13
|
+
this.excludeEnvFile = ['test/**', 'tests/**', 'spec/**', 'specs/**', 'pytest/**', 'test_suite/**']
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
run () {
|
|
17
|
+
let count = 0
|
|
18
|
+
const warnings = []
|
|
19
|
+
let dockerignore = MISSING_DOCKERIGNORE
|
|
20
|
+
|
|
21
|
+
// 1. check for .dockerignore file
|
|
22
|
+
if (!fsx.existsSync('.dockerignore')) {
|
|
23
|
+
const warning = new Error(`[dotenvx@${packageJson.version}][prebuild] .dockerignore missing`)
|
|
24
|
+
warnings.push(warning)
|
|
25
|
+
} else {
|
|
26
|
+
dockerignore = fsx.readFileX('.dockerignore')
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// 2. check .env* files against .dockerignore file
|
|
30
|
+
const ig = ignore().add(dockerignore)
|
|
31
|
+
const lsService = new Ls(process.cwd(), undefined, this.excludeEnvFile)
|
|
32
|
+
const dotenvFiles = lsService.run()
|
|
33
|
+
dotenvFiles.forEach(file => {
|
|
34
|
+
count += 1
|
|
35
|
+
|
|
36
|
+
// check if that file is being ignored
|
|
37
|
+
if (ig.ignores(file)) {
|
|
38
|
+
if (file === '.env.example' || file === '.env.vault') {
|
|
39
|
+
const warning = new Error(`[dotenvx@${packageJson.version}][prebuild] ${file} (currently ignored but should not be)`)
|
|
40
|
+
warning.help = `[dotenvx@${packageJson.version}][prebuild] ⮕ run [dotenvx ext gitignore --pattern !${file}]`
|
|
41
|
+
warnings.push(warning)
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
if (file !== '.env.example' && file !== '.env.vault') {
|
|
45
|
+
const src = fsx.readFileX(file)
|
|
46
|
+
const encrypted = isFullyEncrypted(src)
|
|
47
|
+
|
|
48
|
+
// if contents are encrypted don't raise an error
|
|
49
|
+
if (!encrypted) {
|
|
50
|
+
let errorMsg = `[dotenvx@${packageJson.version}][prebuild] ${file} not protected (encrypted or dockerignored)`
|
|
51
|
+
let errorHelp = `[dotenvx@${packageJson.version}][prebuild] ⮕ run [dotenvx encrypt -f ${file}] or [dotenvx ext gitignore --pattern ${file}]`
|
|
52
|
+
if (file.includes('.env.keys')) {
|
|
53
|
+
errorMsg = `[dotenvx@${packageJson.version}][prebuild] ${file} not protected (dockerignored)`
|
|
54
|
+
errorHelp = `[dotenvx@${packageJson.version}][prebuild] ⮕ run [dotenvx ext gitignore --pattern ${file}]`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const error = new Error(errorMsg)
|
|
58
|
+
error.help = errorHelp
|
|
59
|
+
throw error
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
let successMessage = `[dotenvx@${packageJson.version}][prebuild] .env files (${count}) protected (encrypted or dockerignored)`
|
|
66
|
+
|
|
67
|
+
if (count === 0) {
|
|
68
|
+
successMessage = `[dotenvx@${packageJson.version}][prebuild] zero .env files`
|
|
69
|
+
}
|
|
70
|
+
if (warnings.length > 0) {
|
|
71
|
+
successMessage += ` with warnings (${warnings.length})`
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
successMessage,
|
|
76
|
+
warnings
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
module.exports = Prebuild
|
|
@@ -5,6 +5,7 @@ const ignore = require('ignore')
|
|
|
5
5
|
const Ls = require('../services/ls')
|
|
6
6
|
|
|
7
7
|
const isFullyEncrypted = require('./../helpers/isFullyEncrypted')
|
|
8
|
+
const packageJson = require('./../helpers/packageJson')
|
|
8
9
|
const InstallPrecommitHook = require('./../helpers/installPrecommitHook')
|
|
9
10
|
const childProcess = require('child_process')
|
|
10
11
|
const MISSING_GITIGNORE = '.env.keys' // by default only ignore .env.keys. all other .env* files COULD be included - as long as they are encrypted
|
|
@@ -32,8 +33,7 @@ class Precommit {
|
|
|
32
33
|
|
|
33
34
|
// 1. check for .gitignore file
|
|
34
35
|
if (!fsx.existsSync('.gitignore')) {
|
|
35
|
-
const warning = new Error(
|
|
36
|
-
warning.help = '? add it with [touch .gitignore]'
|
|
36
|
+
const warning = new Error(`[dotenvx@${packageJson.version}][precommit] .gitignore missing`)
|
|
37
37
|
warnings.push(warning)
|
|
38
38
|
} else {
|
|
39
39
|
gitignore = fsx.readFileX('.gitignore')
|
|
@@ -51,8 +51,8 @@ class Precommit {
|
|
|
51
51
|
// check if that file is being ignored
|
|
52
52
|
if (ig.ignores(file)) {
|
|
53
53
|
if (file === '.env.example' || file === '.env.vault') {
|
|
54
|
-
const warning = new Error(
|
|
55
|
-
warning.help =
|
|
54
|
+
const warning = new Error(`[dotenvx@${packageJson.version}][precommit] ${file} (currently ignored but should not be)`)
|
|
55
|
+
warning.help = `[dotenvx@${packageJson.version}][precommit] ⮕ run [dotenvx ext gitignore --pattern !${file}]`
|
|
56
56
|
warnings.push(warning)
|
|
57
57
|
}
|
|
58
58
|
} else {
|
|
@@ -62,8 +62,15 @@ class Precommit {
|
|
|
62
62
|
|
|
63
63
|
// if contents are encrypted don't raise an error
|
|
64
64
|
if (!encrypted) {
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
let errorMsg = `[dotenvx@${packageJson.version}][precommit] ${file} not protected (encrypted or gitignored)`
|
|
66
|
+
let errorHelp = `[dotenvx@${packageJson.version}][precommit] ⮕ run [dotenvx encrypt -f ${file}] or [dotenvx ext gitignore --pattern ${file}]`
|
|
67
|
+
if (file.includes('.env.keys')) {
|
|
68
|
+
errorMsg = `[dotenvx@${packageJson.version}][precommit] ${file} not protected (gitignored)`
|
|
69
|
+
errorHelp = `[dotenvx@${packageJson.version}][precommit] ⮕ run [dotenvx ext gitignore --pattern ${file}]`
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const error = new Error(errorMsg)
|
|
73
|
+
error.help = errorHelp
|
|
67
74
|
throw error
|
|
68
75
|
}
|
|
69
76
|
}
|
|
@@ -71,9 +78,9 @@ class Precommit {
|
|
|
71
78
|
}
|
|
72
79
|
})
|
|
73
80
|
|
|
74
|
-
let successMessage =
|
|
81
|
+
let successMessage = `[dotenvx@${packageJson.version}][precommit] .env files (${count}) protected (encrypted or gitignored)`
|
|
75
82
|
if (count === 0) {
|
|
76
|
-
successMessage =
|
|
83
|
+
successMessage = `[dotenvx@${packageJson.version}][precommit] zero .env files`
|
|
77
84
|
}
|
|
78
85
|
if (warnings.length > 0) {
|
|
79
86
|
successMessage += ` with warnings (${warnings.length})`
|
|
@@ -88,7 +95,7 @@ class Precommit {
|
|
|
88
95
|
|
|
89
96
|
_isFileToBeCommitted (filePath) {
|
|
90
97
|
try {
|
|
91
|
-
const output = childProcess.execSync('git diff
|
|
98
|
+
const output = childProcess.execSync('git diff HEAD --name-only').toString()
|
|
92
99
|
const files = output.split('\n')
|
|
93
100
|
|
|
94
101
|
return files.includes(filePath)
|
package/src/shared/logger.js
CHANGED
|
@@ -4,20 +4,12 @@ const { getColor, bold } = require('./colors')
|
|
|
4
4
|
const levels = {
|
|
5
5
|
error: 0,
|
|
6
6
|
errorv: 0,
|
|
7
|
-
errorvp: 0,
|
|
8
|
-
errorvpb: 0,
|
|
9
7
|
errornocolor: 0,
|
|
10
8
|
warn: 1,
|
|
11
|
-
warnv: 1,
|
|
12
|
-
warnvp: 1,
|
|
13
|
-
warnvpb: 1,
|
|
14
9
|
success: 2,
|
|
15
10
|
successv: 2,
|
|
16
|
-
successvp: 2,
|
|
17
|
-
successvpb: 2,
|
|
18
11
|
info: 2,
|
|
19
12
|
help: 2,
|
|
20
|
-
help2: 2,
|
|
21
13
|
blank: 2,
|
|
22
14
|
verbose: 4,
|
|
23
15
|
debug: 5,
|
|
@@ -29,7 +21,6 @@ const warn = getColor('orangered')
|
|
|
29
21
|
const success = getColor('green')
|
|
30
22
|
const successv = getColor('olive') // yellow-ish tint that 'looks' like dotenv
|
|
31
23
|
const help = getColor('dodgerblue')
|
|
32
|
-
const help2 = getColor('gray')
|
|
33
24
|
const verbose = getColor('plum')
|
|
34
25
|
const debug = getColor('plum')
|
|
35
26
|
|
|
@@ -55,38 +46,22 @@ function formatMessage (level, message) {
|
|
|
55
46
|
return error(formattedMessage)
|
|
56
47
|
case 'errorv':
|
|
57
48
|
return error(`[dotenvx@${packageJson.version}] ${formattedMessage}`)
|
|
58
|
-
case 'errorvp':
|
|
59
|
-
return error(`[dotenvx@${packageJson.version}][precommit] ${formattedMessage}`)
|
|
60
|
-
case 'errorvpb':
|
|
61
|
-
return error(`[dotenvx@${packageJson.version}][prebuild] ${formattedMessage}`)
|
|
62
49
|
case 'errornocolor':
|
|
63
50
|
return formattedMessage
|
|
64
51
|
// warns
|
|
65
52
|
case 'warn':
|
|
66
53
|
return warn(formattedMessage)
|
|
67
|
-
case 'warnv':
|
|
68
|
-
return warn(`[dotenvx@${packageJson.version}] ${formattedMessage}`)
|
|
69
|
-
case 'warnvp':
|
|
70
|
-
return warn(`[dotenvx@${packageJson.version}][precommit] ${formattedMessage}`)
|
|
71
|
-
case 'warnvpb':
|
|
72
|
-
return warn(`[dotenvx@${packageJson.version}][prebuild] ${formattedMessage}`)
|
|
73
54
|
// successes
|
|
74
55
|
case 'success':
|
|
75
56
|
return success(formattedMessage)
|
|
76
57
|
case 'successv': // success with 'version'
|
|
77
58
|
return successv(`[dotenvx@${packageJson.version}] ${formattedMessage}`)
|
|
78
|
-
case 'successvp': // success with 'version' and precommit
|
|
79
|
-
return success(`[dotenvx@${packageJson.version}][precommit] ${formattedMessage}`)
|
|
80
|
-
case 'successvpb': // success with 'version' and precommit
|
|
81
|
-
return success(`[dotenvx@${packageJson.version}][prebuild] ${formattedMessage}`)
|
|
82
59
|
// info
|
|
83
60
|
case 'info':
|
|
84
61
|
return formattedMessage
|
|
85
62
|
// help
|
|
86
63
|
case 'help':
|
|
87
64
|
return help(formattedMessage)
|
|
88
|
-
case 'help2':
|
|
89
|
-
return help2(formattedMessage)
|
|
90
65
|
// verbose
|
|
91
66
|
case 'verbose':
|
|
92
67
|
return verbose(formattedMessage)
|
|
@@ -106,24 +81,16 @@ const logger = {
|
|
|
106
81
|
// errors
|
|
107
82
|
error: (msg) => log('error', msg),
|
|
108
83
|
errorv: (msg) => log('errorv', msg),
|
|
109
|
-
errorvp: (msg) => log('errorvp', msg),
|
|
110
|
-
errorvpb: (msg) => log('errorvpb', msg),
|
|
111
84
|
errornocolor: (msg) => log('errornocolor', msg),
|
|
112
85
|
// warns
|
|
113
86
|
warn: (msg) => log('warn', msg),
|
|
114
|
-
warnv: (msg) => log('warnv', msg),
|
|
115
|
-
warnvp: (msg) => log('warnvp', msg),
|
|
116
|
-
warnvpb: (msg) => log('warnvpb', msg),
|
|
117
87
|
// success
|
|
118
88
|
success: (msg) => log('success', msg),
|
|
119
89
|
successv: (msg) => log('successv', msg),
|
|
120
|
-
successvp: (msg) => log('successvp', msg),
|
|
121
|
-
successvpb: (msg) => log('successvpb', msg),
|
|
122
90
|
// info
|
|
123
91
|
info: (msg) => log('info', msg),
|
|
124
92
|
// help
|
|
125
93
|
help: (msg) => log('help', msg),
|
|
126
|
-
help2: (msg) => log('help2', msg),
|
|
127
94
|
// verbose
|
|
128
95
|
verbose: (msg) => log('verbose', msg),
|
|
129
96
|
// debug
|