-
Notifications
You must be signed in to change notification settings - Fork 339
/
Copy pathindex.js
137 lines (112 loc) · 2.86 KB
/
index.js
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
134
135
136
137
let _fs
try {
_fs = require('graceful-fs')
} catch (_) {
_fs = require('fs')
}
const universalify = require('universalify')
function readFileWithCallback (file, options, callback) {
if (callback == null) {
callback = options
options = {}
}
if (typeof options === 'string') {
options = { encoding: options }
}
options = options || {}
const fs = options.fs || _fs
let shouldThrow = true
if ('throws' in options) {
shouldThrow = options.throws
}
fs.readFile(file, options, (err, data) => {
if (err) return callback(err)
data = stripBom(data)
let 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)
})
}
const readFile = universalify.fromCallback(readFileWithCallback)
function readFileSync (file, options) {
options = options || {}
if (typeof options === 'string') {
options = { encoding: options }
}
const fs = options.fs || _fs
let shouldThrow = true
if ('throws' in options) {
shouldThrow = options.throws
}
try {
let 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) {
let spaces
let EOL = '\n'
if (typeof options === 'object' && options !== null) {
if (options.spaces) {
spaces = options.spaces
}
if (options.EOL) {
EOL = options.EOL
}
}
const str = JSON.stringify(obj, options ? options.replacer : null, spaces)
return str.replace(/\n/g, EOL) + EOL
}
function writeFileWithCallback (file, obj, options, callback) {
if (callback == null) {
callback = options
options = {}
}
options = options || {}
const fs = options.fs || _fs
let str = ''
try {
str = stringify(obj, options)
} catch (err) {
return callback(err, null)
}
fs.writeFile(file, str, options, callback)
}
const writeFile = universalify.fromCallback(writeFileWithCallback)
function writeFileSync (file, obj, options) {
options = options || {}
const fs = options.fs || _fs
const 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
}
const jsonfile = {
readFile,
readFileSync,
writeFile,
writeFileSync
}
module.exports = jsonfile