79 lines
2.4 KiB
JavaScript
79 lines
2.4 KiB
JavaScript
/**!
|
|
* Originally written by:
|
|
* https://github.com/sindresorhus/parse-json
|
|
*/
|
|
var fallback = require('../vendor/parse'),
|
|
bomb = require('./bomb'),
|
|
FALLBACK_MODE = 'json',
|
|
ERROR_NAME = 'JSONError',
|
|
|
|
parse; // fn
|
|
|
|
/**
|
|
* Accept a string as JSON and return an object.
|
|
* @private
|
|
*
|
|
* @param {String} str The input stringified JSON object to be parsed.
|
|
* @param {Function=} [reviver] A customizer function to be used within the fallback (BOM friendly) JSON parser.
|
|
* @param {Boolean=} [strict] Set to true to treat the occurrence of BOM as a fatal error.
|
|
*
|
|
* @returns {Object} The parsed JSON object constructed from str
|
|
* @throws {SyntaxError} If `str` is not a valid JSON
|
|
* @throws {SyntaxError} In `strict` mode if `str` contains BOM
|
|
*/
|
|
parse = function (str, reviver, strict) {
|
|
var bomMarkerIndex = bomb.indexOfBOM(str);
|
|
|
|
if (bomMarkerIndex) {
|
|
if (strict) {
|
|
throw SyntaxError('Unexpected byte order mark found in first ' + bomMarkerIndex + ' character(s)');
|
|
}
|
|
// clean up BOM if not strict
|
|
str = str.slice(bomMarkerIndex);
|
|
}
|
|
|
|
try { // first try and use normal JSON.parse as this is faster
|
|
return JSON.parse(str, reviver);
|
|
}
|
|
catch (err) { // if JSON.parse fails, we try using a more verbose parser
|
|
fallback.parse(str, {
|
|
mode: FALLBACK_MODE,
|
|
reviver: reviver
|
|
});
|
|
|
|
// if there was an error in this catch block, `fallback.parse` should raise same error. hence this `throw`
|
|
// will never get executed. if it does not, we still throw original error.
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
module.exports = {
|
|
parse: function (str, reviver, relaxed) {
|
|
if ((typeof reviver === 'boolean') && (relaxed === null)) {
|
|
relaxed = reviver;
|
|
reviver = null;
|
|
}
|
|
|
|
try {
|
|
return parse(str, reviver, relaxed);
|
|
}
|
|
// we do this simply to set the error name and as such making it more identifiable
|
|
catch (err) {
|
|
err.name = ERROR_NAME;
|
|
throw err;
|
|
}
|
|
},
|
|
|
|
stringify: function () {
|
|
try {
|
|
// eslint-disable-next-line prefer-spread
|
|
return JSON.stringify.apply(JSON, arguments);
|
|
}
|
|
// we do this simply to set the error name and as such making it more identifiable
|
|
catch (err) {
|
|
err.name = ERROR_NAME;
|
|
throw err;
|
|
}
|
|
}
|
|
};
|