92 lines
2.7 KiB
JavaScript
92 lines
2.7 KiB
JavaScript
'use strict';
|
|
var fs = require('fs');
|
|
var ini = require('ini');
|
|
var path = require('path');
|
|
var stripJsonComments = require('strip-json-comments');
|
|
|
|
var parse = (exports.parse = function (content) {
|
|
//if it ends in .json or starts with { then it must be json.
|
|
//must be done this way, because ini accepts everything.
|
|
//can't just try and parse it and let it throw if it's not ini.
|
|
//everything is ini. even json with a syntax error.
|
|
|
|
if (/^\s*{/.test(content)) return JSON.parse(stripJsonComments(content));
|
|
return ini.parse(content);
|
|
});
|
|
|
|
var file = (exports.file = function () {
|
|
var args = [].slice.call(arguments).filter(function (arg) {
|
|
return arg != null;
|
|
});
|
|
|
|
//path.join breaks if it's a not a string, so just skip this.
|
|
for (var i in args) if ('string' !== typeof args[i]) return;
|
|
|
|
var file = path.join.apply(null, args);
|
|
var content;
|
|
try {
|
|
return fs.readFileSync(file, 'utf-8');
|
|
} catch (err) {
|
|
return;
|
|
}
|
|
});
|
|
|
|
var json = (exports.json = function () {
|
|
var content = file.apply(null, arguments);
|
|
return content ? parse(content) : null;
|
|
});
|
|
|
|
var env = (exports.env = function (prefix, env) {
|
|
env = env || process.env;
|
|
var obj = {};
|
|
var l = prefix.length;
|
|
for (var k in env) {
|
|
if (k.toLowerCase().indexOf(prefix.toLowerCase()) === 0) {
|
|
var keypath = k.substring(l).split('__');
|
|
|
|
// Trim empty strings from keypath array
|
|
var _emptyStringIndex;
|
|
while ((_emptyStringIndex = keypath.indexOf('')) > -1) {
|
|
keypath.splice(_emptyStringIndex, 1);
|
|
}
|
|
|
|
var cursor = obj;
|
|
keypath.forEach(function _buildSubObj(_subkey, i) {
|
|
// (check for _subkey first so we ignore empty strings)
|
|
// (check for cursor to avoid assignment to primitive objects)
|
|
if (!_subkey || typeof cursor !== 'object') return;
|
|
|
|
// If this is the last key, just stuff the value in there
|
|
// Assigns actual value from env variable to final key
|
|
// (unless it's just an empty string- in that case use the last valid key)
|
|
if (i === keypath.length - 1) cursor[_subkey] = env[k];
|
|
|
|
// Build sub-object if nothing already exists at the keypath
|
|
if (cursor[_subkey] === undefined) cursor[_subkey] = {};
|
|
|
|
// Increment cursor used to track the object at the current depth
|
|
cursor = cursor[_subkey];
|
|
});
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
});
|
|
|
|
var find = (exports.find = function () {
|
|
var rel = path.join.apply(null, [].slice.call(arguments));
|
|
|
|
function find(start, rel) {
|
|
var file = path.join(start, rel);
|
|
try {
|
|
fs.statSync(file);
|
|
return file;
|
|
} catch (err) {
|
|
if (path.dirname(start) !== start)
|
|
// root
|
|
return find(path.dirname(start), rel);
|
|
}
|
|
}
|
|
return find(process.cwd(), rel);
|
|
});
|