You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.7 KiB
104 lines
2.7 KiB
'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) |
|
} |
|
|
|
|
|
|