c43685160d
[refactor]: Using path module to determine if file exists instead of throwing error [api]: File.load and File.loadSync will now automatically create the requested JSON file path if no file is found.
145 lines
No EOL
3.5 KiB
JavaScript
145 lines
No EOL
3.5 KiB
JavaScript
/*
|
|
* file.js: Simple file storage engine for nconf files
|
|
*
|
|
* (C) 2011, Charlie Robbins
|
|
*
|
|
*/
|
|
|
|
var fs = require('fs'),
|
|
path = require('path'),
|
|
util = require('util'),
|
|
Memory = require('./memory').Memory;
|
|
|
|
//
|
|
// ### function File (options)
|
|
// #### @options {Object} Options for this instance
|
|
// Constructor function for the File nconf store, a simple abstraction
|
|
// around the Memory store that can persist configuration to disk.
|
|
//
|
|
var File = exports.File = function (options) {
|
|
if (!options.file) {
|
|
throw new Error ('Missing required option `files`');
|
|
}
|
|
|
|
Memory.call(this, options);
|
|
|
|
this.type = 'file';
|
|
this.file = options.file;
|
|
this.format = options.format || {
|
|
stringify: function (obj) {
|
|
return JSON.stringify(obj, null, 2)
|
|
},
|
|
parse: JSON.parse
|
|
};
|
|
};
|
|
|
|
// Inherit from the Memory store
|
|
util.inherits(File, Memory);
|
|
|
|
//
|
|
// ### function save (value, callback)
|
|
// #### @value {Object} _Ignored_ Left here for consistency
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
// Saves the current configuration object to disk at `this.file`
|
|
// using the format specified by `this.format`.
|
|
//
|
|
File.prototype.save = function (value, callback) {
|
|
if (!callback) {
|
|
callback = value;
|
|
value = null;
|
|
}
|
|
|
|
fs.writeFile(this.file, this.format.stringify(this.store), function (err) {
|
|
return err ? callback(err) : callback();
|
|
});
|
|
};
|
|
|
|
//
|
|
// ### function saveSync (value, callback)
|
|
// #### @value {Object} _Ignored_ Left here for consistency
|
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
// Saves the current configuration object to disk at `this.file`
|
|
// using the format specified by `this.format` synchronously.
|
|
//
|
|
File.prototype.saveSync = function (value) {
|
|
|
|
try {
|
|
fs.writeFileSync(this.file, this.format.stringify(this.store));
|
|
}
|
|
catch (ex) {
|
|
throw(ex);
|
|
}
|
|
|
|
};
|
|
|
|
//
|
|
// ### function load (callback)
|
|
// #### @callback {function} Continuation to respond to when complete.
|
|
// Responds with an Object representing all keys associated in this instance.
|
|
//
|
|
File.prototype.load = function (callback) {
|
|
var self = this;
|
|
|
|
path.exists(self.file, function(exists){
|
|
|
|
if (!exists) {
|
|
|
|
// If the path we are attempting to load doesn't exist, create it
|
|
self.save({}, function(err){
|
|
self.store = {};
|
|
return callback(err, self.store);
|
|
});
|
|
|
|
}
|
|
else {
|
|
|
|
// Else, the path exists, read it from disk
|
|
fs.readFile(self.file, function (err, data) {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
try {
|
|
self.store = self.format.parse(data.toString());
|
|
}
|
|
catch (ex) {
|
|
return callback(new Error("Error parsing your JSON configuration file."));
|
|
}
|
|
callback(null, self.store);
|
|
});
|
|
|
|
}
|
|
});
|
|
|
|
};
|
|
|
|
//
|
|
// ### function load (callback)
|
|
// #### @callback {function} **Optional** Continuation to respond to when complete.
|
|
// Attempts to load the data stored in `this.file` synchronously and responds appropriately.
|
|
//
|
|
File.prototype.loadSync = function () {
|
|
var data, self = this;
|
|
|
|
if (!path.existsSync(self.file)) {
|
|
|
|
// If the path we are attempting to load doesn't exist, create it
|
|
self.saveSync({});
|
|
self.store = {};
|
|
data = {};
|
|
|
|
}
|
|
else {
|
|
|
|
// Else, the path exists, read it from disk
|
|
try {
|
|
data = fs.readFileSync(this.file, 'utf8');
|
|
this.store = this.format.parse(data);
|
|
}
|
|
catch (ex) {
|
|
throw new Error("Error parsing your JSON configuration file.")
|
|
}
|
|
|
|
}
|
|
|
|
return data;
|
|
}; |