Blame view

node_modules/jsonfile/index.js 3.06 KB
2a09d1a4   liuqimichale   添加宜春 天水 宣化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
  var _fs
  try {
    _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
    // DO NOT USE 'passParsingErrors' THE NAME WILL CHANGE!!!, use 'throws' instead
    if ('passParsingErrors' in options) {
      shouldThrow = options.passParsingErrors
    } else 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
    // DO NOT USE 'passParsingErrors' THE NAME WILL CHANGE!!!, use 'throws' instead
    if ('passParsingErrors' in options) {
      shouldThrow = options.passParsingErrors
    } else if ('throws' in options) {
      shouldThrow = options.throws
    }
  
    var content = fs.readFileSync(file, options)
    content = stripBom(content)
  
    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 = {}
    }
    options = options || {}
    var fs = options.fs || _fs
  
    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 fs = options.fs || _fs
  
    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)
  }
  
  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 = {
    spaces: null,
    readFile: readFile,
    readFileSync: readFileSync,
    writeFile: writeFile,
    writeFileSync: writeFileSync
  }
  
  module.exports = jsonfile