rc-config-loader 2.0.5 → 4.1.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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # rc-config-loader [![Build Status](https://travis-ci.org/azu/rc-config-loader.svg?branch=master)](https://travis-ci.org/azu/rc-config-loader)
1
+ # rc-config-loader [![Actions Status: test](https://github.com/azu/rc-config-loader/workflows/test/badge.svg)](https://github.com/azu/rc-config-loader/actions?query=workflow%3A"test")
2
2
 
3
3
  Load config from `.{product}rc.{json,yml,js}` file.
4
4
 
@@ -26,6 +26,10 @@ Find and load a configuration object from:
26
26
 
27
27
  - <del>Sync loading</del>
28
28
  - [cosmiconfig@3+](https://github.com/davidtheclark/cosmiconfig/blob/master/CHANGELOG.md#300) support `sync` option
29
+ - <del>Built-in TypeScript support</del>
30
+ - [comisconfig@6*](https://github.com/davidtheclark/cosmiconfig/blob/master/CHANGELOG.md#600) is written by TypeScript
31
+
32
+ If you want to async support and customize loader, recommended to use [cosmiconfig](https://github.com/davidtheclark/cosmiconfig).
29
33
 
30
34
  ## Install
31
35
 
@@ -40,9 +44,11 @@ Install with [npm](https://www.npmjs.com/):
40
44
  ```ts
41
45
  export interface rcConfigLoaderOption {
42
46
  // does look for `package.json`
43
- packageJSON?: boolean | {
44
- fieldName: string;
45
- };
47
+ packageJSON?:
48
+ | boolean
49
+ | {
50
+ fieldName: string;
51
+ };
46
52
  // if config file name is not same with packageName, set the name
47
53
  configFileName?: string;
48
54
  // treat default(no ext file) as some extension
@@ -50,26 +56,71 @@ export interface rcConfigLoaderOption {
50
56
  // where start to load
51
57
  cwd?: string;
52
58
  }
53
- export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
59
+ /**
60
+ * Find and load rcfile, return { config, filePath }
61
+ * If not found any rcfile, throw an Error.
62
+ * @param {string} pkgName
63
+ * @param {rcConfigLoaderOption} [opts]
64
+ * @returns {{ config: Object, filePath:string } | undefined}
65
+ */
66
+ export declare function rcFile<R extends {}>(pkgName: string, opts?: rcConfigLoaderOption): {
67
+ config: R;
68
+ filePath: string;
69
+ } | undefined;
70
+
54
71
  ```
55
72
 
56
- `rcConfigLoader` return `{ config, filePath }` object.
73
+ `rcFile` return `{ config, filePath }` object.
57
74
 
58
75
  - `config`: it is config object
59
76
  - `filePath`: absolute path to config file
60
77
 
61
- If not found config file, return `undefined`.
78
+ **Note:**
79
+
80
+ - `rcFile` function return `undefined` if the config file is not found
81
+ - `rcFile` throw an Error if the config file content is malformed (causing a parsing error)
82
+
83
+ Recommenced usage:
84
+
85
+ ```js
86
+ import { rcFile } from "rc-config-loader"
87
+
88
+ function loadRcFile(rcFileName){
89
+ try {
90
+ const results = rcFile(rcFileName);
91
+ // Not Found
92
+ if (!results) {
93
+ return {};
94
+ }
95
+ return results.config;
96
+ } catch (error) {
97
+ // Found it, but it is parsing error
98
+ return {} ; // default value
99
+ }
100
+ }
101
+ // load config
102
+ const config = loadRcFile("your-application");
103
+ console.log(config); // => rcfile content
104
+ ```
105
+
106
+ It will check these files and return config file if found it.
107
+
108
+ - `.your-applicationrc.json`
109
+ - `.your-applicationrc.yml`
110
+ - `.your-applicationrc.yaml`
111
+ - `.your-applicationrc.js`
112
+ - [optional] `package.json`
113
+ - if `packageJSON` option is enabled
62
114
 
63
115
  ### Example
64
116
 
65
117
  ```js
66
- "use strict";
67
- const rcfile = require("rc-config-loader");
118
+ import { rcFile } from "rc-config-loader"
68
119
  // load .eslintrc from current dir
69
- console.log(rcfile("eslint"));
120
+ console.log(rcFile("eslint"));
70
121
 
71
122
  // load .eslintrc from specific path
72
- console.log(rcfile("eslint", {
123
+ console.log(rcFile("eslint", {
73
124
  configFileName: `${__dirname}/test/fixtures/.eslintrc`
74
125
  }));
75
126
  /*
@@ -80,8 +131,8 @@ config: { extends: 'standard',
80
131
  filePath: ${__dirname}/test/fixtures/.eslintrc
81
132
  */
82
133
 
83
- // load property from pacakge.json
84
- console.log(rcfile("rc-config-loader", {
134
+ // load property from package.json
135
+ console.log(rcFile("rc-config-loader", {
85
136
  packageJSON: {
86
137
  fieldName: "directories"
87
138
  }
@@ -92,27 +143,30 @@ filePath: /path/to/package.json
92
143
  */
93
144
 
94
145
  // load .eslintrc from specific dir
95
- console.log(rcfile("eslint", {
146
+ console.log(rcFile("eslint", {
96
147
  cwd: `${__dirname}/test/fixtures`
97
148
  }));
98
149
 
99
150
  // load specific filename from current dir
100
- console.log(rcfile("travis", {configFileName: ".travis"}));
151
+ console.log(rcFile("travis", {configFileName: ".travis"}));
101
152
  /*
102
153
  config: { sudo: false, language: 'node_js', node_js: 'stable' }
103
154
  filePath: /path/to/.travis
104
155
  */
105
156
 
106
157
  // try to load as .json, .yml, js
107
- console.log(rcfile("bar", {
158
+ console.log(rcFile("bar", {
108
159
  configFileName: `${__dirname}/test/fixtures/.barrc`,
109
160
  defaultExtension: [".json", ".yml", ".js"]
110
161
  }));
111
162
 
163
+ // try to load as foobar, but .foobarrc is not found
164
+ console.log(rcFile("foorbar")); // => undefined
165
+
112
166
  // try to load as .json, but it is not json
113
- // throw Error
167
+ // throw SyntaxError
114
168
  try {
115
- rcfile("unknown", {
169
+ rcFile("unknown", {
116
170
  // This is not json
117
171
  configFileName: `${__dirname}/test/fixtures/.unknownrc`,
118
172
  defaultExtension: ".json"
@@ -123,7 +177,6 @@ try {
123
177
  SyntaxError: Cannot read config file: /test/fixtures/.unknownrc
124
178
  */
125
179
  }
126
-
127
180
  ```
128
181
 
129
182
  ## Users
@@ -1,15 +1,19 @@
1
1
  export interface rcConfigLoaderOption {
2
- // does look for `package.json`
3
- packageJSON?:
4
- | boolean
5
- | {
6
- fieldName: string;
7
- };
8
- // if config file name is not same with packageName, set the name
2
+ packageJSON?: boolean | {
3
+ fieldName: string;
4
+ };
9
5
  configFileName?: string;
10
- // treat default(no ext file) as some extension
11
6
  defaultExtension?: string | string[];
12
- // where start to load
13
7
  cwd?: string;
14
8
  }
15
- export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
9
+ /**
10
+ * Find and load rcfile, return { config, filePath }
11
+ * If not found any rcfile, throw an Error.
12
+ * @param {string} pkgName
13
+ * @param {rcConfigLoaderOption} [opts]
14
+ * @returns {{ config: Object, filePath:string } | undefined}
15
+ */
16
+ export declare function rcFile<R extends {}>(pkgName: string, opts?: rcConfigLoaderOption): {
17
+ config: R;
18
+ filePath: string;
19
+ } | undefined;
@@ -1,216 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.rcFile = void 0;
1
7
  // MIT © 2017 azu
2
8
  // MIT © Zoltan Kochan
3
9
  // Original https://github.com/zkochan/rcfile
4
- "use strict";
5
-
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
-
8
- var path = require("path");
9
-
10
- var debug = require("debug")("rc-config-loader");
11
-
12
- var requireFromString = require("require-from-string");
13
-
14
- var JSON5 = require("json5");
15
-
16
- var fs = require("fs");
17
-
18
- var pathExists = require("path-exists");
19
-
20
- var objectAssign = require("object-assign");
21
-
22
- var keys = require("object-keys");
23
-
24
- var defaultLoaderByExt = {
25
- ".js": loadJSConfigFile,
26
- ".json": loadJSONConfigFile,
27
- ".yaml": loadYAMLConfigFile,
28
- ".yml": loadYAMLConfigFile
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const require_from_string_1 = __importDefault(require("require-from-string"));
13
+ const json5_1 = __importDefault(require("json5"));
14
+ const debug = require("debug")("rc-config-loader");
15
+ const defaultLoaderByExt = {
16
+ ".cjs": loadJSConfigFile,
17
+ ".js": loadJSConfigFile,
18
+ ".json": loadJSONConfigFile,
19
+ ".yaml": loadYAMLConfigFile,
20
+ ".yml": loadYAMLConfigFile,
29
21
  };
30
- var defaultOptions = {
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()
22
+ const defaultOptions = {
23
+ // does look for `package.json`
24
+ packageJSON: false,
25
+ // treat default(no ext file) as some extension
26
+ defaultExtension: [".json", ".yaml", ".yml", ".js", ".cjs"],
27
+ cwd: process.cwd(),
28
+ };
29
+ const selectLoader = (defaultLoaderByExt, extension) => {
30
+ if (!defaultOptions.defaultExtension.includes(extension)) {
31
+ throw new Error(`${extension} is not supported.`);
32
+ }
33
+ return defaultLoaderByExt[extension];
36
34
  };
37
35
  /**
36
+ * Find and load rcfile, return { config, filePath }
37
+ * If not found any rcfile, throw an Error.
38
38
  * @param {string} pkgName
39
39
  * @param {rcConfigLoaderOption} [opts]
40
40
  * @returns {{ config: Object, filePath:string } | undefined}
41
41
  */
42
-
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
- });
65
- };
42
+ function rcFile(pkgName, opts = {}) {
43
+ // path/to/config or basename of config file.
44
+ const configFileName = opts.configFileName || `.${pkgName}rc`;
45
+ const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
46
+ const cwd = opts.cwd || defaultOptions.cwd;
47
+ const packageJSON = opts.packageJSON || defaultOptions.packageJSON;
48
+ const packageJSONFieldName = typeof packageJSON === "object" ? packageJSON.fieldName : pkgName;
49
+ const parts = splitPath(cwd);
50
+ const loadersByOrder = Array.isArray(defaultExtension)
51
+ ? defaultExtension.map((extension) => selectLoader(defaultLoaderByExt, extension))
52
+ : selectLoader(defaultLoaderByExt, defaultExtension);
53
+ const loaderByExt = Object.assign(Object.assign({}, defaultLoaderByExt), { "": loadersByOrder });
54
+ return findConfig({
55
+ parts,
56
+ loaderByExt,
57
+ loadersByOrder,
58
+ configFileName,
59
+ packageJSON,
60
+ packageJSONFieldName,
61
+ });
62
+ }
63
+ exports.rcFile = rcFile;
66
64
  /**
67
65
  *
68
- * @param {string[]} parts
69
- * @param {Object} loaderByExt
70
- * @param {string} configFileName
71
- * @param {boolean|Object} packageJSON
72
- * @param {string} packageJSONFieldName
73
66
  * @returns {{
74
67
  * config: string,
75
68
  * filePath: string
76
- * }|undefined}
69
+ * }}
77
70
  */
78
-
79
-
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);
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;
71
+ function findConfig({ parts, loaderByExt, loadersByOrder, configFileName, packageJSON, packageJSONFieldName, }) {
72
+ const extensions = Object.keys(loaderByExt);
73
+ while (extensions.length) {
74
+ const ext = extensions.shift();
75
+ // may be ext is "". if it .<product>rc
76
+ const configLocation = join(parts, configFileName + ext);
77
+ if (!fs_1.default.existsSync(configLocation)) {
78
+ continue;
79
+ }
80
+ // if ext === ""(empty string):, use ordered loaders
81
+ const loaders = ext ? loaderByExt[ext] : loadersByOrder;
82
+ if (!Array.isArray(loaders)) {
83
+ const loader = loaders;
84
+ const result = loader(configLocation, false);
85
+ if (!result) {
86
+ continue;
87
+ }
88
+ return {
89
+ config: result,
90
+ filePath: configLocation,
91
+ };
92
+ }
93
+ for (let i = 0; i < loaders.length; i++) {
94
+ const loader = loaders[i];
95
+ const result = loader(configLocation, true);
96
+ if (!result) {
97
+ continue;
98
+ }
99
+ return {
100
+ config: result,
101
+ filePath: configLocation,
102
+ };
103
+ }
94
104
  }
95
-
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
- };
105
+ if (packageJSON) {
106
+ const pkgJSONLoc = join(parts, "package.json");
107
+ if (fs_1.default.existsSync(pkgJSONLoc)) {
108
+ const pkgJSON = require(pkgJSONLoc);
109
+ if (pkgJSON[packageJSONFieldName]) {
110
+ return {
111
+ config: pkgJSON[packageJSONFieldName],
112
+ filePath: pkgJSONLoc,
113
+ };
114
+ }
115
+ }
110
116
  }
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
- };
117
+ if (parts.pop()) {
118
+ return findConfig({ parts, loaderByExt, loadersByOrder, configFileName, packageJSON, packageJSONFieldName });
125
119
  }
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;
120
+ return;
154
121
  }
155
-
156
122
  function splitPath(x) {
157
- return path.resolve(x || "").split(path.sep);
123
+ return path_1.default.resolve(x || "").split(path_1.default.sep);
158
124
  }
159
-
160
125
  function join(parts, filename) {
161
- return path.resolve(parts.join(path.sep) + path.sep, filename);
126
+ return path_1.default.resolve(parts.join(path_1.default.sep) + path_1.default.sep, filename);
162
127
  }
163
-
164
128
  function loadJSConfigFile(filePath, suppress) {
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;
129
+ debug(`Loading JavaScript config file: ${filePath}`);
130
+ try {
131
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
132
+ return require_from_string_1.default(content, filePath);
133
+ }
134
+ catch (error) {
135
+ debug(`Error reading JavaScript file: ${filePath}`);
136
+ if (!suppress) {
137
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
138
+ throw error;
139
+ }
176
140
  }
177
- }
178
141
  }
179
-
180
142
  function loadJSONConfigFile(filePath, suppress) {
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;
143
+ debug(`Loading JSON config file: ${filePath}`);
144
+ try {
145
+ return json5_1.default.parse(readFile(filePath));
146
+ }
147
+ catch (error) {
148
+ debug(`Error reading JSON file: ${filePath}`);
149
+ if (!suppress) {
150
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
151
+ throw error;
152
+ }
191
153
  }
192
- }
193
154
  }
194
-
195
155
  function readFile(filePath) {
196
- return fs.readFileSync(filePath, "utf8");
156
+ return fs_1.default.readFileSync(filePath, "utf8");
197
157
  }
198
-
199
158
  function loadYAMLConfigFile(filePath, suppress) {
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;
159
+ debug(`Loading YAML config file: ${filePath}`);
160
+ // lazy load YAML to improve performance when not used
161
+ const yaml = require("js-yaml");
162
+ try {
163
+ // empty YAML file can be null, so always use
164
+ return yaml.load(readFile(filePath)) || {};
165
+ }
166
+ catch (error) {
167
+ debug(`Error reading YAML file: ${filePath}`);
168
+ if (!suppress) {
169
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
170
+ throw error;
171
+ }
213
172
  }
214
- }
215
173
  }
216
174
  //# 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":"AAAA;AACA;AACA;AACA;;;;AACA,IAAMA,IAAI,GAAGC,OAAO,CAAC,MAAD,CAApB;;AACA,IAAMC,KAAK,GAAGD,OAAO,CAAC,OAAD,CAAP,CAAiB,kBAAjB,CAAd;;AACA,IAAME,iBAAiB,GAAGF,OAAO,CAAC,qBAAD,CAAjC;;AACA,IAAMG,KAAK,GAAGH,OAAO,CAAC,OAAD,CAArB;;AACA,IAAMI,EAAE,GAAGJ,OAAO,CAAC,IAAD,CAAlB;;AACA,IAAMK,UAAU,GAAGL,OAAO,CAAC,aAAD,CAA1B;;AACA,IAAMM,YAAY,GAAGN,OAAO,CAAC,eAAD,CAA5B;;AACA,IAAMO,IAAI,GAAGP,OAAO,CAAC,aAAD,CAApB;;AAEA,IAAMQ,kBAAkB,GAAG;AACvB,SAAOC,gBADgB;AAEvB,WAASC,kBAFc;AAGvB,WAASC,kBAHc;AAIvB,UAAQA;AAJe,CAA3B;AAOA,IAAMC,cAAc,GAAG;AACnB;AACAC,EAAAA,WAAW,EAAE,KAFM;AAGnB;AACAC,EAAAA,gBAAgB,EAAE,CAAC,OAAD,EAAU,OAAV,EAAmB,MAAnB,EAA2B,KAA3B,CAJC;AAKnBC,EAAAA,GAAG,EAAEC,OAAO,CAACD,GAAR;AALc,CAAvB;AAQA;;;;;;AAKAE,MAAM,CAACC,OAAP,GAAiB,SAASC,cAAT,CAAwBC,OAAxB,EAA4C;AAAA,MAAXC,IAAW,uEAAJ,EAAI;AACzD;AACA,MAAMC,cAAc,GAAGD,IAAI,CAACC,cAAL,eAA2BF,OAA3B,OAAvB;AACA,MAAMN,gBAAgB,GAAGO,IAAI,CAACP,gBAAL,IAAyBF,cAAc,CAACE,gBAAjE;AACA,MAAMC,GAAG,GAAGM,IAAI,CAACN,GAAL,IAAYH,cAAc,CAACG,GAAvC;AACA,MAAMF,WAAW,GAAGQ,IAAI,CAACR,WAAL,IAAoBD,cAAc,CAACC,WAAvD;AACA,MAAMU,oBAAoB,GAAG,QAAOV,WAAP,MAAuB,QAAvB,GAAkCA,WAAW,CAACW,SAA9C,GAA0DJ,OAAvF;AAEA,MAAMK,KAAK,GAAGC,SAAS,CAACX,GAAD,CAAvB;AAEA,MAAMY,OAAO,GAAGC,KAAK,CAACC,OAAN,CAAcf,gBAAd,IACVA,gBAAgB,CAACgB,GAAjB,CAAqB,UAAAC,SAAS;AAAA,WAAIvB,kBAAkB,CAACuB,SAAD,CAAtB;AAAA,GAA9B,CADU,GAEVvB,kBAAkB,CAACM,gBAAD,CAFxB;AAIA,MAAMkB,WAAW,GAAG1B,YAAY,CAAC,EAAD,EAAKE,kBAAL,EAAyB;AACrD,QAAImB;AADiD,GAAzB,CAAhC;AAIA,SAAOM,UAAU,CAAC;AAAER,IAAAA,KAAK,EAALA,KAAF;AAASO,IAAAA,WAAW,EAAXA,WAAT;AAAsBV,IAAAA,cAAc,EAAdA,cAAtB;AAAsCT,IAAAA,WAAW,EAAXA,WAAtC;AAAmDU,IAAAA,oBAAoB,EAApBA;AAAnD,GAAD,CAAjB;AACH,CAnBD;AAqBA;;;;;;;;;;;;;;AAYA,SAASU,UAAT,OAA+F;AAAA,MAAzER,KAAyE,QAAzEA,KAAyE;AAAA,MAAlEO,WAAkE,QAAlEA,WAAkE;AAAA,MAArDV,cAAqD,QAArDA,cAAqD;AAAA,MAArCT,WAAqC,QAArCA,WAAqC;AAAA,MAAxBU,oBAAwB,QAAxBA,oBAAwB;AAC3F,MAAMW,IAAI,GAAG3B,IAAI,CAACyB,WAAD,CAAjB;;AACA,SAAOE,IAAI,CAACC,MAAZ,EAAoB;AAChB,QAAMC,GAAG,GAAGF,IAAI,CAACG,KAAL,EAAZ;AACA,QAAMC,cAAc,GAAGC,IAAI,CAACd,KAAD,EAAQH,cAAc,GAAGc,GAAzB,CAA3B;;AACA,QAAI,CAAC/B,UAAU,CAACmC,IAAX,CAAgBF,cAAhB,CAAL,EAAsC;AAClC;AACH;;AACD,QAAMX,OAAO,GAAGK,WAAW,CAACI,GAAD,CAA3B;;AACA,QAAI,CAACR,KAAK,CAACC,OAAN,CAAcF,OAAd,CAAL,EAA6B;AACzB,UAAMc,MAAM,GAAGd,OAAf;AACA,UAAMe,MAAM,GAAGD,MAAM,CAACH,cAAD,CAArB;;AACA,UAAI,CAACI,MAAL,EAAa;AACT;AACH;;AACD,aAAO;AACHC,QAAAA,MAAM,EAAED,MADL;AAEHE,QAAAA,QAAQ,EAAEN;AAFP,OAAP;AAIH;;AACD,SAAK,IAAIO,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGlB,OAAO,CAACQ,MAA5B,EAAoCU,CAAC,EAArC,EAAyC;AACrC,UAAMJ,OAAM,GAAGd,OAAO,CAACkB,CAAD,CAAtB;;AACA,UAAMH,OAAM,GAAGD,OAAM,CAACH,cAAD,EAAiB,IAAjB,CAArB;;AACA,UAAI,CAACI,OAAL,EAAa;AACT;AACH;;AACD,aAAO;AACHC,QAAAA,MAAM,EAAED,OADL;AAEHE,QAAAA,QAAQ,EAAEN;AAFP,OAAP;AAIH;AACJ;;AAED,MAAIzB,WAAJ,EAAiB;AACb,QAAMiC,UAAU,GAAGP,IAAI,CAACd,KAAD,EAAQ,cAAR,CAAvB;;AACA,QAAIpB,UAAU,CAACmC,IAAX,CAAgBM,UAAhB,CAAJ,EAAiC;AAC7B,UAAMC,OAAO,GAAG/C,OAAO,CAAC8C,UAAD,CAAvB;;AACA,UAAIC,OAAO,CAACxB,oBAAD,CAAX,EAAmC;AAC/B,eAAO;AACHoB,UAAAA,MAAM,EAAEI,OAAO,CAACxB,oBAAD,CADZ;AAEHqB,UAAAA,QAAQ,EAAEE;AAFP,SAAP;AAIH;AACJ;AACJ;;AACD,MAAIrB,KAAK,CAACuB,GAAN,EAAJ,EAAiB;AACb,WAAOf,UAAU,CAAC;AAAER,MAAAA,KAAK,EAALA,KAAF;AAASO,MAAAA,WAAW,EAAXA,WAAT;AAAsBV,MAAAA,cAAc,EAAdA,cAAtB;AAAsCT,MAAAA,WAAW,EAAXA,WAAtC;AAAmDU,MAAAA,oBAAoB,EAApBA;AAAnD,KAAD,CAAjB;AACH;;AACD,SAAO0B,SAAP;AACH;;AAED,SAASvB,SAAT,CAAmBwB,CAAnB,EAAsB;AAClB,SAAOnD,IAAI,CAACoD,OAAL,CAAaD,CAAC,IAAI,EAAlB,EAAsBE,KAAtB,CAA4BrD,IAAI,CAACsD,GAAjC,CAAP;AACH;;AAED,SAASd,IAAT,CAAcd,KAAd,EAAqB6B,QAArB,EAA+B;AAC3B,SAAOvD,IAAI,CAACoD,OAAL,CAAa1B,KAAK,CAACc,IAAN,CAAWxC,IAAI,CAACsD,GAAhB,IAAuBtD,IAAI,CAACsD,GAAzC,EAA8CC,QAA9C,CAAP;AACH;;AAED,SAAS7C,gBAAT,CAA0BmC,QAA1B,EAAoCW,QAApC,EAA8C;AAC1CtD,EAAAA,KAAK,2CAAoC2C,QAApC,EAAL;;AACA,MAAI;AACA,QAAMY,OAAO,GAAGpD,EAAE,CAACqD,YAAH,CAAgBb,QAAhB,EAA0B,OAA1B,CAAhB;AACA,WAAO1C,iBAAiB,CAACsD,OAAD,EAAUZ,QAAV,CAAxB;AACH,GAHD,CAGE,OAAOc,CAAP,EAAU;AACRzD,IAAAA,KAAK,0CAAmC2C,QAAnC,EAAL;;AACA,QAAI,CAACW,QAAL,EAAe;AACXG,MAAAA,CAAC,CAACC,OAAF,sCAAwCf,QAAxC,sBAA4Dc,CAAC,CAACC,OAA9D;AACA,YAAMD,CAAN;AACH;AACJ;AACJ;;AAED,SAAShD,kBAAT,CAA4BkC,QAA5B,EAAsCW,QAAtC,EAAgD;AAC5CtD,EAAAA,KAAK,qCAA8B2C,QAA9B,EAAL;;AAEA,MAAI;AACA,WAAOzC,KAAK,CAACyD,KAAN,CAAYC,QAAQ,CAACjB,QAAD,CAApB,CAAP;AACH,GAFD,CAEE,OAAOc,CAAP,EAAU;AACRzD,IAAAA,KAAK,oCAA6B2C,QAA7B,EAAL;;AACA,QAAI,CAACW,QAAL,EAAe;AACXG,MAAAA,CAAC,CAACC,OAAF,sCAAwCf,QAAxC,sBAA4Dc,CAAC,CAACC,OAA9D;AACA,YAAMD,CAAN;AACH;AACJ;AACJ;;AAED,SAASG,QAAT,CAAkBjB,QAAlB,EAA4B;AACxB,SAAOxC,EAAE,CAACqD,YAAH,CAAgBb,QAAhB,EAA0B,MAA1B,CAAP;AACH;;AAED,SAASjC,kBAAT,CAA4BiC,QAA5B,EAAsCW,QAAtC,EAAgD;AAC5CtD,EAAAA,KAAK,qCAA8B2C,QAA9B,EAAL,CAD4C,CAG5C;;AACA,MAAMkB,IAAI,GAAG9D,OAAO,CAAC,SAAD,CAApB;;AAEA,MAAI;AACA;AACA,WAAO8D,IAAI,CAACC,QAAL,CAAcF,QAAQ,CAACjB,QAAD,CAAtB,KAAqC,EAA5C;AACH,GAHD,CAGE,OAAOc,CAAP,EAAU;AACRzD,IAAAA,KAAK,oCAA6B2C,QAA7B,EAAL;;AACA,QAAI,CAACW,QAAL,EAAe;AACXG,MAAAA,CAAC,CAACC,OAAF,sCAAwCf,QAAxC,sBAA4Dc,CAAC,CAACC,OAA9D;AACA,YAAMD,CAAN;AACH;AACJ;AACJ","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"}
1
+ {"version":3,"file":"rc-config-loader.js","sourceRoot":"","sources":["../src/rc-config-loader.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,81 +1,76 @@
1
1
  {
2
- "directories": {
3
- "test": "test"
4
- },
5
- "author": "azu",
6
- "license": "MIT",
7
- "files": [
8
- "bin/",
9
- "lib/",
10
- "src/"
11
- ],
12
2
  "name": "rc-config-loader",
13
- "version": "2.0.5",
3
+ "version": "4.1.0",
14
4
  "description": "load config file from .{product}rc.{json,yml,js}",
15
- "main": "lib/rc-config-loader.js",
16
- "scripts": {
17
- "test": "mocha test/",
18
- "build": "cross-env NODE_ENV=production babel src --out-dir lib --copy-files --source-maps",
19
- "watch": "babel src --out-dir lib --watch --source-maps",
20
- "prepublish": "npm run --if-present build",
21
- "prettier": "prettier --write '**/*.{js,jsx,ts,tsx,css}'"
22
- },
23
5
  "keywords": [
24
- "rc",
25
6
  "config",
26
7
  "configuration",
27
- "loader",
28
8
  "json",
9
+ "loader",
10
+ "rc",
29
11
  "yaml",
30
12
  "yml"
31
13
  ],
14
+ "homepage": "https://github.com/azu/rc-config-loader",
15
+ "bugs": {
16
+ "url": "https://github.com/azu/rc-config-loader/issues"
17
+ },
32
18
  "repository": {
33
19
  "type": "git",
34
20
  "url": "https://github.com/azu/rc-config-loader.git"
35
21
  },
36
- "bugs": {
37
- "url": "https://github.com/azu/rc-config-loader/issues"
22
+ "license": "MIT",
23
+ "author": "azu",
24
+ "files": [
25
+ "bin/",
26
+ "lib/",
27
+ "src/"
28
+ ],
29
+ "main": "lib/rc-config-loader.js",
30
+ "types": "lib/rc-config-loader.d.ts",
31
+ "directories": {
32
+ "test": "test"
38
33
  },
39
- "homepage": "https://github.com/azu/rc-config-loader",
40
- "dependencies": {
41
- "debug": "^4.1.1",
42
- "js-yaml": "^3.12.0",
43
- "json5": "^2.1.0",
44
- "object-assign": "^4.1.0",
45
- "object-keys": "^1.0.12",
46
- "path-exists": "^3.0.0",
47
- "require-from-string": "^2.0.2"
34
+ "scripts": {
35
+ "build": "tsc -p .",
36
+ "prettier": "prettier --write '**/*.{js,jsx,ts,tsx,css}'",
37
+ "prepublish": "npm run --if-present build",
38
+ "test": "mocha \"test/**/*.{js,ts}\"",
39
+ "watch": "tsc -p . --watch"
48
40
  },
49
- "devDependencies": {
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"
41
+ "husky": {
42
+ "hooks": {
43
+ "post-commit": "git reset",
44
+ "pre-commit": "lint-staged"
45
+ }
46
+ },
47
+ "lint-staged": {
48
+ "*.{js,jsx,ts,tsx,css}": [
49
+ "prettier --write"
50
+ ]
64
51
  },
65
52
  "prettier": {
66
53
  "printWidth": 120,
67
54
  "tabWidth": 4
68
55
  },
69
- "lint-staged": {
70
- "*.{js,jsx,ts,tsx,css}": [
71
- "prettier --write",
72
- "git add"
73
- ]
56
+ "dependencies": {
57
+ "debug": "^4.1.1",
58
+ "js-yaml": "^4.0.0",
59
+ "json5": "^2.1.2",
60
+ "require-from-string": "^2.0.2"
74
61
  },
75
- "husky": {
76
- "hooks": {
77
- "post-commit": "git reset",
78
- "pre-commit": "lint-staged"
79
- }
62
+ "devDependencies": {
63
+ "@types/json5": "^0.0.30",
64
+ "@types/mocha": "^8.2.0",
65
+ "@types/node": "^14.14.20",
66
+ "@types/require-from-string": "^1.2.0",
67
+ "chai": "^4.2.0",
68
+ "husky": "^4.2.3",
69
+ "lint-staged": "^10.1.1",
70
+ "mocha": "^8.2.1",
71
+ "prettier": "^2.0.2",
72
+ "ts-node": "^9.1.1",
73
+ "ts-node-test-register": "^9.0.1",
74
+ "typescript": "^4.1.3"
80
75
  }
81
76
  }
@@ -0,0 +1,227 @@
1
+ // MIT © 2017 azu
2
+ // MIT © Zoltan Kochan
3
+ // Original https://github.com/zkochan/rcfile
4
+ import path from "path";
5
+ import fs from "fs";
6
+ import requireFromString from "require-from-string";
7
+ import JSON5 from "json5";
8
+
9
+ const debug = require("debug")("rc-config-loader");
10
+ const defaultLoaderByExt = {
11
+ ".cjs": loadJSConfigFile,
12
+ ".js": loadJSConfigFile,
13
+ ".json": loadJSONConfigFile,
14
+ ".yaml": loadYAMLConfigFile,
15
+ ".yml": loadYAMLConfigFile,
16
+ };
17
+
18
+ const defaultOptions = {
19
+ // does look for `package.json`
20
+ packageJSON: false,
21
+ // treat default(no ext file) as some extension
22
+ defaultExtension: [".json", ".yaml", ".yml", ".js", ".cjs"],
23
+ cwd: process.cwd(),
24
+ };
25
+
26
+ export interface rcConfigLoaderOption {
27
+ // does look for `package.json`
28
+ packageJSON?:
29
+ | boolean
30
+ | {
31
+ fieldName: string;
32
+ };
33
+ // if config file name is not same with packageName, set the name
34
+ configFileName?: string;
35
+ // treat default(no ext file) as some extension
36
+ defaultExtension?: string | string[];
37
+ // where start to load
38
+ cwd?: string;
39
+ }
40
+
41
+ type Loader = <R extends object>(fileName: string, suppress: boolean) => R;
42
+
43
+ const selectLoader = (defaultLoaderByExt: { [index: string]: Loader }, extension: string) => {
44
+ if (!defaultOptions.defaultExtension.includes(extension)) {
45
+ throw new Error(`${extension} is not supported.`);
46
+ }
47
+ return defaultLoaderByExt[extension];
48
+ };
49
+
50
+ /**
51
+ * Find and load rcfile, return { config, filePath }
52
+ * If not found any rcfile, throw an Error.
53
+ * @param {string} pkgName
54
+ * @param {rcConfigLoaderOption} [opts]
55
+ * @returns {{ config: Object, filePath:string } | undefined}
56
+ */
57
+ export function rcFile<R extends {}>(
58
+ pkgName: string,
59
+ opts: rcConfigLoaderOption = {}
60
+ ):
61
+ | {
62
+ config: R;
63
+ filePath: string;
64
+ }
65
+ | undefined {
66
+ // path/to/config or basename of config file.
67
+ const configFileName = opts.configFileName || `.${pkgName}rc`;
68
+ const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
69
+ const cwd = opts.cwd || defaultOptions.cwd;
70
+ const packageJSON = opts.packageJSON || defaultOptions.packageJSON;
71
+ const packageJSONFieldName = typeof packageJSON === "object" ? packageJSON.fieldName : pkgName;
72
+
73
+ const parts = splitPath(cwd);
74
+ const loadersByOrder = Array.isArray(defaultExtension)
75
+ ? defaultExtension.map((extension) => selectLoader(defaultLoaderByExt, extension))
76
+ : selectLoader(defaultLoaderByExt, defaultExtension);
77
+
78
+ const loaderByExt = {
79
+ ...defaultLoaderByExt,
80
+ "": loadersByOrder,
81
+ };
82
+ return findConfig<R>({
83
+ parts,
84
+ loaderByExt,
85
+ loadersByOrder,
86
+ configFileName,
87
+ packageJSON,
88
+ packageJSONFieldName,
89
+ });
90
+ }
91
+
92
+ /**
93
+ *
94
+ * @returns {{
95
+ * config: string,
96
+ * filePath: string
97
+ * }}
98
+ */
99
+ function findConfig<R extends {}>({
100
+ parts,
101
+ loaderByExt,
102
+ loadersByOrder,
103
+ configFileName,
104
+ packageJSON,
105
+ packageJSONFieldName,
106
+ }: {
107
+ parts: string[];
108
+ loaderByExt: {
109
+ [index: string]: Loader | Loader[];
110
+ };
111
+ loadersByOrder: Loader | Loader[];
112
+ configFileName: string;
113
+ packageJSON: boolean | { fieldName: string };
114
+ packageJSONFieldName: string;
115
+ }):
116
+ | {
117
+ config: R;
118
+ filePath: string;
119
+ }
120
+ | undefined {
121
+ const extensions = Object.keys(loaderByExt);
122
+ while (extensions.length) {
123
+ const ext = extensions.shift();
124
+ // may be ext is "". if it .<product>rc
125
+ const configLocation = join(parts, configFileName + ext);
126
+ if (!fs.existsSync(configLocation)) {
127
+ continue;
128
+ }
129
+ // if ext === ""(empty string):, use ordered loaders
130
+ const loaders = ext ? loaderByExt[ext] : loadersByOrder;
131
+ if (!Array.isArray(loaders)) {
132
+ const loader = loaders;
133
+ const result = loader<R>(configLocation, false);
134
+ if (!result) {
135
+ continue;
136
+ }
137
+ return {
138
+ config: result,
139
+ filePath: configLocation,
140
+ };
141
+ }
142
+ for (let i = 0; i < loaders.length; i++) {
143
+ const loader = loaders[i];
144
+ const result = loader<R>(configLocation, true);
145
+ if (!result) {
146
+ continue;
147
+ }
148
+ return {
149
+ config: result,
150
+ filePath: configLocation,
151
+ };
152
+ }
153
+ }
154
+
155
+ if (packageJSON) {
156
+ const pkgJSONLoc = join(parts, "package.json");
157
+ if (fs.existsSync(pkgJSONLoc)) {
158
+ const pkgJSON = require(pkgJSONLoc);
159
+ if (pkgJSON[packageJSONFieldName]) {
160
+ return {
161
+ config: pkgJSON[packageJSONFieldName],
162
+ filePath: pkgJSONLoc,
163
+ };
164
+ }
165
+ }
166
+ }
167
+ if (parts.pop()) {
168
+ return findConfig({ parts, loaderByExt, loadersByOrder, configFileName, packageJSON, packageJSONFieldName });
169
+ }
170
+ return;
171
+ }
172
+
173
+ function splitPath(x: string): string[] {
174
+ return path.resolve(x || "").split(path.sep);
175
+ }
176
+
177
+ function join(parts: string[], filename: string) {
178
+ return path.resolve(parts.join(path.sep) + path.sep, filename);
179
+ }
180
+
181
+ function loadJSConfigFile(filePath: string, suppress: boolean) {
182
+ debug(`Loading JavaScript config file: ${filePath}`);
183
+ try {
184
+ const content = fs.readFileSync(filePath, "utf-8");
185
+ return requireFromString(content, filePath);
186
+ } catch (error) {
187
+ debug(`Error reading JavaScript file: ${filePath}`);
188
+ if (!suppress) {
189
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
190
+ throw error;
191
+ }
192
+ }
193
+ }
194
+
195
+ function loadJSONConfigFile(filePath: string, suppress: boolean) {
196
+ debug(`Loading JSON config file: ${filePath}`);
197
+
198
+ try {
199
+ return JSON5.parse(readFile(filePath));
200
+ } catch (error) {
201
+ debug(`Error reading JSON file: ${filePath}`);
202
+ if (!suppress) {
203
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
204
+ throw error;
205
+ }
206
+ }
207
+ }
208
+
209
+ function readFile(filePath: string) {
210
+ return fs.readFileSync(filePath, "utf8");
211
+ }
212
+
213
+ function loadYAMLConfigFile(filePath: string, suppress: boolean) {
214
+ debug(`Loading YAML config file: ${filePath}`);
215
+ // lazy load YAML to improve performance when not used
216
+ const yaml = require("js-yaml");
217
+ try {
218
+ // empty YAML file can be null, so always use
219
+ return yaml.load(readFile(filePath)) || {};
220
+ } catch (error) {
221
+ debug(`Error reading YAML file: ${filePath}`);
222
+ if (!suppress) {
223
+ error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`;
224
+ throw error;
225
+ }
226
+ }
227
+ }
@@ -1,15 +0,0 @@
1
- export interface rcConfigLoaderOption {
2
- // does look for `package.json`
3
- packageJSON?:
4
- | boolean
5
- | {
6
- fieldName: string;
7
- };
8
- // if config file name is not same with packageName, set the name
9
- configFileName?: string;
10
- // treat default(no ext file) as some extension
11
- defaultExtension?: string | string[];
12
- // where start to load
13
- cwd?: string;
14
- }
15
- export default function rcConfigLoader(packageName: string, options?: rcConfigLoaderOption): Object;
@@ -1,174 +0,0 @@
1
- // MIT © 2017 azu
2
- // MIT © Zoltan Kochan
3
- // Original https://github.com/zkochan/rcfile
4
- "use strict";
5
- const path = require("path");
6
- const debug = require("debug")("rc-config-loader");
7
- const requireFromString = require("require-from-string");
8
- const JSON5 = require("json5");
9
- const fs = require("fs");
10
- const pathExists = require("path-exists");
11
- const objectAssign = require("object-assign");
12
- const keys = require("object-keys");
13
-
14
- const defaultLoaderByExt = {
15
- ".js": loadJSConfigFile,
16
- ".json": loadJSONConfigFile,
17
- ".yaml": loadYAMLConfigFile,
18
- ".yml": loadYAMLConfigFile
19
- };
20
-
21
- const defaultOptions = {
22
- // does look for `package.json`
23
- packageJSON: false,
24
- // treat default(no ext file) as some extension
25
- defaultExtension: [".json", ".yaml", ".yml", ".js"],
26
- cwd: process.cwd()
27
- };
28
-
29
- /**
30
- * @param {string} pkgName
31
- * @param {rcConfigLoaderOption} [opts]
32
- * @returns {{ config: Object, filePath:string } | undefined}
33
- */
34
- module.exports = function rcConfigLoader(pkgName, opts = {}) {
35
- // path/to/config or basename of config file.
36
- const configFileName = opts.configFileName || `.${pkgName}rc`;
37
- const defaultExtension = opts.defaultExtension || defaultOptions.defaultExtension;
38
- const cwd = opts.cwd || defaultOptions.cwd;
39
- const packageJSON = opts.packageJSON || defaultOptions.packageJSON;
40
- const packageJSONFieldName = typeof packageJSON === "object" ? packageJSON.fieldName : pkgName;
41
-
42
- const parts = splitPath(cwd);
43
-
44
- const loaders = Array.isArray(defaultExtension)
45
- ? defaultExtension.map(extension => defaultLoaderByExt[extension])
46
- : defaultLoaderByExt[defaultExtension];
47
-
48
- const loaderByExt = objectAssign({}, defaultLoaderByExt, {
49
- "": loaders
50
- });
51
-
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) {
80
- continue;
81
- }
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;
92
- }
93
- return {
94
- config: result,
95
- filePath: configLocation
96
- };
97
- }
98
- }
99
-
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
- };
109
- }
110
- }
111
- }
112
- if (parts.pop()) {
113
- return findConfig({ parts, loaderByExt, configFileName, packageJSON, packageJSONFieldName });
114
- }
115
- return undefined;
116
- }
117
-
118
- function splitPath(x) {
119
- return path.resolve(x || "").split(path.sep);
120
- }
121
-
122
- function join(parts, filename) {
123
- return path.resolve(parts.join(path.sep) + path.sep, filename);
124
- }
125
-
126
- function loadJSConfigFile(filePath, suppress) {
127
- debug(`Loading JavaScript config file: ${filePath}`);
128
- try {
129
- const content = fs.readFileSync(filePath, "utf-8");
130
- return requireFromString(content, filePath);
131
- } catch (e) {
132
- debug(`Error reading JavaScript file: ${filePath}`);
133
- if (!suppress) {
134
- e.message = `Cannot read config file: ${filePath}\nError: ${e.message}`;
135
- throw e;
136
- }
137
- }
138
- }
139
-
140
- function loadJSONConfigFile(filePath, suppress) {
141
- debug(`Loading JSON config file: ${filePath}`);
142
-
143
- try {
144
- return JSON5.parse(readFile(filePath));
145
- } catch (e) {
146
- debug(`Error reading JSON file: ${filePath}`);
147
- if (!suppress) {
148
- e.message = `Cannot read config file: ${filePath}\nError: ${e.message}`;
149
- throw e;
150
- }
151
- }
152
- }
153
-
154
- function readFile(filePath) {
155
- return fs.readFileSync(filePath, "utf8");
156
- }
157
-
158
- function loadYAMLConfigFile(filePath, suppress) {
159
- debug(`Loading YAML config file: ${filePath}`);
160
-
161
- // lazy load YAML to improve performance when not used
162
- const yaml = require("js-yaml");
163
-
164
- try {
165
- // empty YAML file can be null, so always use
166
- return yaml.safeLoad(readFile(filePath)) || {};
167
- } catch (e) {
168
- debug(`Error reading YAML file: ${filePath}`);
169
- if (!suppress) {
170
- e.message = `Cannot read config file: ${filePath}\nError: ${e.message}`;
171
- throw e;
172
- }
173
- }
174
- }