var fs = require('fs') function readFile (file, options, callback) { if (callback == null) { callback = options options = {} } fs.readFile(file, options, function (err, data) { if (err) return callback(err) var obj try { obj = JSON.parse(data, options ? options.reviver : null) } catch (err2) { err2.message = file + ': ' + err2.message return callback(err2) } callback(null, obj) }) } function readFileSync (file, options) { options = options || {} if (typeof options === 'string') { options = {encoding: options} } var shouldThrow = 'throws' in options ? options.throws : true var content = fs.readFileSync(file, options) try { return JSON.parse(content, options.reviver) } catch (err) { if (shouldThrow) { err.message = file + ': ' + err.message throw err } else { return null } } } function writeFile (file, obj, options, callback) { if (callback == null) { callback = options options = {} } var spaces = typeof options === 'object' && options !== null ? 'spaces' in options ? options.spaces : this.spaces : this.spaces var str = '' try { str = JSON.stringify(obj, options ? options.replacer : null, spaces) + '\n' } catch (err) { if (callback) return callback(err, null) } fs.writeFile(file, str, options, callback) } function writeFileSync (file, obj, options) { options = options || {} var spaces = typeof options === 'object' && options !== null ? 'spaces' in options ? options.spaces : this.spaces : this.spaces var str = JSON.stringify(obj, options.replacer, spaces) + '\n' // not sure if fs.writeFileSync returns anything, but just in case return fs.writeFileSync(file, str, options) } var jsonfile = { spaces: null, readFile: readFile, readFileSync: readFileSync, writeFile: writeFile, writeFileSync: writeFileSync } module.exports = jsonfile