36e061c4bd
Fixed `Provider.save()` to properly ignore stores which do not provide a saveSync method. Also, fixed `save()` to properly save asynchronously when an async `save()` method on a store is provided. Removed the tests from `nconf-test.js` which expected `save()` to throw or return an error when a store without `save()` methods was encountered. Also removed a `console.log` from `provider-test.js`.
111 lines
2.6 KiB
JavaScript
111 lines
2.6 KiB
JavaScript
/*
|
|
* utils.js: Utility functions for the nconf module.
|
|
*
|
|
* (C) 2011, Nodejitsu Inc.
|
|
*
|
|
*/
|
|
|
|
var fs = require('fs'),
|
|
async = require('async'),
|
|
formats = require('./formats'),
|
|
Memory = require('./stores/memory').Memory;
|
|
|
|
var common = exports;
|
|
|
|
//
|
|
// ### function path (key)
|
|
// #### @key {string} The ':' delimited key to split
|
|
// Returns a fully-qualified path to a nested nconf key.
|
|
//
|
|
common.path = function (key) {
|
|
return key.split(':');
|
|
};
|
|
|
|
//
|
|
// ### function key (arguments)
|
|
// Returns a `:` joined string from the `arguments`.
|
|
//
|
|
common.key = function () {
|
|
return Array.prototype.slice.call(arguments).join(':');
|
|
};
|
|
|
|
//
|
|
// ### function loadFiles (files, callback)
|
|
// #### @files {Object|Array} List of files (or settings object) to load.
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
// Loads all the data in the specified `files`.
|
|
//
|
|
common.loadFiles = function (files, callback) {
|
|
if (!files) {
|
|
return callback(null, {});
|
|
}
|
|
|
|
var options = Array.isArray(files) ? { files: files } : files;
|
|
|
|
//
|
|
// Set the default JSON format if not already
|
|
// specified
|
|
//
|
|
options.format = options.format || formats.json;
|
|
|
|
function parseFile (file, next) {
|
|
fs.readFile(file, function (err, data) {
|
|
return !err
|
|
? next(null, options.format.parse(data.toString()))
|
|
: next(err);
|
|
});
|
|
}
|
|
|
|
async.map(files, parseFile, function (err, objs) {
|
|
return err ? callback(err) : callback(null, common.merge(objs));
|
|
});
|
|
};
|
|
|
|
//
|
|
// ### function loadFilesSync (files)
|
|
// #### @files {Object|Array} List of files (or settings object) to load.
|
|
// Loads all the data in the specified `files` synchronously.
|
|
//
|
|
common.loadFilesSync = function (files) {
|
|
if (!files) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Set the default JSON format if not already
|
|
// specified
|
|
//
|
|
var options = Array.isArray(files) ? { files: files } : files;
|
|
options.format = options.format || formats.json;
|
|
|
|
return common.merge(files.map(function (file) {
|
|
return options.format.parse(fs.readFileSync(file, 'utf8'));
|
|
}));
|
|
};
|
|
|
|
//
|
|
// ### function merge (objs)
|
|
// #### @objs {Array} Array of object literals to merge
|
|
// Merges the specified `objs` using a temporary instance
|
|
// of `stores.Memory`.
|
|
//
|
|
common.merge = function (objs) {
|
|
var store = new Memory();
|
|
|
|
objs.forEach(function (obj) {
|
|
Object.keys(obj).forEach(function (key) {
|
|
store.merge(key, obj[key]);
|
|
});
|
|
});
|
|
|
|
return store.store;
|
|
};
|
|
|
|
//
|
|
// ### function capitalize (str)
|
|
// #### @str {string} String to capitalize
|
|
// Capitalizes the specified `str`.
|
|
//
|
|
common.capitalize = function (str) {
|
|
return str && str[0].toUpperCase() + str.slice(1);
|
|
};
|