| 'use strict' | |
| module.exports = parseJson | |
| function parseJson (txt, reviver, context) { | |
| context = context || 20 | |
| try { | |
| return JSON.parse(txt, reviver) | |
| } catch (e) { | |
| if (typeof txt !== 'string') { | |
| const isEmptyArray = Array.isArray(txt) && txt.length === 0 | |
| const errorMessage = 'Cannot parse ' + | |
| (isEmptyArray ? 'an empty array' : String(txt)) | |
| throw new TypeError(errorMessage) | |
| } | |
| const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i) | |
| const errIdx = syntaxErr | |
| ? +syntaxErr[1] | |
| : e.message.match(/^Unexpected end of JSON.*/i) | |
| ? txt.length - 1 | |
| : null | |
| if (errIdx != null) { | |
| const start = errIdx <= context | |
| ? 0 | |
| : errIdx - context | |
| const end = errIdx + context >= txt.length | |
| ? txt.length | |
| : errIdx + context | |
| e.message += ` while parsing near '${ | |
| start === 0 ? '' : '...' | |
| }${txt.slice(start, end)}${ | |
| end === txt.length ? '' : '...' | |
| }'` | |
| } else { | |
| e.message += ` while parsing '${txt.slice(0, context * 2)}'` | |
| } | |
| throw e | |
| } | |
| } |