'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(); }); }); }