1
1
const { existsSync, readdirSync } = require ( 'fs' )
2
2
const { resolve } = require ( 'path' )
3
3
let instances = { }
4
+ let detectedFromDefaults = { }
4
5
5
6
const _defaults = {
6
7
name : '' ,
7
8
cacheConfig : true ,
9
+ cacheDetectedDefaults : true ,
8
10
useDotEnv : true ,
9
11
useEnv : true ,
10
12
usePackageConfig : true ,
@@ -21,6 +23,7 @@ const _defaults = {
21
23
* @param {object } [configentOptions] configent options
22
24
* @param {string= } [configentOptions.name = ''] name to use for configs. If left empty, name from package.json is used
23
25
* @param {boolean= } [configentOptions.cacheConfig = true] calling configent twice with same parameters will return the same instance
26
+ * @param {boolean= } [configentOptions.cacheDetectedDefaults = true] calling configent twice from the same module will return the same defaults
24
27
* @param {boolean= } [configentOptions.useDotEnv = true] include config from .env files
25
28
* @param {boolean= } [configentOptions.useEnv = true] include config from process.env
26
29
* @param {boolean= } [configentOptions.usePackageConfig = true] include config from package.json
@@ -36,6 +39,7 @@ function configent(defaults, input = {}, configentOptions) {
36
39
const {
37
40
name,
38
41
cacheConfig,
42
+ cacheDetectedDefaults,
39
43
useDotEnv,
40
44
sanitizeEnvValue,
41
45
useConfig,
@@ -92,24 +96,30 @@ function configent(defaults, input = {}, configentOptions) {
92
96
}
93
97
94
98
function getDetectDefaults ( ) {
95
- const pkgjson = { dependencies : { } , devDependencies : { } } ;
96
- if ( existsSync ( 'package.json' ) ) {
97
- Object . assign ( pkgjson , require ( resolve ( process . cwd ( ) , 'package.json' ) ) ) ;
98
- }
99
-
100
- Object . assign ( pkgjson . dependencies , pkgjson . devDependencies )
101
-
102
- const unsortedConfigTemplates = readdirSync ( resolve ( module [ 'parent' ] . path , detectDefaultsConfigPath ) )
99
+ const hash = JSON . stringify ( { name, path : module [ 'parent' ] . path } )
100
+
101
+ // we only want to detect the defaults for any given module once
102
+ if ( ! detectedFromDefaults [ hash ] || ! cacheDetectedDefaults ) {
103
+ const pkgjson = { dependencies : { } , devDependencies : { } } ;
104
+ if ( existsSync ( 'package.json' ) ) {
105
+ Object . assign ( pkgjson , require ( resolve ( process . cwd ( ) , 'package.json' ) ) ) ;
106
+ }
107
+
108
+ Object . assign ( pkgjson . dependencies , pkgjson . devDependencies )
109
+
110
+ const unsortedConfigTemplates = readdirSync ( resolve ( module [ 'parent' ] . path , detectDefaultsConfigPath ) )
103
111
. map ( file => ( {
104
112
file,
105
113
...require ( resolve ( module [ 'parent' ] . path , detectDefaultsConfigPath , file ) )
106
114
} ) )
107
- const configTemplates = sortBySupersedings ( unsortedConfigTemplates )
108
- const configTemplate = configTemplates . find ( configTemplate => configTemplate . condition ( { pkgjson } ) )
109
- if ( configTemplate ) {
110
- console . log ( `${ name } found config for ${ configTemplate . name } ` )
111
- return configTemplate . config ( )
115
+ const configTemplates = sortBySupersedings ( unsortedConfigTemplates )
116
+ const configTemplate = configTemplates . find ( configTemplate => configTemplate . condition ( { pkgjson } ) )
117
+ if ( configTemplate ) {
118
+ console . log ( `${ name } found config for ${ configTemplate . name } ` )
119
+ detectedFromDefaults [ hash ] = configTemplate . config ( )
120
+ }
112
121
}
122
+ return detectedFromDefaults [ hash ]
113
123
}
114
124
}
115
125
0 commit comments