| 'use strict'; | 
| const errorEx = require('error-ex'); | 
| const fallback = require('json-parse-better-errors'); | 
|   | 
| const JSONError = errorEx('JSONError', { | 
|     fileName: errorEx.append('in %s') | 
| }); | 
|   | 
| module.exports = (input, reviver, filename) => { | 
|     if (typeof reviver === 'string') { | 
|         filename = reviver; | 
|         reviver = null; | 
|     } | 
|   | 
|     try { | 
|         try { | 
|             return JSON.parse(input, reviver); | 
|         } catch (err) { | 
|             fallback(input, reviver); | 
|   | 
|             throw err; | 
|         } | 
|     } catch (err) { | 
|         err.message = err.message.replace(/\n/g, ''); | 
|   | 
|         const jsonErr = new JSONError(err); | 
|         if (filename) { | 
|             jsonErr.fileName = filename; | 
|         } | 
|   | 
|         throw jsonErr; | 
|     } | 
| }; |