|  | 'use strict'; | 
|  | var errorEx = require('error-ex'); | 
|  | var fallback = require('./vendor/parse'); | 
|  |  | 
|  | var JSONError = errorEx('JSONError', { | 
|  | fileName: errorEx.append('in %s') | 
|  | }); | 
|  |  | 
|  | module.exports = function (x, reviver, filename) { | 
|  | if (typeof reviver === 'string') { | 
|  | filename = reviver; | 
|  | reviver = null; | 
|  | } | 
|  |  | 
|  | try { | 
|  | try { | 
|  | return JSON.parse(x, reviver); | 
|  | } catch (err) { | 
|  | fallback.parse(x, { | 
|  | mode: 'json', | 
|  | reviver: reviver | 
|  | }); | 
|  |  | 
|  | throw err; | 
|  | } | 
|  | } catch (err) { | 
|  | var jsonErr = new JSONError(err); | 
|  |  | 
|  | if (filename) { | 
|  | jsonErr.fileName = filename; | 
|  | } | 
|  |  | 
|  | throw jsonErr; | 
|  | } | 
|  | }; |