rc-config-loader 2.0.0 → 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.
package/README.md CHANGED
@@ -11,6 +11,8 @@ Find and load a configuration object from:
11
11
  - a `package.json` property if it is needed
12
12
  - a JSON or YAML, JS "rc file"
13
13
  - `.<product>rc` or `.<product>rc.json` or `.<product>rc.js` or`.<product>rc.yml`, `.<product>rc.yaml`
14
+ - TypeScript support
15
+ - Includes `.d.ts`
14
16
 
15
17
  ## Difference
16
18
 
@@ -22,7 +24,8 @@ Find and load a configuration object from:
22
24
 
23
25
  ### with [cosmiconfig](https://github.com/davidtheclark/cosmiconfig "cosmiconfig")
24
26
 
25
- - Sync loading
27
+ - <del>Sync loading</del>
28
+ - [cosmiconfig@3+](https://github.com/davidtheclark/cosmiconfig/blob/master/CHANGELOG.md#300) support `sync` option
26
29
 
27
30
  ## Install
28
31
 
@@ -51,7 +54,7 @@ export default function rcConfigLoader(packageName: string, options?: rcConfigLo
51
54
  `rcConfigLoader` return `{ config, filePath }` object.
52
55
 
53
56
  - `config`: it is config object
54
- - `filePath`: path to config file
57
+ - `filePath`: absolute path to config file
55
58
 
56
59
  If not found config file, return `undefined`.
57
60
 
@@ -1,11 +1,11 @@
1
1
  export interface rcConfigLoaderOption {
2
2
  // does look for `package.json`
3
- packageJSON?: boolean,
3
+ packageJSON?: boolean;
4
4
  // if config file name is not same with packageName, set the name
5
5
  configFileName?: string;
6
6
  // treat default(no ext file) as some extension
7
- defaultExtension?: string | string[],
7
+ defaultExtension?: string | string[];
8
8
  // where start to load
9
9
  cwd?: string;
10
10
  }
11
- export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
11
+ export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
@@ -3,164 +3,214 @@
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");
10
- var requireUncached = require("require-uncached");
11
+
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
- var emptyConfig = undefined;
17
23
 
18
24
  var defaultLoaderByExt = {
19
- ".js": loadJSConfigFile,
20
- ".json": loadJSONConfigFile,
21
- ".yaml": loadYAMLConfigFile,
22
- ".yml": loadYAMLConfigFile
25
+ ".js": loadJSConfigFile,
26
+ ".json": loadJSONConfigFile,
27
+ ".yaml": loadYAMLConfigFile,
28
+ ".yml": loadYAMLConfigFile
23
29
  };
24
-
25
30
  var defaultOptions = {
26
- // does look for `package.json`
27
- packageJSON: false,
28
- // treat default(no ext file) as some extension
29
- defaultExtension: ".json",
30
- 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()
31
36
  };
32
-
33
37
  /**
34
38
  * @param {string} pkgName
35
39
  * @param {rcConfigLoaderOption} [opts]
36
- * @returns {object}
40
+ * @returns {{ config: Object, filePath:string } | undefined}
37
41
  */
42
+
38
43
  module.exports = function rcConfigLoader(pkgName) {
39
- var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
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
+ });
65
+ };
66
+ /**
67
+ *
68
+ * @param {string[]} parts
69
+ * @param {Object} loaderByExt
70
+ * @param {string} configFileName
71
+ * @param {boolean|Object} packageJSON
72
+ * @param {string} packageJSONFieldName
73
+ * @returns {{
74
+ * config: string,
75
+ * filePath: string
76
+ * }|undefined}
77
+ */
40
78
 
41
- // path/to/config or basename of config file.
42
- var configFileName = opts.configFileName || "." + pkgName + "rc";
43
- var defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
44
- var cwd = opts.cwd || defaultOptions.cwd;
45
- var packageJSON = opts.packageJSON || defaultOptions.packageJSON;
46
- var packageJSONFieldName = (typeof packageJSON === "undefined" ? "undefined" : _typeof(packageJSON)) === "object" ? packageJSON.fieldName : pkgName;
47
79
 
48
- var parts = splitPath(cwd);
80
+ function findConfig(_ref) {
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);
49
87
 
50
- var loaders = Array.isArray(defaultExtension) ? defaultExtension.map(function (extension) {
51
- return defaultLoaderByExt[extension];
52
- }) : defaultLoaderByExt[defaultExtension];
88
+ while (exts.length) {
89
+ var ext = exts.shift();
90
+ var configLocation = join(parts, configFileName + ext);
53
91
 
54
- var loaderByExt = objectAssign({}, defaultLoaderByExt, {
55
- "": loaders
56
- });
92
+ if (!pathExists.sync(configLocation)) {
93
+ continue;
94
+ }
57
95
 
58
- return findConfig(parts);
59
-
60
- /**
61
- * @returns {object} always return object
62
- */
63
- function findConfig() {
64
- var exts = keys(loaderByExt);
65
- while (exts.length) {
66
- var ext = exts.shift();
67
- var configLocation = join(parts, configFileName + ext);
68
- if (!pathExists.sync(configLocation)) {
69
- continue;
70
- }
71
- var _loaders = loaderByExt[ext];
72
- if (!Array.isArray(_loaders)) {
73
- var loader = _loaders;
74
- return {
75
- config: loader(configLocation),
76
- filePath: configLocation
77
- };
78
- }
79
- for (var i = 0; i < _loaders.length; i++) {
80
- var _loader = _loaders[i];
81
- var result = _loader(configLocation, true);
82
- if (result) {
83
- return {
84
- config: result,
85
- filePath: configLocation
86
- };
87
- }
88
- }
89
- }
90
-
91
- if (packageJSON) {
92
- var pkgJSONLoc = join(parts, "package.json");
93
- if (pathExists.sync(pkgJSONLoc)) {
94
- var pkgJSON = require(pkgJSONLoc);
95
- if (pkgJSON[packageJSONFieldName]) {
96
- return {
97
- config: pkgJSON[packageJSONFieldName],
98
- filePath: pkgJSONLoc
99
- };
100
- }
101
- }
102
- }
103
- if (parts.pop()) {
104
- return findConfig();
105
- }
106
- return emptyConfig;
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
+ };
107
110
  }
108
- };
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
+ };
125
+ }
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
+ }
140
+ }
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;
154
+ }
109
155
 
110
156
  function splitPath(x) {
111
- return path.resolve(x || "").split(path.sep);
157
+ return path.resolve(x || "").split(path.sep);
112
158
  }
113
159
 
114
160
  function join(parts, filename) {
115
- return path.resolve(parts.join(path.sep) + path.sep, filename);
161
+ return path.resolve(parts.join(path.sep) + path.sep, filename);
116
162
  }
117
163
 
118
164
  function loadJSConfigFile(filePath, suppress) {
119
- debug("Loading JS config file: " + filePath);
120
- try {
121
- return requireUncached(filePath);
122
- } catch (e) {
123
- debug("Error reading JavaScript file: " + filePath);
124
- if (!suppress) {
125
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
126
- throw e;
127
- }
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;
128
176
  }
177
+ }
129
178
  }
130
179
 
131
180
  function loadJSONConfigFile(filePath, suppress) {
132
- debug("Loading JSON config file: " + filePath);
133
-
134
- try {
135
- return JSON5.parse(readFile(filePath));
136
- } catch (e) {
137
- debug("Error reading JSON file: " + filePath);
138
- if (!suppress) {
139
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
140
- throw e;
141
- }
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;
142
191
  }
192
+ }
143
193
  }
144
194
 
145
195
  function readFile(filePath) {
146
- return fs.readFileSync(filePath, "utf8");
196
+ return fs.readFileSync(filePath, "utf8");
147
197
  }
148
198
 
149
199
  function loadYAMLConfigFile(filePath, suppress) {
150
- debug("Loading YAML config file: " + filePath);
151
-
152
- // lazy load YAML to improve performance when not used
153
- var yaml = require("js-yaml");
154
-
155
- try {
156
- // empty YAML file can be null, so always use
157
- return yaml.safeLoad(readFile(filePath)) || {};
158
- } catch (e) {
159
- debug("Error reading YAML file: " + filePath);
160
- if (!suppress) {
161
- e.message = "Cannot read config file: " + filePath + "\nError: " + e.message;
162
- throw e;
163
- }
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;
164
213
  }
214
+ }
165
215
  }
166
216
  //# sourceMappingURL=rc-config-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rc-config-loader.js"],"names":["path","require","debug","requireUncached","JSON5","fs","pathExists","objectAssign","keys","emptyConfig","undefined","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","config","filePath","i","result","pkgJSONLoc","pkgJSON","pop","x","resolve","split","sep","filename","suppress","e","message","parse","readFile","readFileSync","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 requireUncached = require(\"require-uncached\");\nconst JSON5 = require(\"json5\");\nconst fs = require(\"fs\");\nconst pathExists = require(\"path-exists\");\nconst objectAssign = require(\"object-assign\");\nconst keys = require(\"object-keys\");\nconst emptyConfig = undefined;\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\",\n cwd: process.cwd()\n};\n\n/**\n * @param {string} pkgName\n * @param {rcConfigLoaderOption} [opts]\n * @returns {object}\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\"\n ? packageJSON.fieldName\n : 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);\n\n /**\n * @returns {object} always return object\n */\n function findConfig() {\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 return {\n config: loader(configLocation),\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 return {\n config: result,\n filePath: configLocation\n };\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();\n }\n return emptyConfig;\n }\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 JS config file: ${filePath}`);\n try {\n return requireUncached(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,14 +10,15 @@
10
10
  "src/"
11
11
  ],
12
12
  "name": "rc-config-loader",
13
- "version": "2.0.0",
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": {
17
17
  "test": "mocha test/",
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
- "prepublish": "npm run --if-present build"
20
+ "prepublish": "npm run --if-present build",
21
+ "prettier": "prettier --write '**/*.{js,jsx,ts,tsx,css}'"
21
22
  },
22
23
  "keywords": [
23
24
  "rc",
@@ -37,24 +38,44 @@
37
38
  },
38
39
  "homepage": "https://github.com/azu/rc-config-loader",
39
40
  "dependencies": {
40
- "debug": "^2.2.0",
41
- "js-yaml": "^3.6.1",
42
- "json5": "^0.5.0",
41
+ "debug": "^4.1.1",
42
+ "js-yaml": "^3.12.0",
43
+ "json5": "^2.1.0",
43
44
  "object-assign": "^4.1.0",
44
- "object-keys": "^1.0.9",
45
- "path-exists": "^2.1.0",
46
- "require-uncached": "^1.0.3"
45
+ "object-keys": "^1.0.12",
46
+ "path-exists": "^3.0.0",
47
+ "require-from-string": "^2.0.2"
47
48
  },
48
49
  "devDependencies": {
49
- "babel-cli": "^6.22.2",
50
- "babel-preset-jsdoc-to-assert": "^4.0.0",
51
- "babel-preset-latest": "^6.22.0",
52
- "babel-preset-power-assert": "^1.0.0",
53
- "babel-register": "^6.22.0",
54
- "chai": "^3.5.0",
55
- "cross-env": "^3.1.4",
56
- "eslint": "^3.15.0",
57
- "mocha": "^3.2.0",
58
- "power-assert": "^1.4.2"
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",
62
+ "power-assert": "^1.4.2",
63
+ "prettier": "^1.8.2"
64
+ },
65
+ "prettier": {
66
+ "printWidth": 120,
67
+ "tabWidth": 4
68
+ },
69
+ "lint-staged": {
70
+ "*.{js,jsx,ts,tsx,css}": [
71
+ "prettier --write",
72
+ "git add"
73
+ ]
74
+ },
75
+ "husky": {
76
+ "hooks": {
77
+ "post-commit": "git reset",
78
+ "pre-commit": "lint-staged"
79
+ }
59
80
  }
60
81
  }
@@ -1,11 +1,11 @@
1
1
  export interface rcConfigLoaderOption {
2
2
  // does look for `package.json`
3
- packageJSON?: boolean,
3
+ packageJSON?: boolean;
4
4
  // if config file name is not same with packageName, set the name
5
5
  configFileName?: string;
6
6
  // treat default(no ext file) as some extension
7
- defaultExtension?: string | string[],
7
+ defaultExtension?: string | string[];
8
8
  // where start to load
9
9
  cwd?: string;
10
10
  }
11
- export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
11
+ export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
@@ -4,33 +4,32 @@
4
4
  "use strict";
5
5
  const path = require("path");
6
6
  const debug = require("debug")("rc-config-loader");
7
- const requireUncached = require("require-uncached");
7
+ const requireFromString = require("require-from-string");
8
8
  const JSON5 = require("json5");
9
9
  const fs = require("fs");
10
10
  const pathExists = require("path-exists");
11
11
  const objectAssign = require("object-assign");
12
12
  const keys = require("object-keys");
13
- const emptyConfig = undefined;
14
13
 
15
14
  const defaultLoaderByExt = {
16
15
  ".js": loadJSConfigFile,
17
16
  ".json": loadJSONConfigFile,
18
17
  ".yaml": loadYAMLConfigFile,
19
- ".yml": loadYAMLConfigFile,
18
+ ".yml": loadYAMLConfigFile
20
19
  };
21
20
 
22
21
  const defaultOptions = {
23
22
  // does look for `package.json`
24
23
  packageJSON: false,
25
24
  // treat default(no ext file) as some extension
26
- defaultExtension: ".json",
25
+ defaultExtension: [".json", ".yaml", ".yml", ".js"],
27
26
  cwd: process.cwd()
28
27
  };
29
28
 
30
29
  /**
31
30
  * @param {string} pkgName
32
31
  * @param {rcConfigLoaderOption} [opts]
33
- * @returns {object}
32
+ * @returns {{ config: Object, filePath:string } | undefined}
34
33
  */
35
34
  module.exports = function rcConfigLoader(pkgName, opts = {}) {
36
35
  // path/to/config or basename of config file.
@@ -38,71 +37,83 @@ module.exports = function rcConfigLoader(pkgName, opts = {}) {
38
37
  const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
39
38
  const cwd = opts.cwd || defaultOptions.cwd;
40
39
  const packageJSON = opts.packageJSON || defaultOptions.packageJSON;
41
- const packageJSONFieldName = typeof packageJSON === "object"
42
- ? packageJSON.fieldName
43
- : pkgName;
40
+ const packageJSONFieldName = typeof packageJSON === "object" ? packageJSON.fieldName : pkgName;
44
41
 
45
42
  const parts = splitPath(cwd);
46
43
 
47
44
  const loaders = Array.isArray(defaultExtension)
48
- ? defaultExtension.map((extension) => defaultLoaderByExt[extension])
45
+ ? defaultExtension.map(extension => defaultLoaderByExt[extension])
49
46
  : defaultLoaderByExt[defaultExtension];
50
47
 
51
48
  const loaderByExt = objectAssign({}, defaultLoaderByExt, {
52
- "": loaders,
49
+ "": loaders
53
50
  });
54
51
 
55
- return findConfig(parts);
56
-
57
- /**
58
- * @returns {object} always return object
59
- */
60
- function findConfig() {
61
- const exts = keys(loaderByExt);
62
- while (exts.length) {
63
- const ext = exts.shift();
64
- const configLocation = join(parts, configFileName + ext);
65
- if (!pathExists.sync(configLocation)) {
52
+ return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });
53
+ };
54
+
55
+ /**
56
+ *
57
+ * @param {string[]} parts
58
+ * @param {Object} loaderByExt
59
+ * @param {string} configFileName
60
+ * @param {boolean|Object} packageJSON
61
+ * @param {string} packageJSONFieldName
62
+ * @returns {{
63
+ * config: string,
64
+ * filePath: string
65
+ * }|undefined}
66
+ */
67
+ function findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName }) {
68
+ const exts = keys(loaderByExt);
69
+ while (exts.length) {
70
+ const ext = exts.shift();
71
+ const configLocation = join(parts, configFileName + ext);
72
+ if (!pathExists.sync(configLocation)) {
73
+ continue;
74
+ }
75
+ const loaders = loaderByExt[ext];
76
+ if (!Array.isArray(loaders)) {
77
+ const loader = loaders;
78
+ const result = loader(configLocation);
79
+ if (!result) {
66
80
  continue;
67
81
  }
68
- const loaders = loaderByExt[ext];
69
- if (!Array.isArray(loaders)) {
70
- const loader = loaders;
71
- return {
72
- config: loader(configLocation),
73
- filePath: configLocation
74
- };
75
- }
76
- for (let i = 0; i < loaders.length; i++) {
77
- const loader = loaders[i];
78
- const result = loader(configLocation, true);
79
- if (result) {
80
- return {
81
- config: result,
82
- filePath: configLocation
83
- };
84
- }
82
+ return {
83
+ config: result,
84
+ filePath: configLocation
85
+ };
86
+ }
87
+ for (let i = 0; i < loaders.length; i++) {
88
+ const loader = loaders[i];
89
+ const result = loader(configLocation, true);
90
+ if (!result) {
91
+ continue;
85
92
  }
93
+ return {
94
+ config: result,
95
+ filePath: configLocation
96
+ };
86
97
  }
98
+ }
87
99
 
88
- if (packageJSON) {
89
- const pkgJSONLoc = join(parts, "package.json");
90
- if (pathExists.sync(pkgJSONLoc)) {
91
- const pkgJSON = require(pkgJSONLoc);
92
- if (pkgJSON[packageJSONFieldName]) {
93
- return {
94
- config: pkgJSON[packageJSONFieldName],
95
- filePath: pkgJSONLoc
96
- };
97
- }
100
+ if (packageJSON) {
101
+ const pkgJSONLoc = join(parts, "package.json");
102
+ if (pathExists.sync(pkgJSONLoc)) {
103
+ const pkgJSON = require(pkgJSONLoc);
104
+ if (pkgJSON[packageJSONFieldName]) {
105
+ return {
106
+ config: pkgJSON[packageJSONFieldName],
107
+ filePath: pkgJSONLoc
108
+ };
98
109
  }
99
110
  }
100
- if (parts.pop()) {
101
- return findConfig();
102
- }
103
- return emptyConfig;
104
111
  }
105
- };
112
+ if (parts.pop()) {
113
+ return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });
114
+ }
115
+ return undefined;
116
+ }
106
117
 
107
118
  function splitPath(x) {
108
119
  return path.resolve(x || "").split(path.sep);
@@ -113,9 +124,10 @@ function join(parts, filename) {
113
124
  }
114
125
 
115
126
  function loadJSConfigFile(filePath, suppress) {
116
- debug(`Loading JS config file: ${filePath}`);
127
+ debug(`Loading JavaScript config file: ${filePath}`);
117
128
  try {
118
- return requireUncached(filePath);
129
+ const content = fs.readFileSync(filePath, "utf-8");
130
+ return requireFromString(content, filePath);
119
131
  } catch (e) {
120
132
  debug(`Error reading JavaScript file: ${filePath}`);
121
133
  if (!suppress) {