139 lines
2.3 KiB
JavaScript
Raw Normal View History

2015-10-01 00:30:16 +02:00
'use strict';
/**
* Module dependencies
*/
// Node.js core.
const fs = require('fs');
// Public node modules.
const _ = require('lodash');
/**
* `parseJSONFile()`
*
* Read a json file at the specified path.
* If an error occurs, call cb(err), and dont throw!
*
* @api private
*/
exports.parseJSONFile = (path, cb) => {
2015-10-01 00:30:16 +02:00
if (!cb) {
throw new Error('Callback required!');
}
if (cb === 'sync') {
let jsonString;
try {
jsonString = fs.readFileSync(path, 'utf-8');
} catch (e) {
return false;
}
return andThen(jsonString);
}
fs.readFile(path, 'utf-8', (err, file) => {
2015-10-01 00:30:16 +02:00
if (err) {
return cb(err);
}
andThen(file);
});
// Attempt to parse JSON, then return.
function andThen(json) {
let err;
try {
json = JSON.parse(json);
} catch (e) {
err = e;
json = false;
}
// Parse failed.
if (err) {
if (cb === 'sync') {
return false;
}
return cb(err);
}
// Success.
if (cb === 'sync') {
return json;
}
return cb(null, json);
}
};
/**
* `getJSONFileSync()`
*
* Synchronous version of `getJSONFile()`.
* Returns false if json file cannot be read or parsed.
*
* @api private
*/
exports.parseJSONFileSync = path => {
2015-10-01 00:30:16 +02:00
return exports.parseJSONFile(path, 'sync');
};
/**
* `getPackage()`
*
* Read `package.json` file in the directory at the specified
* path. If an error occurs, call `cb(err)`, and dont throw!
*
* @api private
*/
exports.getPackage = (path, cb) => {
2016-03-18 11:12:50 +01:00
path = _.trimEnd(path, '/');
2015-10-01 00:30:16 +02:00
path += '/package.json';
exports.parseJSONFile(path, (err, json) => {
2015-10-01 00:30:16 +02:00
if (err) {
return cb(err);
}
// Success: ensure dependencies are at least an empty object
json.dependencies = json.dependencies || {};
if (cb === 'sync') {
return json;
}
return cb(null, json);
});
};
/**
* `getPackageSync()`
*
* Synchronous version of `getPackage()`
* Returns `false` if `package.json` cannot be read or parsed.
*
* @api private
*/
exports.getPackageSync = path => {
2016-03-18 11:12:50 +01:00
path = _.trimEnd(path, '/');
2015-10-01 00:30:16 +02:00
path += '/package.json';
// Success: ensure dependencies are at least an empty object.
const json = exports.parseJSONFileSync(path, 'sync');
if (!json) {
return json;
}
json.dependencies = json.dependencies || {};
return json;
};