| '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 |
| } |
| } |