read-conf
Version:
reads a config file
89 lines (86 loc) • 2.57 kB
JavaScript
var importCwd;
importCwd = null;
module.exports = ({read, position}) => {
read.hookIn(position.init, async(noop, o) => {
var conf, ext, exts, files, folder, folders, i, j, len, len1, pathExists, readdir, resolve, tmp;
({resolve} = o.path);
if (o.filename == null) {
if (o.name == null) {
if (o.required !== false) {
throw new Error("read-conf: no name or filename for config was given");
}
}
({readdir, pathExists} = o.fs);
folders = o.folders || [process.cwd()];
if (!Array.isArray(folders)) {
folders = [folders];
}
exts = o.extensions || ["js", "coffee", "ts", "json"];
for (i = 0, len = folders.length; i < len; i++) {
folder = folders[i];
folder = resolve(folder);
if ((await pathExists(folder))) {
files = (await readdir(folder));
for (j = 0, len1 = exts.length; j < len1; j++) {
ext = exts[j];
if (~files.indexOf(tmp = `${o.name}.${ext}`)) {
conf = tmp;
break;
}
}
if (conf) {
break;
}
}
}
if (conf) {
return o.filename = resolve(folder, conf);
}
} else {
return o.filename = resolve(o.filename);
}
});
read.hookIn(position.before, (noop, o) => {
var stat;
if (o.filename != null) {
({stat} = o.fs);
return stat(o.filename).then((stats) => {
return o.mtime = stats.mtimeMs;
}).catch(() => {
if (o.name == null) {
o.name = o.filename;
}
return o.filename = null;
}).then(() => {
if (o.filename && (importCwd == null)) {
importCwd = require("import-cwd");
importCwd.silent("coffee-script/register");
importCwd.silent("coffeescript/register");
importCwd.silent("ts-node/register");
return importCwd.silent("babel-register");
}
});
}
});
return read.hookIn((noop, o) => {
var conf, e;
if (o.filename != null) {
try {
conf = require(o.filename);
} catch (error) {
e = error;
if (e.code === "MODULE_NOT_FOUND") {
if (o.required !== false) {
throw new Error(`read-conf: couldn't require '${confPath}'`);
}
} else {
throw e;
}
}
} else if (o.required !== false) {
throw new Error(`read-conf: no file '${o.name}' found`);
}
o.raw = conf || {};
return o.hash = o.util.hash(o.raw);
});
};