1
1
import fs from 'fs' ;
2
2
import path from 'path' ;
3
+ import { sync as existsSync } from 'path-exists' ;
3
4
import stripJSONComments from 'strip-json-comments' ;
4
5
5
6
import { getNormalizedConfig } from '../configLoader' ;
6
7
7
- export default getContent ;
8
+ export default getConfigContent ;
9
+
10
+ /**
11
+ * Read the content of a configuration file
12
+ * - if not js or json: strip any comments
13
+ * - if js or json: require it
14
+ * @param {String } configPath - full path to configuration file
15
+ * @return {Object }
16
+ */
17
+ function readConfigContent ( configPath ) {
18
+ const parsedPath = path . parse ( configPath )
19
+ const isRcFile = parsedPath . ext !== '.js' && parsedPath . ext !== '.json' ;
20
+ const jsonString = fs . readFileSync ( configPath , 'utf-8' ) ;
21
+ const parse = isRcFile ?
22
+ ( contents ) => JSON . parse ( stripJSONComments ( contents ) ) :
23
+ ( contents ) => JSON . parse ( contents ) ;
24
+
25
+ try {
26
+ const parsed = parse ( jsonString ) ;
27
+
28
+ Object . defineProperty ( parsed , 'configPath' , {
29
+ value : configPath
30
+ } ) ;
31
+
32
+ return parsed ;
33
+ } catch ( error ) {
34
+ error . message = [
35
+ `Parsing JSON at ${ configPath } for commitizen config failed:` ,
36
+ error . mesasge
37
+ ] . join ( '\n' ) ;
38
+
39
+ throw error ;
40
+ }
41
+ }
8
42
9
43
/**
10
44
* Get content of the configuration file
11
- * @param {String } config - partial path to configuration file
45
+ * @param {String } configPath - partial path to configuration file
12
46
* @param {String } directory - directory path which will be joined with config argument
13
47
* @return {Object }
14
48
*/
15
- function getContent ( config , directory ) {
16
- if ( ! config ) {
17
- return ;
49
+ function getConfigContent ( configPath , baseDirectory ) {
50
+ if ( ! configPath ) {
51
+ return ;
18
52
}
19
53
20
- var configPath = path . resolve ( directory , config ) ;
21
- var ext ;
22
- var content ;
23
-
24
- config = path . basename ( config ) ;
25
-
26
- if ( fs . existsSync ( configPath ) ) {
27
- ext = path . extname ( configPath ) ;
28
-
29
- if ( ext === '.js' || ext === '.json' ) {
30
- content = JSON . parse ( fs . readFileSync ( configPath , 'utf8' ) ) ;
31
- } else {
32
- content = JSON . parse (
33
- stripJSONComments (
34
- fs . readFileSync ( configPath , 'utf8' )
35
- )
36
- ) ;
37
- }
38
-
39
- // Adding property via Object.defineProperty makes it
40
- // non-enumerable and avoids warning for unsupported rules
41
- Object . defineProperty ( content , 'configPath' , {
42
- value : configPath
43
- } ) ;
54
+ const resolvedPath = path . resolve ( baseDirectory , configPath ) ;
55
+ const configBasename = path . basename ( resolvedPath ) ;
56
+
57
+ if ( ! existsSync ( resolvedPath ) ) {
58
+ return getNormalizedConfig ( resolvedPath ) ;
44
59
}
45
- return getNormalizedConfig ( config , content ) ;
46
-
47
- } ;
60
+
61
+ const content = readConfigContent ( resolvedPath ) ;
62
+ return getNormalizedConfig ( configBasename , content ) ;
63
+ } ;
0 commit comments