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