@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 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.31.2...main)
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,5 +1,5 @@
1
1
  {
2
- "version": "1.31.2",
2
+ "version": "1.32.0",
3
3
  "name": "@dotenvx/dotenvx",
4
4
  "description": "a better dotenv–from the creator of `dotenv`",
5
5
  "author": "@motdotla",
@@ -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
- const pluralize = require('./../../../lib/helpers/pluralize')
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
- // 1. check for .dockerignore file
13
- if (!fsx.existsSync('.dockerignore')) {
14
- logger.errorvpb('.dockerignore missing')
15
- logger.help2('? add it with [touch .dockerignore]')
16
- process.exit(1)
17
- return
18
- }
9
+ try {
10
+ const {
11
+ successMessage,
12
+ warnings
13
+ } = new Prebuild(options).run()
19
14
 
20
- // 2. check .env* files against .dockerignore file
21
- let warningCount = 0
22
- const ig = ignore().add(fsx.readFileX('.dockerignore'))
23
- const files = fsx.readdirSync(process.cwd())
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
- // 3. outpout success
58
- if (warningCount > 0) {
59
- logger.successvpb(`success (with ${pluralize('warning', warningCount)})`)
60
- } else {
61
- logger.successvpb('success')
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.warnv(warning.message)
16
+ logger.warn(warning.message)
17
17
  if (warning.help) {
18
18
  logger.help(warning.help)
19
19
  }
20
20
  }
21
21
 
22
- logger.successvp(successMessage)
22
+ logger.success(successMessage)
23
23
  } catch (error) {
24
- logger.errorvp(error.message)
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.help2('? other install options: [https://github.com/gitleaks/gitleaks]')
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('.gitignore missing')
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(`${file} (currently ignored but should not be)`)
55
- warning.help = `? add !${file} to .gitignore [echo "!${file}" >> .gitignore]`
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
- const error = new Error(`${file} not protected (encrypted or gitignored)`)
66
- error.help = `? encrypt it [dotenvx encrypt -f ${file}] or gitignore it [echo "${file}" >> .gitignore]`
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 = `.env files (${count}) protected (encrypted or gitignored)`
81
+ let successMessage = `[dotenvx@${packageJson.version}][precommit] .env files (${count}) protected (encrypted or gitignored)`
75
82
  if (count === 0) {
76
- successMessage = 'zero .env files'
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 --cached --name-only').toString()
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)
@@ -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