hexo/node_modules/utility/json.js

88 lines
1.8 KiB
JavaScript

'use strict';
var path = require('path');
var _mkdirp;
function getMkdirp() {
if (!_mkdirp) {
_mkdirp = require('mkdirp');
}
return _mkdirp;
}
var _fs;
function getFS() {
if (!_fs) {
_fs = require('mz/fs');
}
return _fs;
}
exports.strictJSONParse = function (str) {
var obj = JSON.parse(str);
if (!obj || typeof obj !== 'object') {
throw new Error('JSON string is not object');
}
return obj;
};
exports.readJSONSync = function(filepath) {
if (!getFS().existsSync(filepath)) {
throw new Error(filepath + ' is not found');
}
return JSON.parse(getFS().readFileSync(filepath));
};
exports.writeJSONSync = function(filepath, str, options) {
options = options || {};
if (!('space' in options)) {
options.space = 2;
}
getMkdirp().sync(path.dirname(filepath));
if (typeof str === 'object') {
str = JSON.stringify(str, options.replacer, options.space) + '\n';
}
getFS().writeFileSync(filepath, str);
};
exports.readJSON = function(filepath) {
return getFS().exists(filepath)
.then(function(exists) {
if (!exists) {
throw new Error(filepath + ' is not found');
}
return getFS().readFile(filepath);
})
.then(function(buf) {
return JSON.parse(buf);
});
};
exports.writeJSON = function(filepath, str, options) {
options = options || {};
if (!('space' in options)) {
options.space = 2;
}
if (typeof str === 'object') {
str = JSON.stringify(str, options.replacer, options.space) + '\n';
}
return mkdir(path.dirname(filepath))
.then(function() {
return getFS().writeFile(filepath, str);
});
};
function mkdir(dir) {
return new Promise(function(resolve, reject) {
getMkdirp()(dir, function(err) {
if (err) {
return reject(err);
}
resolve();
});
});
}