| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 | var _fstry {  _fs = require('graceful-fs')} catch (_) {  _fs = require('fs')}function readFile (file, options, callback) {  if (callback == null) {    callback = options    options = {}  }  if (typeof options === 'string') {    options = {encoding: options}  }  options = options || {}  var fs = options.fs || _fs  var shouldThrow = true  if ('throws' in options) {    shouldThrow = options.throws  }  fs.readFile(file, options, function (err, data) {    if (err) return callback(err)    data = stripBom(data)    var obj    try {      obj = JSON.parse(data, options ? options.reviver : null)    } catch (err2) {      if (shouldThrow) {        err2.message = file + ': ' + err2.message        return callback(err2)      } else {        return callback(null, null)      }    }    callback(null, obj)  })}function readFileSync (file, options) {  options = options || {}  if (typeof options === 'string') {    options = {encoding: options}  }  var fs = options.fs || _fs  var shouldThrow = true  if ('throws' in options) {    shouldThrow = options.throws  }  try {    var content = fs.readFileSync(file, options)    content = stripBom(content)    return JSON.parse(content, options.reviver)  } catch (err) {    if (shouldThrow) {      err.message = file + ': ' + err.message      throw err    } else {      return null    }  }}function stringify (obj, options) {  var spaces  var EOL = '\n'  if (typeof options === 'object' && options !== null) {    if (options.spaces) {      spaces = options.spaces    }    if (options.EOL) {      EOL = options.EOL    }  }  var str = JSON.stringify(obj, options ? options.replacer : null, spaces)  return str.replace(/\n/g, EOL) + EOL}function writeFile (file, obj, options, callback) {  if (callback == null) {    callback = options    options = {}  }  options = options || {}  var fs = options.fs || _fs  var str = ''  try {    str = stringify(obj, options)  } catch (err) {    // Need to return whether a callback was passed or not    if (callback) callback(err, null)    return  }  fs.writeFile(file, str, options, callback)}function writeFileSync (file, obj, options) {  options = options || {}  var fs = options.fs || _fs  var str = stringify(obj, options)  // not sure if fs.writeFileSync returns anything, but just in case  return fs.writeFileSync(file, str, options)}function stripBom (content) {  // we do this because JSON.parse would convert it to a utf8 string if encoding wasn't specified  if (Buffer.isBuffer(content)) content = content.toString('utf8')  content = content.replace(/^\uFEFF/, '')  return content}var jsonfile = {  readFile: readFile,  readFileSync: readFileSync,  writeFile: writeFile,  writeFileSync: writeFileSync}module.exports = jsonfile
 |