rc-config-loader 2.0.3 → 2.0.4

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.
@@ -3,60 +3,66 @@
3
3
  // Original https://github.com/zkochan/rcfile
4
4
  "use strict";
5
5
 
6
- var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
6
+ function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
7
7
 
8
8
  var path = require("path");
9
+
9
10
  var debug = require("debug")("rc-config-loader");
11
+
10
12
  var requireFromString = require("require-from-string");
13
+
11
14
  var JSON5 = require("json5");
15
+
12
16
  var fs = require("fs");
17
+
13
18
  var pathExists = require("path-exists");
19
+
14
20
  var objectAssign = require("object-assign");
21
+
15
22
  var keys = require("object-keys");
16
23
 
17
24
  var defaultLoaderByExt = {
18
- ".js": loadJSConfigFile,
19
- ".json": loadJSONConfigFile,
20
- ".yaml": loadYAMLConfigFile,
21
- ".yml": loadYAMLConfigFile
25
+ ".js": loadJSConfigFile,
26
+ ".json": loadJSONConfigFile,
27
+ ".yaml": loadYAMLConfigFile,
28
+ ".yml": loadYAMLConfigFile
22
29
  };
23
-
24
30
  var defaultOptions = {
25
- // does look for `package.json`
26
- packageJSON: false,
27
- // treat default(no ext file) as some extension
28
- defaultExtension: [".json", ".yaml", ".yml", ".js"],
29
- cwd: process.cwd()
31
+ // does look for `package.json`
32
+ packageJSON: false,
33
+ // treat default(no ext file) as some extension
34
+ defaultExtension: [".json", ".yaml", ".yml", ".js"],
35
+ cwd: process.cwd()
30
36
  };
31
-
32
37
  /**
33
38
  * @param {string} pkgName
34
39
  * @param {rcConfigLoaderOption} [opts]
35
40
  * @returns {{ config: Object, filePath:string } | undefined}
36
41
  */
37
- module.exports = function rcConfigLoader(pkgName) {
38
- var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
39
42
 
40
- // path/to/config or basename of config file.
41
- var configFileName = opts.configFileName || "." + pkgName + "rc";
42
- var defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
43
- var cwd = opts.cwd || defaultOptions.cwd;
44
- var packageJSON = opts.packageJSON || defaultOptions.packageJSON;
45
- var packageJSONFieldName = (typeof packageJSON === "undefined" ? "undefined" : _typeof(packageJSON)) === "object" ? packageJSON.fieldName : pkgName;
46
-
47
- var parts = splitPath(cwd);
48
-
49
- var loaders = Array.isArray(defaultExtension) ? defaultExtension.map(function (extension) {
50
- return defaultLoaderByExt[extension];
51
- }) : defaultLoaderByExt[defaultExtension];
52
-
53
- var loaderByExt = objectAssign({}, defaultLoaderByExt, {
54
- "": loaders
55
- });
56
-
57
- return findConfig({ parts: parts, loaderByExt: loaderByExt, configFileName: configFileName, packageJSON: packageJSON, packageJSONFieldName: packageJSONFieldName });
43
+ module.exports = function rcConfigLoader(pkgName) {
44
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
45
+ // path/to/config or basename of config file.
46
+ var configFileName = opts.configFileName || ".".concat(pkgName, "rc");
47
+ var defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
48
+ var cwd = opts.cwd || defaultOptions.cwd;
49
+ var packageJSON = opts.packageJSON || defaultOptions.packageJSON;
50
+ var packageJSONFieldName = _typeof(packageJSON) === "object" ? packageJSON.fieldName : pkgName;
51
+ var parts = splitPath(cwd);
52
+ var loaders = Array.isArray(defaultExtension) ? defaultExtension.map(function (extension) {
53
+ return defaultLoaderByExt[extension];
54
+ }) : defaultLoaderByExt[defaultExtension];
55
+ var loaderByExt = objectAssign({}, defaultLoaderByExt, {
56
+ "": loaders
57
+ });
58
+ return findConfig({
59
+ parts: parts,
60
+ loaderByExt: loaderByExt,
61
+ configFileName: configFileName,
62
+ packageJSON: packageJSON,
63
+ packageJSONFieldName: packageJSONFieldName
64
+ });
58
65
  };
59
-
60
66
  /**
61
67
  *
62
68
  * @param {string[]} parts
@@ -69,118 +75,142 @@ module.exports = function rcConfigLoader(pkgName) {
69
75
  * filePath: string
70
76
  * }|undefined}
71
77
  */
78
+
79
+
72
80
  function findConfig(_ref) {
73
- var parts = _ref.parts,
74
- loaderByExt = _ref.loaderByExt,
75
- configFileName = _ref.configFileName,
76
- packageJSON = _ref.packageJSON,
77
- packageJSONFieldName = _ref.packageJSONFieldName;
78
-
79
- var exts = keys(loaderByExt);
80
- while (exts.length) {
81
- var ext = exts.shift();
82
- var configLocation = join(parts, configFileName + ext);
83
- if (!pathExists.sync(configLocation)) {
84
- continue;
85
- }
86
- var loaders = loaderByExt[ext];
87
- if (!Array.isArray(loaders)) {
88
- var loader = loaders;
89
- var result = loader(configLocation);
90
- if (!result) {
91
- continue;
92
- }
93
- return {
94
- config: result,
95
- filePath: configLocation
96
- };
97
- }
98
- for (var i = 0; i < loaders.length; i++) {
99
- var _loader = loaders[i];
100
- var _result = _loader(configLocation, true);
101
- if (!_result) {
102
- continue;
103
- }
104
- return {
105
- config: _result,
106
- filePath: configLocation
107
- };
108
- }
81
+ var parts = _ref.parts,
82
+ loaderByExt = _ref.loaderByExt,
83
+ configFileName = _ref.configFileName,
84
+ packageJSON = _ref.packageJSON,
85
+ packageJSONFieldName = _ref.packageJSONFieldName;
86
+ var exts = keys(loaderByExt);
87
+
88
+ while (exts.length) {
89
+ var ext = exts.shift();
90
+ var configLocation = join(parts, configFileName + ext);
91
+
92
+ if (!pathExists.sync(configLocation)) {
93
+ continue;
109
94
  }
110
95
 
111
- if (packageJSON) {
112
- var pkgJSONLoc = join(parts, "package.json");
113
- if (pathExists.sync(pkgJSONLoc)) {
114
- var pkgJSON = require(pkgJSONLoc);
115
- if (pkgJSON[packageJSONFieldName]) {
116
- return {
117
- config: pkgJSON[packageJSONFieldName],
118
- filePath: pkgJSONLoc
119
- };
120
- }
121
- }
96
+ var loaders = loaderByExt[ext];
97
+
98
+ if (!Array.isArray(loaders)) {
99
+ var loader = loaders;
100
+ var result = loader(configLocation);
101
+
102
+ if (!result) {
103
+ continue;
104
+ }
105
+
106
+ return {
107
+ config: result,
108
+ filePath: configLocation
109
+ };
110
+ }
111
+
112
+ for (var i = 0; i < loaders.length; i++) {
113
+ var _loader = loaders[i];
114
+
115
+ var _result = _loader(configLocation, true);
116
+
117
+ if (!_result) {
118
+ continue;
119
+ }
120
+
121
+ return {
122
+ config: _result,
123
+ filePath: configLocation
124
+ };
122
125
  }
123
- if (parts.pop()) {
124
- return findConfig({ parts: parts, loaderByExt: loaderByExt, configFileName: configFileName, packageJSON: packageJSON, packageJSONFieldName: packageJSONFieldName });
126
+ }
127
+
128
+ if (packageJSON) {
129
+ var pkgJSONLoc = join(parts, "package.json");
130
+
131
+ if (pathExists.sync(pkgJSONLoc)) {
132
+ var pkgJSON = require(pkgJSONLoc);
133
+
134
+ if (pkgJSON[packageJSONFieldName]) {
135
+ return {
136
+ config: pkgJSON[packageJSONFieldName],
137
+ filePath: pkgJSONLoc
138
+ };
139
+ }
125
140
  }
126
- return undefined;
141
+ }
142
+
143
+ if (parts.pop()) {
144
+ return findConfig({
145
+ parts: parts,
146
+ loaderByExt: loaderByExt,
147
+ configFileName: configFileName,
148
+ packageJSON: packageJSON,
149
+ packageJSONFieldName: packageJSONFieldName
150
+ });
151
+ }
152
+
153
+ return undefined;
127
154
  }
128
155
 
129
156
  function splitPath(x) {
130
- return path.resolve(x || "").split(path.sep);
157
+ return path.resolve(x || "").split(path.sep);
131
158
  }
132
159
 
133
160
  function join(parts, filename) {
134
- return path.resolve(parts.join(path.sep) + path.sep, filename);
161
+ return path.resolve(parts.join(path.sep) + path.sep, filename);
135
162
  }
136
163
 
137
164
  function loadJSConfigFile(filePath, suppress) {
138
- debug("Loading JavaScript config file: " + filePath);
139
- try {
140
- var content = fs.readFileSync(filePath, "utf-8");
141
- return requireFromString(content, filePath);
142
- } catch (e) {
143
- debug("Error reading JavaScript file: " + filePath);
144
- if (!suppress) {
145
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
146
- throw e;
147
- }
165
+ debug("Loading JavaScript config file: ".concat(filePath));
166
+
167
+ try {
168
+ var content = fs.readFileSync(filePath, "utf-8");
169
+ return requireFromString(content, filePath);
170
+ } catch (e) {
171
+ debug("Error reading JavaScript file: ".concat(filePath));
172
+
173
+ if (!suppress) {
174
+ e.message = "Cannot read config file: ".concat(filePath, "\nError: ").concat(e.message);
175
+ throw e;
148
176
  }
177
+ }
149
178
  }
150
179
 
151
180
  function loadJSONConfigFile(filePath, suppress) {
152
- debug("Loading JSON config file: " + filePath);
153
-
154
- try {
155
- return JSON5.parse(readFile(filePath));
156
- } catch (e) {
157
- debug("Error reading JSON file: " + filePath);
158
- if (!suppress) {
159
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
160
- throw e;
161
- }
181
+ debug("Loading JSON config file: ".concat(filePath));
182
+
183
+ try {
184
+ return JSON5.parse(readFile(filePath));
185
+ } catch (e) {
186
+ debug("Error reading JSON file: ".concat(filePath));
187
+
188
+ if (!suppress) {
189
+ e.message = "Cannot read config file: ".concat(filePath, "\nError: ").concat(e.message);
190
+ throw e;
162
191
  }
192
+ }
163
193
  }
164
194
 
165
195
  function readFile(filePath) {
166
- return fs.readFileSync(filePath, "utf8");
196
+ return fs.readFileSync(filePath, "utf8");
167
197
  }
168
198
 
169
199
  function loadYAMLConfigFile(filePath, suppress) {
170
- debug("Loading YAML config file: " + filePath);
171
-
172
- // lazy load YAML to improve performance when not used
173
- var yaml = require("js-yaml");
174
-
175
- try {
176
- // empty YAML file can be null, so always use
177
- return yaml.safeLoad(readFile(filePath)) || {};
178
- } catch (e) {
179
- debug("Error reading YAML file: " + filePath);
180
- if (!suppress) {
181
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
182
- throw e;
183
- }
200
+ debug("Loading YAML config file: ".concat(filePath)); // lazy load YAML to improve performance when not used
201
+
202
+ var yaml = require("js-yaml");
203
+
204
+ try {
205
+ // empty YAML file can be null, so always use
206
+ return yaml.safeLoad(readFile(filePath)) || {};
207
+ } catch (e) {
208
+ debug("Error reading YAML file: ".concat(filePath));
209
+
210
+ if (!suppress) {
211
+ e.message = "Cannot read config file: ".concat(filePath, "\nError: ").concat(e.message);
212
+ throw e;
184
213
  }
214
+ }
185
215
  }
186
216
  //# sourceMappingURL=rc-config-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rc-config-loader.js"],"names":["path","require","debug","requireFromString","JSON5","fs","pathExists","objectAssign","keys","defaultLoaderByExt","loadJSConfigFile","loadJSONConfigFile","loadYAMLConfigFile","defaultOptions","packageJSON","defaultExtension","cwd","process","module","exports","rcConfigLoader","pkgName","opts","configFileName","packageJSONFieldName","fieldName","parts","splitPath","loaders","Array","isArray","map","extension","loaderByExt","findConfig","exts","length","ext","shift","configLocation","join","sync","loader","result","config","filePath","i","pkgJSONLoc","pkgJSON","pop","undefined","x","resolve","split","sep","filename","suppress","content","readFileSync","e","message","parse","readFile","yaml","safeLoad"],"mappings":"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","file":"rc-config-loader.js","sourcesContent":["// MIT © 2017 azu\n// MIT © Zoltan Kochan\n// Original https://github.com/zkochan/rcfile\n\"use strict\";\nconst path = require(\"path\");\nconst debug = require(\"debug\")(\"rc-config-loader\");\nconst requireFromString = require(\"require-from-string\");\nconst JSON5 = require(\"json5\");\nconst fs = require(\"fs\");\nconst pathExists = require(\"path-exists\");\nconst objectAssign = require(\"object-assign\");\nconst keys = require(\"object-keys\");\n\nconst defaultLoaderByExt = {\n \".js\": loadJSConfigFile,\n \".json\": loadJSONConfigFile,\n \".yaml\": loadYAMLConfigFile,\n \".yml\": loadYAMLConfigFile\n};\n\nconst defaultOptions = {\n // does look for `package.json`\n packageJSON: false,\n // treat default(no ext file) as some extension\n defaultExtension: [\".json\", \".yaml\", \".yml\", \".js\"],\n cwd: process.cwd()\n};\n\n/**\n * @param {string} pkgName\n * @param {rcConfigLoaderOption} [opts]\n * @returns {{ config: Object, filePath:string } | undefined}\n */\nmodule.exports = function rcConfigLoader(pkgName, opts = {}) {\n // path/to/config or basename of config file.\n const configFileName = opts.configFileName || `.${pkgName}rc`;\n const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;\n const cwd = opts.cwd || defaultOptions.cwd;\n const packageJSON = opts.packageJSON || defaultOptions.packageJSON;\n const packageJSONFieldName = typeof packageJSON === \"object\" ? packageJSON.fieldName : pkgName;\n\n const parts = splitPath(cwd);\n\n const loaders = Array.isArray(defaultExtension)\n ? defaultExtension.map(extension => defaultLoaderByExt[extension])\n : defaultLoaderByExt[defaultExtension];\n\n const loaderByExt = objectAssign({}, defaultLoaderByExt, {\n \"\": loaders\n });\n\n return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });\n};\n\n/**\n *\n * @param {string[]} parts\n * @param {Object} loaderByExt\n * @param {string} configFileName\n * @param {boolean|Object} packageJSON\n * @param {string} packageJSONFieldName\n * @returns {{\n * config: string,\n * filePath: string\n * }|undefined}\n */\nfunction findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName }) {\n const exts = keys(loaderByExt);\n while (exts.length) {\n const ext = exts.shift();\n const configLocation = join(parts, configFileName + ext);\n if (!pathExists.sync(configLocation)) {\n continue;\n }\n const loaders = loaderByExt[ext];\n if (!Array.isArray(loaders)) {\n const loader = loaders;\n const result = loader(configLocation);\n if (!result) {\n continue;\n }\n return {\n config: result,\n filePath: configLocation\n };\n }\n for (let i = 0; i < loaders.length; i++) {\n const loader = loaders[i];\n const result = loader(configLocation, true);\n if (!result) {\n continue;\n }\n return {\n config: result,\n filePath: configLocation\n };\n }\n }\n\n if (packageJSON) {\n const pkgJSONLoc = join(parts, \"package.json\");\n if (pathExists.sync(pkgJSONLoc)) {\n const pkgJSON = require(pkgJSONLoc);\n if (pkgJSON[packageJSONFieldName]) {\n return {\n config: pkgJSON[packageJSONFieldName],\n filePath: pkgJSONLoc\n };\n }\n }\n }\n if (parts.pop()) {\n return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });\n }\n return undefined;\n}\n\nfunction splitPath(x) {\n return path.resolve(x || \"\").split(path.sep);\n}\n\nfunction join(parts, filename) {\n return path.resolve(parts.join(path.sep) + path.sep, filename);\n}\n\nfunction loadJSConfigFile(filePath, suppress) {\n debug(`Loading JavaScript config file: ${filePath}`);\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return requireFromString(content, filePath);\n } catch (e) {\n debug(`Error reading JavaScript file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n\nfunction loadJSONConfigFile(filePath, suppress) {\n debug(`Loading JSON config file: ${filePath}`);\n\n try {\n return JSON5.parse(readFile(filePath));\n } catch (e) {\n debug(`Error reading JSON file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n\nfunction readFile(filePath) {\n return fs.readFileSync(filePath, \"utf8\");\n}\n\nfunction loadYAMLConfigFile(filePath, suppress) {\n debug(`Loading YAML config file: ${filePath}`);\n\n // lazy load YAML to improve performance when not used\n const yaml = require(\"js-yaml\");\n\n try {\n // empty YAML file can be null, so always use\n return yaml.safeLoad(readFile(filePath)) || {};\n } catch (e) {\n debug(`Error reading YAML file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/rc-config-loader.js"],"names":["path","require","debug","requireFromString","JSON5","fs","pathExists","objectAssign","keys","defaultLoaderByExt","loadJSConfigFile","loadJSONConfigFile","loadYAMLConfigFile","defaultOptions","packageJSON","defaultExtension","cwd","process","module","exports","rcConfigLoader","pkgName","opts","configFileName","packageJSONFieldName","fieldName","parts","splitPath","loaders","Array","isArray","map","extension","loaderByExt","findConfig","exts","length","ext","shift","configLocation","join","sync","loader","result","config","filePath","i","pkgJSONLoc","pkgJSON","pop","undefined","x","resolve","split","sep","filename","suppress","content","readFileSync","e","message","parse","readFile","yaml","safeLoad"],"mappings":"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","sourcesContent":["// MIT © 2017 azu\n// MIT © Zoltan Kochan\n// Original https://github.com/zkochan/rcfile\n\"use strict\";\nconst path = require(\"path\");\nconst debug = require(\"debug\")(\"rc-config-loader\");\nconst requireFromString = require(\"require-from-string\");\nconst JSON5 = require(\"json5\");\nconst fs = require(\"fs\");\nconst pathExists = require(\"path-exists\");\nconst objectAssign = require(\"object-assign\");\nconst keys = require(\"object-keys\");\n\nconst defaultLoaderByExt = {\n \".js\": loadJSConfigFile,\n \".json\": loadJSONConfigFile,\n \".yaml\": loadYAMLConfigFile,\n \".yml\": loadYAMLConfigFile\n};\n\nconst defaultOptions = {\n // does look for `package.json`\n packageJSON: false,\n // treat default(no ext file) as some extension\n defaultExtension: [\".json\", \".yaml\", \".yml\", \".js\"],\n cwd: process.cwd()\n};\n\n/**\n * @param {string} pkgName\n * @param {rcConfigLoaderOption} [opts]\n * @returns {{ config: Object, filePath:string } | undefined}\n */\nmodule.exports = function rcConfigLoader(pkgName, opts = {}) {\n // path/to/config or basename of config file.\n const configFileName = opts.configFileName || `.${pkgName}rc`;\n const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;\n const cwd = opts.cwd || defaultOptions.cwd;\n const packageJSON = opts.packageJSON || defaultOptions.packageJSON;\n const packageJSONFieldName = typeof packageJSON === \"object\" ? packageJSON.fieldName : pkgName;\n\n const parts = splitPath(cwd);\n\n const loaders = Array.isArray(defaultExtension)\n ? defaultExtension.map(extension => defaultLoaderByExt[extension])\n : defaultLoaderByExt[defaultExtension];\n\n const loaderByExt = objectAssign({}, defaultLoaderByExt, {\n \"\": loaders\n });\n\n return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });\n};\n\n/**\n *\n * @param {string[]} parts\n * @param {Object} loaderByExt\n * @param {string} configFileName\n * @param {boolean|Object} packageJSON\n * @param {string} packageJSONFieldName\n * @returns {{\n * config: string,\n * filePath: string\n * }|undefined}\n */\nfunction findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName }) {\n const exts = keys(loaderByExt);\n while (exts.length) {\n const ext = exts.shift();\n const configLocation = join(parts, configFileName + ext);\n if (!pathExists.sync(configLocation)) {\n continue;\n }\n const loaders = loaderByExt[ext];\n if (!Array.isArray(loaders)) {\n const loader = loaders;\n const result = loader(configLocation);\n if (!result) {\n continue;\n }\n return {\n config: result,\n filePath: configLocation\n };\n }\n for (let i = 0; i < loaders.length; i++) {\n const loader = loaders[i];\n const result = loader(configLocation, true);\n if (!result) {\n continue;\n }\n return {\n config: result,\n filePath: configLocation\n };\n }\n }\n\n if (packageJSON) {\n const pkgJSONLoc = join(parts, \"package.json\");\n if (pathExists.sync(pkgJSONLoc)) {\n const pkgJSON = require(pkgJSONLoc);\n if (pkgJSON[packageJSONFieldName]) {\n return {\n config: pkgJSON[packageJSONFieldName],\n filePath: pkgJSONLoc\n };\n }\n }\n }\n if (parts.pop()) {\n return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });\n }\n return undefined;\n}\n\nfunction splitPath(x) {\n return path.resolve(x || \"\").split(path.sep);\n}\n\nfunction join(parts, filename) {\n return path.resolve(parts.join(path.sep) + path.sep, filename);\n}\n\nfunction loadJSConfigFile(filePath, suppress) {\n debug(`Loading JavaScript config file: ${filePath}`);\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n return requireFromString(content, filePath);\n } catch (e) {\n debug(`Error reading JavaScript file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n\nfunction loadJSONConfigFile(filePath, suppress) {\n debug(`Loading JSON config file: ${filePath}`);\n\n try {\n return JSON5.parse(readFile(filePath));\n } catch (e) {\n debug(`Error reading JSON file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n\nfunction readFile(filePath) {\n return fs.readFileSync(filePath, \"utf8\");\n}\n\nfunction loadYAMLConfigFile(filePath, suppress) {\n debug(`Loading YAML config file: ${filePath}`);\n\n // lazy load YAML to improve performance when not used\n const yaml = require(\"js-yaml\");\n\n try {\n // empty YAML file can be null, so always use\n return yaml.safeLoad(readFile(filePath)) || {};\n } catch (e) {\n debug(`Error reading YAML file: ${filePath}`);\n if (!suppress) {\n e.message = `Cannot read config file: ${filePath}\\nError: ${e.message}`;\n throw e;\n }\n }\n}\n"],"file":"rc-config-loader.js"}
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "src/"
11
11
  ],
12
12
  "name": "rc-config-loader",
13
- "version": "2.0.3",
13
+ "version": "2.0.4",
14
14
  "description": "load config file from .{product}rc.{json,yml,js}",
15
15
  "main": "lib/rc-config-loader.js",
16
16
  "scripts": {
@@ -18,9 +18,7 @@
18
18
  "build": "cross-env NODE_ENV=production babel src --out-dir lib --copy-files --source-maps",
19
19
  "watch": "babel src --out-dir lib --watch --source-maps",
20
20
  "prepublish": "npm run --if-present build",
21
- "prettier": "prettier --write '**/*.{js,jsx,ts,tsx,css}'",
22
- "precommit": "lint-staged",
23
- "postcommit": "git reset"
21
+ "prettier": "prettier --write '**/*.{js,jsx,ts,tsx,css}'"
24
22
  },
25
23
  "keywords": [
26
24
  "rc",
@@ -40,26 +38,27 @@
40
38
  },
41
39
  "homepage": "https://github.com/azu/rc-config-loader",
42
40
  "dependencies": {
43
- "debug": "^3.1.0",
41
+ "debug": "^4.1.1",
44
42
  "js-yaml": "^3.12.0",
45
- "json5": "^1.0.1",
43
+ "json5": "^2.1.0",
46
44
  "object-assign": "^4.1.0",
47
45
  "object-keys": "^1.0.12",
48
46
  "path-exists": "^3.0.0",
49
47
  "require-from-string": "^2.0.2"
50
48
  },
51
49
  "devDependencies": {
52
- "babel-cli": "^6.22.2",
53
- "babel-preset-jsdoc-to-assert": "^4.0.0",
54
- "babel-preset-latest": "^6.22.0",
55
- "babel-preset-power-assert": "^1.0.0",
56
- "babel-register": "^6.22.0",
57
- "chai": "^3.5.0",
58
- "cross-env": "^3.1.4",
59
- "eslint": "^3.15.0",
60
- "husky": "^0.14.3",
61
- "lint-staged": "^5.0.0",
62
- "mocha": "^3.2.0",
50
+ "@babel/cli": "^7.0.0",
51
+ "@babel/core": "^7.0.0",
52
+ "@babel/preset-env": "^7.0.0",
53
+ "@babel/register": "^7.0.0",
54
+ "babel-preset-jsdoc-to-assert": "^5.0.0",
55
+ "babel-preset-power-assert": "^3.0.0",
56
+ "chai": "^4.2.0",
57
+ "cross-env": "^5.2.0",
58
+ "eslint": "^6.0.1",
59
+ "husky": "^3.0.0",
60
+ "lint-staged": "^9.1.0",
61
+ "mocha": "^6.1.4",
63
62
  "power-assert": "^1.4.2",
64
63
  "prettier": "^1.8.2"
65
64
  },
@@ -72,5 +71,11 @@
72
71
  "prettier --write",
73
72
  "git add"
74
73
  ]
74
+ },
75
+ "husky": {
76
+ "hooks": {
77
+ "post-commit": "git reset",
78
+ "pre-commit": "lint-staged"
79
+ }
75
80
  }
76
81
  }